1 计算机视觉
计算机视觉包含的典型任务有:
- 图像分类;
- 目标检测;
- 图像风格转换。
计算机视觉任务的特点是输入数据量较大,对于一副1000 * 1000 * 3的图像而言,需要的输入神经元数量为3百万。假如第一隐藏层有1000个神经元,那么 W [ 1 ] ∈ R 1000 × 3 M i l l i o n W^{[1]} \in R^{1000 \times 3Million} W[1]∈R1000×3Million,如此大规模的参数很容易造成神经网络的过拟合,也对参数的存储要求了很高的内存需求。因此需要使用卷积运算降低所需要处理的参数数量。
2 卷积
卷积是卷积神经网络的基本组成部分。
卷积的实现是将卷积核依次沿着图像进行滑动,在任一处进行卷积核和覆盖图像块的对应元素相乘再相加的操作。
深度学习的发展就是不再使用手工设计的卷积核与图像进行卷积运算,而是采用有监督的训练样本、通过反向传播逼迫网络自身去学习适合的卷积核。
卷积的定义是需要对卷积核进行翻转操作的,但是一般在卷积神经网络中都是直接进行对应元素相乘再相加的操作,这其实是“相关”。之所以使用相关而不是卷积是因为一个基于核翻转的卷积运算的学习算法所学得的核是对未进行翻转的算法学得的核的翻转,因此在卷积神经网络中使用卷积和相关进行运算学得的核,含义是完全一致的。为了计算的便利性,一般都采用相关代替卷积。
padding
对输入为n * n的图像应用核大小为k*k的卷积操作后,得到的输出大小为(n-k+1) * (n-k+1)。如果进行多层这样的卷积,输出的尺寸会越来越小。同时,使用普通卷积时,图像边缘的像素参与计算的次数远小于图像中间位置的像素参与卷积计算的次数。因此,需要对输入图像进行padding操作以进行图像扩充。
padding操作一般在图像的四周进行尺寸相同的填充0的操作。
假设padding的尺寸为p,则卷积之后得到的输出为(n + 2p - k +1) * (n + 2p - k +1)。进行padding操作一方面可以防止卷积输出尺寸减小,另一方面也可以减弱图像边缘像素作用被弱化。
根据padding的尺寸大小,卷积可以分为vaild convolution和same convolution两种。
- vaild convolution:no padding。输出就是(n - k +1) * (n - k +1);
- same convolution:padding的目的是保证卷积前后得到的图像大小是一样的,padding根据卷积核的大小进行确定,即2p + 1 = k ⇒ p = k − 1 2 \Rightarrow p = \frac{k-1}{2} ⇒p=2k−1。计算机视觉中使用的卷积核尺寸一般为奇数,因此 p 一般为整数。
卷积的stride
stride决定卷积核滑过图像时的移动步长。
原始输入图像 n * n,卷积核 k * k,padding尺寸 p,stride尺寸s,则卷积输出的尺寸为: ⌊ n + 2 p − k s + 1 ⌋ ∗ ⌊ n + 2 p − k s + 1 ⌋ \lfloor \frac{n+2p-k}{s}+1\rfloor * \lfloor \frac{n+2p-k}{s}+1\rfloor ⌊sn+2p−k+1⌋∗⌊sn+2p−k+1⌋。向下取整是因为只有卷积核完全包含在图像范围内时才可以进行卷积计算。
多通道卷积–convlution over columes:
进行多通道卷积时,输入数据的通道数必须和卷积核的通道数一样。
输入
n
∗
n
∗
n
c
n * n *n_c
n∗n∗nc,卷积核
k
∗
k
∗
n
c
∗
m
k*k*n_c*m
k∗k∗nc∗m,卷积的输出为
⌊
n
+
2
p
−
f
s
+
1
⌋
∗
⌊
n
+
2
p
−
f
s
+
1
⌋
∗
m
\lfloor \frac{n+2p-f}{s}+1\rfloor*\lfloor \frac{n+2p-f}{s}+1\rfloor*m
⌊sn+2p−f+1⌋∗⌊sn+2p−f+1⌋∗m,
m
m
m表示卷积核的数量。即卷积核必须和输入数据具有相同的通道数。输出的通道数为卷积核的数量。
总结:第l个卷积层也是先进行核和输入数据的卷积操作,然后再加偏差,通过relu激活函数得到输出。
假设第
l
l
l个卷积层:
- padding大小为 p [ l ] ∗ p [ l ] p^{[l]} * p^{[l]} p[l]∗p[l];
- stride大小为 s [ l ] ∗ s [ l ] s^{[l]} * s^{[l]} s[l]∗s[l];
- 卷积核数量为 n c [ l ] n_c^{[l]} nc[l];
- 输入大小为 n H [ l − 1 ] ∗ n W [ l − 1 ] ∗ n C [ l − 1 ] n_H^{[l - 1]} * n_W^{[l - 1]} * n_C^{[l-1]} nH[l−1]∗nW[l−1]∗nC[l−1];
- kernel大小为 k [ l ] ∗ k [ l ] ∗ n C [ l − 1 ] k^{[l]} * k^{[l]}*n_C^{[l-1]} k[l]∗k[l]∗nC[l−1];
- 输出大小为 n H [ l ] ∗ n W [ l ] ∗ n C [ l ] = ⌊ n H [ l − 1 ] + 2 p [ l ] − k [ l ] s [ l ] + 1 ⌋ ∗ ⌊ n W [ l − 1 ] + 2 p [ l ] − k [ l ] s [ l ] + 1 ⌋ ∗ n C [ l ] n_H^{[l]} * n_W^{[l]} * n_C^{[l]} = \lfloor \frac{n_H^{[l-1]}+2p^{[l]}-k^{[l]}}{s^{[l]}}+1\rfloor* \lfloor \frac{n_W^{[l-1]}+2p^{[l]}-k^{[l]}}{s^{[l]}}+1\rfloor*n_C^{[l]} nH[l]∗nW[l]∗nC[l]=⌊s[l]nH[l−1]+2p[l]−k[l]+1⌋∗⌊s[l]nW[l−1]+2p[l]−k[l]+1⌋∗nC[l];
- 权重数目为 k [ l ] ∗ k [ l ] ∗ n C [ l − 1 ] ∗ n C [ l ] k^{[l]} * k^{[l]}*n_C^{[l-1]}*n_C^{[l]} k[l]∗k[l]∗nC[l−1]∗nC[l];
- bias数目为 1 ∗ 1 ∗ 1 ∗ n C [ l ] 1*1*1*n_C^{[l]} 1∗1∗1∗nC[l];
- 大小为m的样本batch的激活值为 m ∗ n H [ l ] ∗ n W [ l ] ∗ n C [ l ] m * n_H^{[l]} * n_W^{[l]} * n_C^{[l]} m∗nH[l]∗nW[l]∗nC[l]。
卷积网络中一般随着层数的加深,每一层的空间尺寸都在缩小,而channel数目在增加。
卷积神经网络包含卷积层(CONV)、池化层(POOL)和全连接层(FC)。
使用卷积的好处:
假设输入为32323 = 3072,输出为28286=4704,如果使用全连接,则参数数量为14,450,688。如果使用6个大小为553的卷积核进行卷积操作,则总的参数数量为6*(553+1)=456。因此使用卷积层可以有效减少参数的数量,避免过拟合。
卷积层减少参数数量主要是通过下述两点:
- 权值共享:对输入数据某一区域有用的滤波器对图像的其他区域同样有用;
- 稀疏连接:在每一层,每一个输出值只和局部的输入值有关。
卷积的平移不变性:
对图像进行平移之后,输出的卷积特征也进行相同的平移操作,因此卷积对平移操作是等变的。卷积对缩放和旋转不具有等变性。
3 池化
最大池化/平均池化,最大池化比平均池化更常用;
输入和输出具有相同的通道数;
池化操作中很少用到池化;
池化层没有要学习的参数;
输出的空间尺寸为
⌊
n
+
2
p
−
f
s
+
1
⌋
∗
⌊
n
+
2
p
−
f
s
+
1
⌋
\lfloor \frac{n+2p-f}{s}+1\rfloor * \lfloor \frac{n+2p-f}{s}+1\rfloor
⌊sn+2p−f+1⌋∗⌊sn+2p−f+1⌋。
卷积神经网络中统计层数时,一般只统计包含学习参数的层,所以要不把一个卷积核和一个池化层合称为一层,要不就单独把卷积层作为一层。
4 神经网络示例
计算机视觉中的迁移学习:
在计算机视觉任务中,如果自己拥有足够的计算资源和数据集,那么完全可以从头训练。一般都是用预训练的模型进行迁移学习。迁移学习中,自己拥有的标注数据越多,就可以在网络中冻结更少的层。这是因为神经网络学习到的特征是层次性的特征,低层特征很通用,高层特征还是针对具体任务的抽象特征。因此,迁移学习中低层网络一般进行冻结,高层特征可以视自有数据量的大小决定是否放开,但最后的softmax层一般根据自己任务的类型数进行从头训练。
计算机视觉中的data augmentation:
水平镜像;
从原始图像上随机裁剪;
颜色变换,实际中对颜色变换的幅值是根据某种概率决定的,一般变换幅值不会太大。颜色变换可以增强网络对图像颜色变化的鲁棒性;常用的是AlexNet论文介绍的PCA颜色增强,PCA颜色增强就是分析RGB三个通道的变化幅度决定增加的扰动的幅值。
旋转;
仿射变换;
打比赛的利器:
集成学习:对多个模型的预测结果取平均;
multi-crop:对测试图像选取多个crop的子块并进行镜像映射;
实际工程应用中,上面的两个技巧因为内存/计算能力的限制,往往不适用。