“卷积”这一词在多个领域里都有定义(比如信号处理领域的傅里叶变换中也有卷积)。具体在图像处理领域,卷积操作是指使用一个小的“模板窗口”对一个图片中的所有与模板大小相同的区域进行“卷积运算”。“卷积运算”其实很简单,就是将模板中的每一个数字与图片中相同大小区域的对应数字(像素值)进行相乘,再求和。
“模板窗口”每移动到一个位置,就和图片中的对应元素进行一次卷积运算,注意我们一般把“模板窗口”称为卷积核(kernel)
卷积核,其实是经过精心设置的。观察被卷积的图像和卷积结果你会发现,该卷积核其实可以用来检测图片中的垂直边缘。如果卷积后得到的数字绝对值大,就说明图片上的对应地方有一条垂直方向的边缘(即像素数值变化较大)。如果卷积后得到的数字绝对值很小,则说明图片上的对应地方像素值变化不大,没有边缘存在。
说到这里,你也许已经能够体会为什么我们需要卷积神经网络。对于将整个图片视为一个向量的全连接层来说,它忽略了图像本身所具有的的“二维空间特性”,或者说局部特性。而卷积操作则十分擅长处理这种局部特性,能够更有效地提取出图片中的更多有用信息(比如图片中的边缘)。实际上,卷积神经网络几乎已经成为了神经网络中处理图像的标配
一个卷积核,只能检测一种特征(feature)(比如垂直方向的边缘),而图片中的信息往往很复杂,一个卷积核显然不够。所以神经网络中,一个卷积层往往会有多个卷积核,这样卷积层的输出就会有多层。
为了简便,在一些深度学习框架(caffe等等)中,在运算时可以将特征个数与图像通道数等同看待。所以对于一个通道数为1的图片,若卷积层特征个数为3,则可将输出的卷积结果视为通道数为3的图片。对于一个通道数为3的图片(此时,卷积核是一个三维的“体”),若卷积层特征个数为16,则可将输出的卷积结果视为通道数为16的图片。
卷积核的尺寸是2x2, 但在实际当中,很少见到边长为偶数的卷积核。且一般卷积核的最小边长为3
卷积操作得到的卷积结果与原来的图片相比尺寸变小了。这样会带来一个问题,有的卷积神经网络会非常“深”(比如几十层,甚至上百上千层)如果每经过一个卷积层我们的图片都变小一点,那到最后,有可能我们的图片都没有卷积核大,没办法继续卷积下去了。为了解决这个问题,人们对卷积层引入了边缘填充(padding):在卷积前,先将图片扩大一点点,然后再进行卷积。对于扩大部分,一般会填入0值。