一、CNN模型原理
1.1 图像
- 图像具有平移不变性和旋转不变性。即对图像的平移或者轻微旋转不改变其类别。图像可以用像素点来表示,存储为一个三维矩阵(长×宽×channels)
- 黑白图片channels=1,即每个像素点只有灰度值。彩色图像channels=3,每个像素点由RGB三原色组成,对应一个三维向量,值域[0,255]。一般0表示白色,255表示黑色
1.2 DNN图像分类的问题
如果直接将图像根据各像素点的向量作为图片特征输入模型,例如LR、SVM、DNN等模型进行分类,理论上可行,但是面临以下问题:
- 图像的平移旋转、手写数字笔迹的变化等,会造成输入图像特征矩阵的剧烈变化,影响分类结果。即不抗平移旋转等。
- 一般图像像素很高,如果直接DNN这样全连接处理,计算量太大,耗时太长;参数太多需要大量训练样本
1.3 卷积原理
- 人类认识图片的原理:不纠结图像每个位置具体的像素值,重点是每个区域像素点组成的几何形状,以及几何形状的相对位置和搭配。也就是图像中更抽象的轮廓信息。
- 模型需要对平移、旋转、笔迹变化等不敏感且参数较少。
卷积原理:
-
CNN通过卷积核对图像的各个子区域进行特征提取,而不是直接从像素上提取特征。子区域称为感受野。
-
卷积运算:图片感受野的像素值与卷积核的像素值进行按位相乘后求和,加上偏置之后过一个激活函数(一般是Relu)得到特征图Feature Map。
-
特征图:卷积结果不再是像素值,而是感受野形状和卷积核的匹配程度,称之为特征图Feature Map。卷积后都是输出特定形状的强度值,与卷积核形状差异过大的感受野输出为0(经过Relu激活),所以卷积核也叫滤波器Filter。
卷积的特点:
-
使用一个多通道卷积核对多通道图像卷积,结果仍是单通道图像。要想保持多通道结果,就得使用多个卷积核。同一个通道的卷积结果是一类特征(同一个卷积核计算的结果)。
-
卷积核的参数为待学习参数,可以通过模型训练自动得到。
-
图像识别中有很多复杂的识别任务,如果每个图像对应一个卷积核,那么卷积核会很大,参数过多。另外复杂图像形状各异,但是基本元素种类差不多。所以CNN使用多个不同尺寸的卷积核进行基本形状的提取
-
假设图像大小为 N ∗ N N*N N∗N矩阵,卷积核的尺寸为 K ∗ K K*K K∗K矩阵,图像边缘像素填充:P,卷积的步伐为S,那么经过一层这样的卷积后出来的图像为:W=(N-K+2P)/S+1。当步幅为1,padding=1时,卷积后图像尺寸不变。
1.4 池化原理
池化层的作用:缩减图像尺寸;克服图像图像平移、轻微旋转的影响;间接增大后续卷积的感受野;降低运算量和参数量
- 消除相邻感受野的信息冗余现象(相邻感受野形状差异不大)
- 池化操作对子区域内的轻微改变不敏感,所以可以克服图像平移。轻微旋转的影响
- 缩减特征图,增大后续卷积操作的感受野,以便后续提取更宏观的特征。(比如经过2×2池化,池化后图像每个像素对应于原图像2×2的感受野,此时在用3×3卷积,那么卷积后每个像素对应于6×6的感受野)
- 降低运算量和参数量
池化的特点:
- 只需要设定池化层大小和池化标准(最大池化或均值池化、中位数池化),就可以进行池化计算,没有参数需要学习
- 最大池化提取特征能力较强,但是容易被噪声干扰。均值池化相对稳定,对噪声不敏感
- 池化在各个通道上独立进行
- 池化步长一般会参考感受野尺寸。当二者相等时,池化时没有交集
池化技巧:
如果有20个卷积层,max池化和ave池化混用,怎么安排?应该是前面的层用最大池化,尽可能的提取特征;后面层用ave池化,减少尺寸抗平移。
因为一开始就用平均池化,把特征平均掉了,就很难恢复了。所以是先提取特征再去噪。训练样本足够多的时候,不太容易被噪声所影响,直接用max池化。(足够的样本可以平均噪声)
而在不同场景用的池化操作也不一样:
- 人脸识别:公司打卡系统 。对特征要求高,需要把每个人的五官特点提取出来(max pool)
- 人脸检测:画面是否有人 。要求低,大概轮廓出来即可(ave pool)
1.5 Flatten
- 卷积-池化输出是一个多通道的而为特征,而最后softmax分类,softmax只能作用于一个向量。所以需要对卷积0池化结果进行拉平操作,也就是Flatten。
- Flatten没有参数,例如一个7×7×10的矩阵,会被拉平成490维向量。
1.6 卷积池化总结
CNN使用不同卷积核提取图像中特定的形状特征,配合池化操作进一步缩减图像尺寸,稳定特征。对低级特征进行卷积计算,得到相对高级的特征。所以多层卷积-池化,层层堆叠可以提取复杂特征。
需要注意的是:
- 一个CNN模型只能处理一种尺寸的图像,所以实际中需要将输入图像全部处理成同一尺寸
- 为了防止数值溢出和激活函数饱和造成的梯度消失或者梯度爆炸,输入图像像素值会归一化至[0,1]
- CNN中每个通道代表同一类特征(同一个卷积核计算的结果),所以可以对同一个通道的数值进行批归一化。分别计算n个通道上的n组均值和方差。
- 对于28×28×1的图像,如果全连接并保持图像尺寸不变,则参数量为28×28×1×28×28×1=614656个。如果进行3×3卷积并保持尺寸不变,参数量为28×28×1×3×3。可以理解为隐藏层每个神经元只与输入层9个神经元相连,其它连接都被剪枝,各个位置参数共享(隐藏层还是576神经元,但是前后层都是9*9相连)所以CNN是通过权重共享和局部感受野(剪枝)对DNN全连接进行简化。
二、卷积池化计算
一个常见的CNN例子如下图:
2.1. 初识卷积
微积分中卷积的表达式为: S ( t ) = ∫ x ( t − a ) w ( a ) d a S(t) = \int x(t-a)w(a) da S(t)=∫x(t−a)w(a)da
离散形式是: s ( t ) = ∑ a x ( t − a ) w ( a ) s(t) = \sum\limits_ax(t-a)w(a) s(t)=a∑x(t−a)w(a)
这个式子如果用矩阵表示可以为: s ( t ) = ( X ∗ W ) ( t ) s(t)=(X*W)(t) s(t)=(X∗W)(t)
其中星号表示卷积。
如果是二维的卷积,则表示式为: s ( i , j ) = ( X ∗ W ) ( i , j ) = ∑ m ∑ n x ( i − m , j − n ) w ( m , n ) s(i,j)=(X*W)(i,j) = \sum\limits_m \sum\limits_n x(i-m,j-n) w(m,n) s(i,j)=(X∗W)(i,j)=m∑n∑x(i−m,j−n)w(m,n)
在CNN中,虽然我们也是说卷积,但是我们的卷积公式和严格意义数学中的定义稍有不同,比如对于二维的卷积,定义为: s ( i , j ) = ( X ∗ W ) ( i , j ) = ∑ m ∑ n x ( i + m , j + n ) w ( m , n ) s(i,j)=(X*W)(i,j) = \sum\limits_m \sum\limits_n x(i+m,j+n) w(m,n) s(i,j)=(X∗W)(i,j)=m∑n∑x(i+m,j+n)w(m,n)
这个式子虽然从数学上讲不是严格意义上的卷积,但是大牛们都这么叫了,那么我们也跟着这么叫了。后面讲的CNN的卷积都是指的上面的最后一个式子。
其中,我们叫W为我们的卷积核,而X则为我们的输入。如果X是一个二维输入的矩阵,而W也是一个二维的矩阵。但是如果X是多维张量,那么W也是一个多维的张量。
2.2. CNN中的卷积层
图像卷积:对输入的图像的不同局部的矩阵和卷积核矩阵各个位置的元素相乘,然后相加得到。
举个例子如下:
- 输入二维的3x4的矩阵
- 卷积核是一个2x2的矩阵
- 卷积步长为1(一次移动一个像素来卷积)
- 首先我们对输入的左上角2x2局部和卷积核卷积,即各个位置的元素相乘再相加,得到的输出矩阵S的 S 00 S_{00} S00的元素,值为 a w + b x + e y + f z aw+bx+ey+fz aw+bx+ey+fz。
- 我们将输入的局部向右平移一个像素,现在是(b,c,f,g)四个元素构成的矩阵和卷积核来卷积,这样我们得到了输出矩阵S的 S 01 S_{01} S01的元素
- 同样的方法,我们可以得到输出矩阵S的 S 02 , S 10 , S 11 , S 12 S_{02},S_{10},S_{11}, S_{12}