前置基础知识
convolution operator 卷积运算
输入矩阵循环取子矩阵跟filter(kernal)按位乘后加和作为输出矩阵对应位置的值。
convolution与cross correlation
上面操作实际是cross correlation操作,两者之间的唯一区别是卷积操作需要在开始计算之前将卷积核进行翻转。但是在CNN领域都把互相关操作记为卷积操作了,因为这对模型没有任何影响并且计算量更小。
在一些信号处理场景中,真正的卷积(即带翻转)可以使卷积操作满足结合律,但这在CNN模型中没用。
边识别
使用下图中的filter可以发现竖直边。原因是边的两侧数值是不一样的,分别取正取负会是非0值,而没有边的地方两侧数值基本相等,分别取正取负是0值,因此非0值可以代表有竖直线。
同时值的正负可以代表两侧的颜色差异,是从暗到明,还是从明到暗,如果不关注明暗变化的话可以取绝对值。
使用不同的filter矩阵可以实现不同的效果。随着深度学习的出现可以使用可更新参数,在训练中反向传播更新,可以达到更好的效果。
padding
在上面的卷积运算中有两个问题:
1. 输出维度会缩小
2. 边缘的像素被使用到的次数比中心的点少
所以在进行卷积操作之前先将原始输入增加padding,可以规避上面两个问题
strided convolutions 跨步卷积
即卷积运算时不是一个格子一个移动,而是每次移动stride个格子。
convolution on volume
卷积核的层数与输入层数一致,每层分别计算卷积后加和作为最终输出,最终输出还是一层。
如果使用多个卷积核进行计算,则可以得到多层的输出。不同的卷积核可以发现不同方向的边
Pooling 池化
池化的操作跟卷积类似,圈选跟核同样的区域块并移动,在区域内与核进行操作,比如最大池化的操作变成了取区域内最大值,而不是按位乘加和。
池化用的最多的是最大池化,其次是平均池化。
通常不会padding后池化,偶尔也会。
平均池化就是区域内取平均值。
Networks in Networks(1×1 convolution)
池化用于减小网络Volume中的height和width,1×1卷积可以用来减小Volume中的channel数量。如下图6×6×32的网络层经过1×1×32的卷积核组成的卷积层,会输出6×6×#卷积核数量。也就是可以通过控制1×1 convolution的卷积核数量来缩放channel数量。并且可以引入非线性。
Transpose Convolution 转置卷积
为了在语义分割模型实现上述过程的后半部分,需要使用转置卷积,即通过转置卷积操作,增大输出的width和height。
转置卷积计算过程如下图:输入的每个格子乘到卷积核上,然后忽略padding后填值到输出对应位置,过程中重叠的部分加和。
卷积神经网络模型结构
单层卷积神经网络
卷积神经网络的一层中,卷积核卷积操作类似于标准神经网络中的参数,之后加一个
参数,然后使用激活函数激活得到输出。
维度分析如下:
深度卷积神经网络
简单卷积网络
最后一层输出将三个维度的数值展开为一个一维向量并输入到逻辑回归单元或者Softmax单元进行结果输出。
实际应用中一般会让宽度和高度逐步降低,channel数(厚度)变大。
常规卷积网络
卷积层后通常会带池化层,不过一般会把两者成为真正的一层,因为池化层只有超参,而没有需要训练的参数一般不统计在层数之内。
几层卷积层之后接入几层全连接层,然后接入Softmax层输出数字预测。
下面是在模型中每一层输出的shape、大小以及参数大小情况。
一般输出的大小是会下降的,但是要逐步下降,如果猛烈下降效果可能会不太好。
主要的参数量还是在全连接层。
卷积神经网络优点
参数共享
如下图的一个卷积层,参数量:(5*5+1)*6=156。
而如果使用全连接映射3072维到4704维,则需要3072*4704=14M参数。
卷积神经网络通过参数共享大幅降低参数量,而能参数共享的原因是图像的不同部分会存在相同的特征,比如竖直边、横边等。也就是能识别一些具有平移不变性的特征。
稀疏连接
输出中的一个元素只跟输入中的部分元素相关,不是全连接的。这样可以使模型能够捕捉图片中的局部特征,更高效地处理图像的空间结构。
Case Study
在CNN模型中有非常多的超参,如果设置这些超参是个问题。通常不需要你全部从头调试,而是可以尝试从论文中或者其他人项目中参考其他人的参数即可。在CV里面如果其他人的效果