概念
当输入的图片尺寸较大时,深度神经网络将不再适用。卷积神经网络从而出现,可用于解决计算机视觉问题。卷积运算是卷积神经网络的重要部分,一个应用是图像边缘检测。Padding和步长是卷积运算的两个重要参数。Valid卷积:无Padding;Same卷积:加入Padding使输出与输入图片的大小相同。
在彩色图像中,图片有R、G、B三个颜色通道,此时应使用三维卷积方法。在卷积神经网络中,卷积网络层有卷积层(Convolution)、池化层(Pooling)和全连接层(Fully connected)。池化分为最大池化和平均池化,前者在缩小特征图时使用区域最大值代表池化后的值,后者则使用平均值。和卷积层不同,池化层没有需要学习的参数。
一个完整的卷积神经网络遵循如下模式:Conv—Pool—Conv—Pool—Fc—Fc—Fc—Softmax。与普通的全连接神经网络相比,卷积神经网络涉及的参数更少,且有参数共享、连接稀疏性等特点。
以下示例为卷积层的前向传播代码:
def conv_forward(A_prev, W, b, hparameters):
# 前一个值A_prev维度大小
(m, n_H_prev, n_W_prev, n_C_prev) = A_prev.shape
# W维度大小
(f, f, n_C_prev, n_C) = W.shape
# 从hparameters分离参数
stride = hparameters['stride']
pad = hparameters['pad']
# 根据公式计算卷积层输出大小
n_H = int((n_H_prev + 2 * pad - f) / stride + 1)
n_W = int((n_W_prev + 2 * pad - f) / stride + 1)
# 初始化输出值Z
Z = np.zeros((m, n_H, n_W, n_C))
# 为A_prev填充元素
A_prev_pad = zero_pad(A_prev, pad)
# 迭代
for i in range(m):
a_prev_pad = A_prev_pad[i, :, :, :] # 选择第i个训练样例
for h in range(n_H): # 遍历输出值的各个维度以赋值
for w in range(n_W):
for c in range(n_C):
# 找到当前切片的边缘
vert_start = h * stride
vert_end = vert_start + f
horiz_start = w * stride
horiz_end = horiz_start + f
# 定义切片
a_slice_prev = a_prev_pad[vert_start : vert_end, horiz_start : horiz_end, :]
# 使用过滤器W和偏置b卷积切片,获得输出神经元。
Z[i, h, w, c] = conv_single_step(a_slice_prev, W[:,:,:,c], b[:,:,:,c])
# 保存信息
cache = (A_prev, W, b, hparameters)
return Z, cache
以下使用TensorFlow实现整个前向传播过程:
def forward_propagation(X, parameters):
W1 = parameters['W1']
W2 = parameters['W2']
# 卷积层
Z1 = tf.nn.conv2d(X,W1, strides = [1,1,1,1], padding = 'SAME')
# ReLU激活函数
A1 = tf.nn.relu(Z1)
# 最大池化
P1 = tf.nn.max_pool(A1, ksize = [1,8,8,1], strides = [1,8,8,1], padding = 'SAME')
# 卷积层
Z2 = tf.nn.conv2d(P1,W2, strides = [1,1,1,1], padding = 'SAME')
# ReLU激活函数
A2 = tf.nn.relu(Z2)
# 最大池化
P2 = tf.nn.max_pool(A2, ksize = [1,4,4,1], strides = [1,4,4,1], padding = 'SAME')
# 展开成一维
P2 = tf.contrib.layers.flatten(P2)
# 全连接层,输出层中有6个神经元。后期需调用Softmax。
Z3 = tf.contrib.layers.fully_connected(P2, 6, activation_fn=None)
return Z3
经典卷积网络
LeNet
LeNet-5主要针对灰度图片设计,输入为$ 32\times32\times1 $。通常一个卷积层后面接一个池化层。随着网络深度增加,图像大小不断缩小,通道数量不断增加。
AlexNet
AlexNet主要处理彩色图片,其网络结构与LeNet相似,但规模更大,使用ReLU激活函数和多个GPU。
VGGNet
VGG-16使用$3\times3$,stride=1的SAME卷积层和$2\times2$, stride=2的池化层。
ResNet
ResNet由残差块构建。普通的神经网络块传输如下图所示:
ResNet块则在传播过程中增加了一个从$ a^{[l]}$ 直接到 $z^{[l+2]}$ 的连接,称为“short cut”或者“skip connection”。前向传播公式的最后一个步骤变为: $a^{[l+2]} = g(z^{[l+2]}+a^{[l]})$
多个残差块堆积起来构成ResNet网络结构。对于中间的激活函数来说,ResNet有助于达到更深的网络,解决梯度消失和梯度爆炸问题。
Inception Network
在Inception Network中,我们无需考虑使用何种网络层及网络层大小问题。在Inception结构中,应用不同的卷积核以及池化层,计算结果叠加,增加通道数量。
迁移学习
如果我们的模型只有少量数据集,可以使用迁移学习应用其他研究者建立的模型和参数,仅训练最后自定义的Softmax网络。如果自己也有大量数据集,则可以多训练后面的几层,必要时可训练所有的参数。