构建卷积神经网络主要包含3种不同的网络层,分别是convolution layer,pooling layer以及fully connected layer。下文将针对这个三个方面进行解读。
一、 卷积层
在介绍卷积层之前,我们首先需要了解窗口的概念。我们在网络中进行计算时,我们采取的是通过窗口遍历的方法。我们知道图片是由像素组成的,下面是一个4*4的矩阵,我们首先不考虑RGB三个channel的情况。下面这个矩阵意味着一个channel。
1 | 2 | 1 | 1 |
4 | 5 | 1 | 1 |
1 | 1 | 1 | 1 |
1 | 1 | 1 | 11 |
然后我们假设一个窗口(filter),如下一个3*3的矩阵。这是一个常用的用于检测垂直线段的窗口。
1 | 0 | -1 |
1 | 0 | -1 |
1 | 0 | -1 |
当进行计算时,我们取图片矩阵右上角9个数,分别与窗口中的数字相乘累加。这里的结果是1+4+1-1-1-1=3;得到的结果将表示为下面的矩阵。
3 | 6 |
3 | -6 |
这里我们进行了一个简单的计算。
接下来我们引入更加复杂的概念:填充padding和步幅strides。
填充
通过我们上面的计算,我们可以发现,图片矩阵中左上角的数字1只用了一次;而中心的数字如5却用了4次。为了解决这个问题,我们引入了填充的方法。在原图片的四周填充。如padding=1的情况。
0 | 0 | 0 | 0 | 0 | 0 |
0 | 1 | 2 | 1 | 1 | 0 |
0 | 4 | 5 | 1 | 1 | 0 |
0 | 1 | 1 | 1 | 1 | 0 |
0 | 1 | 1 | 1 | 11 | 0 |
0 | 0 | 0 | 0 | 0 | 0 |
常见的padding有两种模式一种是valid,即不作处理;另一种是same即让输出的矩阵与原图片矩阵大小一模一样。这个时候p=(f-1)/2
步幅
我们刚刚的计算是每次向右移动一格。有时我们并不想这样,因此引入了步幅的概念。即每次移动窗口的格数。上述计算的步幅即是1。
Note
事实上,以上计算在数学上并不是卷积,而是一种交叉相关。真正的卷积需要原图片矩阵上下翻转后左右翻转,然后进入计算。但是这并不影响我们神经网络的影响,因此大多数神经网络并不关注这一点。
卷积层的窗口很值得推敲,我们上面举的例子用于检测竖直边,同样我们可以推出水平边等特征的表达方式。实际网络中filter中的数字将作为我们的参数存在。
窗口的大小一般是奇数,一方面这使得窗口有中心;另一方面是为了便于确定padding的大小。
以上例子的channel是一,常见的图片RGB是channel为3,而filter也就是窗口的channel的大小是与图片相同的。
二、 池化层
池化层和卷积层不同的时,它可以发现更多的相同特征。常见的池化层有max和average两种。池化层也是有窗口的,但是它在移动的过程中,会计算图片矩阵中的max值或者平均值。
池化层同样有步幅和填充的概念。这里不做赘述。
我们假设最大(amx)池化层的filter的大小为2*2,s=2;那我们对原图片矩阵计算得到的结果为:
5 | 1 |
1 | 11 |
三、 fully connected layer
这种神经网络层的作用类似于flatten,即把高维的图片变成一维的向量,然后计算接下来的计算。
将高维的图片变成一维的向量就很多方式,一种方式是使用1*1的卷积层,另外一种方式则是直接将数字flatten。
四、 激活函数
事实上,上述每个过程都是有激活函数的。如当我们通过卷积层得到一个2*2的矩阵时,这个数字将作为A与W相乘并加上一个常数b,然后取relu之类的激活函数,随后再进入下一层。
五、 卷积神经网络为什么有效?
这里主要有两个原因:
1. 参数共享;我们可以看到filter的参数用于图片中各个地方的计算,这对于发现图像中的相似特征非常有效。
2. 连接稀疏;每一层的输出仅仅取决于非常小数量的参数,这对于防止过拟合有很大的帮助。