如何推导出CNN的神经元?

在探讨这个问题前我们先假设有一个任务,就是检测一张图片中是否有一只鸟,进一步我们将这个问题进行分解,如果有一只鸟,那么这张图片中肯定有鸟嘴,有翅膀,有羽毛,有鸟尾。那么这些鸟身上的“部件”肯定比整张图片要小,那么我们在全连接网络中的神经元就不需要看到整张图片,只需要看到鸟的“部件”就可以判断这个图片中是否有一只鸟,当然这里可能还涉及到一个我们的神经网络看到多少个鸟“部件”才能判断他是一只鸟,假设我们只看到一个鸟嘴就能判断他是一只鸟吗?不一定,他也可能是一只鸡,所以最后神经网络判断这个图片里面有没有鸟的概率与网络看到鸟的“部件”个数也有关。同时这里还有一个问题就是在不同的图片中鸟的“部件”出现的地方也不会相同,可能出现在图片的左下角,中间,也可能是右上角。最后还要考虑到我们如果对这张图片进行缩放是不会影响这张图片中是否有鸟的,那么我们的网络应该也要适应在同一张图片在缩放的时候也应该保持相同的结果。
总结一下CNN网络需要解决的问题:

CNN网络架构

CNN_network_img
CNN网络架构图

从图中可以看出卷积层是为了解决前两点,而池化层解决第三点问题。

CNN的卷积层

卷积操作:


卷积操作

卷积操作就是将filter与图片的输入进行点乘(内积)。从上面动图可以看出filter的形状是3 * 3的,同时filter是移动的,不是固定的,这样一来就解决了“部件”的大小远小于图片大小和“部件”出现位置不固定的问题。 上面的卷积操作时单独出现在一个图片输入的矩阵上的,那么彩色图片输入是3个矩阵,那么这个如何进行卷积操作呢? 假设一张彩色的尺寸为28 * 28,那么他在程序中的表示为3 * 28 * 28,那么现在假设有9个filter大小为3,那么他的结构为3 * 3 * 3,在进行卷积操作的时候每个3 * 3的filter与单通道的28 * 28的图片进行点乘输出feature map,然后将三个feature map相加,那么这一个filter输出的feature map的大小为26 * 26,有9个filter总的输出形状为9* 26 * 26。 经过一层卷积操作的输出feature map形状的计算式为:

Shapeout=shapeinshapefilter+2paddingstride+1Shape_{out}=\frac{shape_{in}-shape_{filter}+2padding}{stride}+1
有些CNN网络在卷积的时候还会加上Bias,那么在进行点乘计算的时候将计算结果加上Bias即可。

CNN的池化层(下采样)

池化层的操作有很多种,常见的池化操作有最大池化,平均池化等。池化层的作用就是降维(防止过拟合)和保证feature map的不变性(例如平移,旋转,尺寸)。进行池化操作时先选定一个filter,规定他的大小和步长,下图是一个最大池化操作的讲解图:

CNN_Maxpooling
池化操作

对于每个2 * 2的窗口选出最大的数作为输出矩阵的相应元素的值,比如输入矩阵第一个2*2窗口中最大的数是6,那么输出矩阵的第一个元素就是6,如此类推。