卷积层浅析
卷积层:
卷积神经网络中每层卷积层(Convolutional layer)由若干卷积单元组成,每个卷积单元的参数都是通过反向传播算法最佳化得到的。卷积运算的目的是提取输入的不同特征,第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网路能从低级特征中迭代提取更复杂的特征。
假定此时有一张图片大小为32 *32 * 3(图像的长,宽,深度)
卷积的过程就是,在原图的基础上,添加一个滤波器(滤波器的
深度要求和原图一样,例如上方的图片大小,那么滤波器的大小就是三个深度)
图像经过滤波器之后,输出的就叫做激活层activation
我们用上面的例子来做一个运算,假设添加六个滤波器来过滤原图:
原图 | 滤波器 | 激活层 |
---|---|---|
32 *32 *3 | 5 * 5 * 3 | 28 * 28 * 1 ( A ) |
A | 5 * 5 * 3 | A与滤波器点乘 ( B ) |
B | 5 * 5 * 3 | B与滤波器点乘 ( C ) |
C | 5 * 5 * 3 | C与滤波器点乘 ( D ) |
D | 5 * 5 * 3 | D与滤波器点乘 ( E ) |
E | 5 * 5 * 3 | E与滤波器点乘 |
…… | …… | 28 * 28 * 6 |
上表进行的运算就叫卷积运算,下图就说明了该表进行的运算:
如果之后再进行卷积运算时,一定要注意此时图像的深度,根据实际的图像深度来选择滤波器的深度,下图则是根据上图的结果所选择的滤波器大小为五乘五乘六
卷积运算的同时,我们可以滤波器设置步长,例:
为了方便理解和计算,我们假设有一张7 * 7大小的图片(不看图片的深度)
原图(N) | 滤波器(F) | 步长(stride) | 激励层(activaion) |
---|---|---|---|
7 * 7 | 3 * 3 | 1 | 5 * 5 |
7 * 7 | 3 * 3 | 2 | 3 * 3 |
7 * 7 | 3 * 3 | 3 | 不允许 |
计算上表的公式如下:
(N - F) / stride + 1 (原图-滤波器) / 步长 + 1
stride 1 =>(7 - 3) / 1 + 1 = 5
stride 2 => (7 - 3) / 2 + 1 = 3
stride 3 => (7 - 3) / 3 + 1 = 2.33333……
可以看到当步长为三的时候,激励层的值为无线循环小数了,卷积过程不允许这种情况的出现,所以我们只取可以完整的算出激励层的步长。
填充
上面是卷积运算的过程,但是通常在进行卷积运算之前,会在图像的像素点周围做一个填补操作padding,通常padding的值是零。意思就是在整个原图的像素点外围加上一圈0,这样的作用就是可以使进行卷积运算之后的输出图片的尺寸变得和输入时图片的尺寸一样大,如下图所示:
填补操作的大小是根据滤波器的大小来定的:
求填补的大小的公式为:(F - 1) / 2 (滤波器 - 1) / 2
滤波器(F) | 运算 | 填补大小 | 输出大小 |
---|---|---|---|
3 * 3 | (3 - 1) / 2 | 1 | +2 |
5 * 5 | (5 - 1) / 2 | 2 | +4 |
7 * 7 | (7 - 1) / 2 | 3 | +6 |
可能表格解释的不清楚,用一个例子来说明
- 输入的大小为32 * 32 * 3 ;
- 加上十个滤波器,大小为5 * 5;
- 步长为1;
- 填充为2:
求输出大小?
先不看深度,因为填充为2,由上表可知输出大小应该是在原图上加上4再进行运算;大小是36 * 36
然后经过步长的运算
(36 - 5)/ 1 + 1 = 32
得到的图像大小为 32 * 32 ;
然后加上深度,由于是有十个大小为5 * 5的滤波器,所以滤波器为5 * 5 * 10.深度为10,所以原图会经过十次卷积,最终输出的图片大小为:
32 * 32 *10
由此可以看到,添加padding的作用了,如果没有填充的话,输出的图像大小将会变成28 * 28 * 10,虽然可以算出大小,但是如果当卷积的次数越来多,图像会越变越小,很不利于之后的计算。所以填充是非常重要的。
公式
输入的图像大小:W1 * H1 * D1 (宽度 * 高度 * 深度)
K :滤波器的个数 K总是二的指数(32, 64,128 ,512)
F:滤波器的大小
S:步长
P:填充大小
输出的图像大小:W2 * H2 * D2(宽度 * 高度 * 深度)
W2 = (W1 - F + 2P) / S +1
H2 = (H1 - F + 2P) / S + 1
D2 = K
滤波器的尺度(F * F) 乘以深度D,就是每个滤波器的权重的个数;再乘以K(滤波器的个数)就是这一个卷积层权重的总数;另外加上每个滤波器的一个偏置项(一共有K个)
一定要算上偏置项的大小!!!!
具体的过程就如下图所示,就不细说了