卷积神经网络(Convolutional Neural Networks, CNN)
一 、卷积神经网络的基本概念
1、卷积核
卷积核就是图像处理时,给定输入图像,在输出图像中每一个像素是输入图像中一个小区域中像素的加权平均,其中权值由一个函数定义,这个函数称为卷积核。
卷积核可以由张量表示,张量大小: n × m × c h a n n e l n\times m\times channel n×m×channel
这里的$ channel 与 输 入 的 图 片 有 关 , 灰 度 图 片 : 与输入的图片有关,灰度图片: 与输入的图片有关,灰度图片: channel=1 , 彩 色 图 片 : ,彩色图片: ,彩色图片: channel=3$
而 n n n和 m m m自行决定,大于0即可,并且: n = m n=m n=m,因为卷积实际上是根据滤波器或内核对源数据矩阵(整个图像)进行编码,如果使用了非对称的卷积核则会出现混叠错误。
这么说可能还是比较抽象,给出一个灰度图片卷积核的例子:
彩色图片卷积核的例子:
卷积核内的参数也就是权重,根据需要选择不同的参数,会有不一样的效果
2、卷积计算
(1)无填充的卷积计算
卷积计算需要使用上面的卷积核,将相应的卷积核以固定步长(stride)滑过整张图像并计算,得到计算结果即是卷积后的图像,下面以一个例子来说明如何进行卷积计算:
给出一个
6
×
6
6\times 6
6×6大小的灰度图像矩阵,卷积核的大小:
3
×
3
3\times 3
3×3:
先从卷积结果的第一行第一列的-2为例,看看是如何计算得出的:
如上图所示,将卷积核放置到图像的对应位置:
对应位置的元素相乘,再求和:
( 1 × 3 + 1 × 1 + 2 × 1 ) + ( 0 × 0 + 0 × 0 + 7 × 0 ) + ( 1 × ( − 1 ) + 1 × ( − 1 ) + 6 × ( − 1 ) ) = − 2 (1\times 3 +1\times 1+2\times1)+(0\times 0+0\times 0+7\times 0)+(1\times (-1)+1\times(-1)+6\times(-1))=-2 (1×3+1×1+2×1)+(0×0+0×0+7×0)+(1×(−1)+1×(−1)+6×(−1))=−2
以固定步长(这里将步长设为1)向右移动一个单位长度:
计算,相乘再求和:
( 0 × 3 + 0 × 1 + 7 × 1 ) + ( 1 × 0 + 1 × 0 + 6 × 0 ) + ( 2 × ( − 1 ) + 1 × ( − 1 ) + 9 × ( − 1 ) ) = − 5 (0\times 3 +0\times 1+7\times1)+(1\times 0+1\times 0+6\times 0)+(2\times (-1)+1\times(-1)+9\times(-1))=-5 (0×3+0×1+7×1)+(1×0+1×0+6×0)+(2×(−1)+1×(−1)+9×(−1))=−5
如此反复,直到卷积核滑过整个图像,从结果来看,卷积之后的图像比原来的图像小了一圈,卷积之后的图像尺寸取决于卷积核的尺寸(n)与移动步长(stride)。设原始图像的大小为: x × y x\times y x×y,卷积核的大小: n × n n\times n n×n,步长: s s s,卷积后图像的尺寸:
x 1 = x − n + 1 s x_1 = \frac {x-n+1}{s} x1=sx−n+1
y 1 = y − n + 1 s y_1 = \frac {y-n+1}{s} y1=sy−n+1
(2)填充(padding)的卷积计算
之前的卷积计算会使得图像“缩小”,对于某些情况(比如:原始图像非常小),可能不希望经过卷积后特征减少,这时可以采用零填充。
还是使用(1)中的例子:
图中蓝色部分即为填充部分,填充(padding)的卷积计算只是在计算前,在图像外围填充0,使得图像在经过卷积计算之后,大小不变。设填充层数为d,由(1)中公式可知,若要使得卷积后的图像大小不变,d应该满足:
d = ( s − 1 ) x + n − 1 2 d=\frac {(s-1)x+n-1}{2} d=2(s−1)x+n−1
二、卷积神经网络的层级结构
1、数据输入层
这是CNN的第一层主要是接收输入数据,实际上在很多神经网络中,数据输入层不计入神经网络的层数
2、卷积计算层
这一层是CNN的核心,用于卷积计算。其实质是将图像重新编码,提取其中的有效特征。
3、激活层
将卷积层的输出做非线性映射,一般采用ReLu函数。
ReLu函数:
g
(
z
)
=
m
a
x
(
0
,
z
)
g(z)=max(0,z)
g(z)=max(0,z),这个函数也是目前最常用的激活函数,需要注意的是在
z
=
0
z=0
z=0这个点上,ReLu函数是不可导的,需要人为的定义函数在这个点的导数,但是在计算机里面,一般来说,不会出现
z
=
0.0000000
z=0.0000000
z=0.0000000的情况
函数图像如下:
4、池化层
池化层的操作是对激活层的输入进行采样。
池化层可选的方法有:Max pooling(最大池化)和Average pooling(平均池化)。池化的操作,首先确定池化窗口的大小,然后将窗口以一定的步长滑过整个图像并进行计算,得到一个新图像。
设池化窗口大小为
2
×
2
2\times 2
2×2,接下来用例子说明这两者的不同:
Max pooling(最大池化):选择当前窗口中的最大值作为输出
Average pooling(平均池化):选择当前窗口的平均值作为输出
现在多采用最大池化,原因是,数值越大的点亮度越大,更具特征性
具体来说池化层的作用有:
(1)筛选特征
一幅图像包含了大量的特征,其中有很大一部分特征对于当前任务来说没有任何作用,可以剔除,其次还有一部分特征是冗余的,也可以去除。
(2)特征不变
这也是图像处理中经常提到的尺度不变性,实际上池化的作用相当于将图像进行缩小,一般来说,只要不是缩小的特别严重,都能识别图像中的物体。
(3)预防过拟合
减少特征可以在一定程度上预防过拟合的出现。
5、全连接层
在接入全连接层前,需要将图像展平成向量,所有神经元都有权重,每个特征都与神经元相连,最后输出到输出层
根据需求,输出层的激活函数可以采用softmax、sigmod等