我们先来看卷积层。之前已经简单介绍过卷积的计算方法,这里再详细描述一下。下面是一个动图,简洁形象地演示了卷积层的计算方法。
假如说有一个6 x 6像素的图片作为输入的原始图像,卷积核是一个3 x 3的二维数组,如下图所示,那么卷积计算是过程是这样的。
第一步,将卷积核覆盖图像左上角3 x 3区域,如下所示。
第二步,卷积核每一位置上的数字与被覆盖图像相同位置的数值相乘,并将得到的所有9个乘积求和。
255 x (-1) + 255 x 0 + 255 x 1 + 255 x (-1) + 255 x 0 + 255 x 1 + 255 x (-1) + 255 x 0 + 255 x 1 = 0
第三步,将计算结果真到结果表中左上角第1个位置,即卷积核所覆盖的区域左上角的像素在整个图像中的位置。
0 | |||
第四步,水平移动卷积核1个像素。
第五步,同样计算卷积核与所覆盖像素的乘积之和。
255 x (-1) + 255 x 0 + 0 x 1 + 255 x (-1) + 255 x 0 + 0 x 1 + 255 x (-1) + 255 x 0 + 0 x 1 = -765
第六步,将计算结果填入结果表第2个位置。
0 | -765 | ||
第七步,依此类推,将卷积核与图像水平方向每一个局部区域分别进行计算并将结果填入结果表中对应位置,直到卷积核的右侧到达图像的右侧最后一列像素。
0 | -765 | -765 | 0 |
第八步,将卷积核下移一行,返回图像的左侧。
第九步,同样计算乘积和,并填入结果表。
255 x (-1) + 255 x 0 + 255 x 1 + 255 x (-1) + 255 x 0 + 255 x 1 + 255 x (-1) + 255 x 0 + 255 x 1 = 0
0 | -765 | -765 | 0 |
0 | |||
第十步,依此类推,将每次卷积核与图像被覆盖的局部区域计算的结果填入结果表,直到卷积核的下端到达图像底端最后一行像素。此时我们便计算出了整个结果表,如下。
0 | -765 | -765 | 0 |
0 | -765 | -765 | 0 |
0 | -765 | -765 | 0 |
0 | -765 | -765 | 0 |
分析这个计算结果的二维表,可以看出第一列和最后一列,由于卷积核所覆盖的局部区域,其像素值都是一样的,都是255,或者都是0,我们可以看作此局部区域是在物体的内部,所以其像素值是一致或相近的,因而它们的计算结果是0,或者接近于0。而且中间两列,由于此时卷积核所覆盖的局部区域横跨了两个物体的边界,它左侧像素的像素值明显高于右侧像素的像素值,所以在一个垂直边缘检测的卷积核(左侧和右侧数值不一致,中间一列是0)的卷积之下,其计算结果是明显不等于0的。由于这只是一个6 x 6像素的很小的图像,如果图像很大,比如600 x 600像素,那么卷积之后的结果表在垂直边缘上会表现得更明显。
如果我们用*号来表示两个表格的卷积,那么上面的计算过程可以表示如下:
在这里,我们解释一下前面所演示的卷积过程几个要素。其中,作为输入层的原始图像是一个只有单通道的图像,我们知道以RGB表示的彩色图像一共有3个通道,即R(红色通道)、G(绿色通道)、B(蓝色通道),所以图像一共有三个二维表叠加在一起。如果我们用w表示图像的宽度,h表示图像的高度,而c表示图像的通道,那么
w * h * c = 6 * 6 * 3
而当图像只有一个通道时,它是一个灰度图像,也就是说它是“黑白”的。像素数值越大越接近白色,像素为0则是黑色。我们的输入层是只有一个通道的灰度图像,它可以表示为:
w * h * c = 6 * 6 * 1
而我们的卷积核是一个宽和高为3 x 3的滤波器,这里卷积核的通道数和输入输入层的通道数永远是一样的,即如果我们刚才使用的输入层是一个3通道的彩色图像,那么卷积核就会是 3 x 3 x 3,当然每一个通道中二维表的数值是互不相同的。
第三个要讨论的要素是步长(stride)。我们刚才在图像上移动卷积核时,每次总是移动一个像素,移动的距离就是步长,不管是水平还是垂直。步长越大,则结果表的宽高就越小,如果我们刚才选取步长为2,则结果表的宽和高将降低一倍。
根据卷积核的大小,和选取的步长,我们可以计算结果表的大小,假设结果表的边长为输入表的边长为i,卷积核的大小为f,步长为s,结果表的边长为r,则计算公式如下:
由公式可知,即使步长为1,假如卷积核大小大于1,则每经过一次卷积,结果表总会比输入表小。有时候为了不缩小结果表,或者使位于图像边缘的像素有同等的机会次数参考计算,会在输入图像的外围增加一圈像素,或称补一圈0,像这样:
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 255 | 255 | 255 | 0 | 0 | 0 | 0 |
0 | 255 | 255 | 255 | 0 | 0 | 0 | 0 |
0 | 255 | 255 | 255 | 0 | 0 | 0 | 0 |
0 | 255 | 255 | 255 | 0 | 0 | 0 | 0 |
0 | 255 | 255 | 255 | 0 | 0 | 0 | 0 |
0 | 255 | 255 | 255 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
我们称这为padding,假设padding的圈数为p,则结果表的大小为
我们再总结一下,输入层可以有多个通道,而卷积核的通道数与输入层保持一致。不管输入层有多数通道,计算结果只有一个值(每一个通道计算出来的所有乘积全部加总求和),所以计算结果只有一个通道,其大小由上面的计算公式决定。
由此,我们可以将上例的卷积过程用另一种方式来表示。
在上面的式子中,我们使用一个卷积核来卷积输入层的数据(6x6x1),得到一个单通道的输出层(4x4x1),下面我们来看多个卷积核的情况。通常情况下,每一层连接都会用到许多卷积核。比如现在我们用另一个卷积核
对原始图像进行计算,会得到另一个4×4的输出结果,这样我们就得到了两个4×4的二维数据,依此类推,当我们使用了多少个卷积核,则输出层就有多少个二维数据,即多少个通道。
换一个表达方式:
接下来,如果我们以这一层的输出作为下一层的输入,进行卷积,也就是说输入层变成了 4 x 4 x 3,那么计算过程可能变成如下:
卷积核的通道数总是和输入层的通道数保持一致。
卷积层讲得差不多了,现在我们来介绍一个卷积神经网络中重要的概念,即参数,或者叫权重,这也是我们后面要介绍的网络的训练或者说学习需要计算出来的关键信息。权重是什么呢?像我们上面在卷积核里面用到数值,比如3 x 3的卷积核里面就有9个数值,这就是9个权重,或者说9个参数。这些不同的权重决定了每个卷积核会提取不同的特征。后面还会讲到偏置值也是一种参数。所以一个卷积核,它的参数数量是边长的平方,有多少个卷积核,则参数数量就增加多少倍。例如20个3 x 3的卷积核,参数数量就是
20 x 3 x 3 = 180
与此相对的,网络里面还有另一类参数,比如卷积核的大小为3×3,步长为1,padding为0,这些我们称之为超级参数,通常,参数是由网络训练出来的,而超级参数则是人为设计的。
最后再简单澄清一下,卷积层的目的是提取特征,而且不管特征是出现在图像的什么位置。