弄清楚CNN,需要解决两个问题,一是卷积层(Convolution层),二是池化层(Pooling 层)
卷积层
为什么要卷积
有没有思考过一个问题,为什么CNN大多使用在图像场景,而RNN大多使用在文本的场景中?有了全连接层,为什么还要CNN?现在来揭晓答案吧.图像数据通常是长,高,通道方向上的3维形状.含有空间信息特征.比如说,相邻的空间,像素应该是相近的. 而卷积的特征是可以保持形状不变.也就是说,如果输入一个3维形式的数据,那么输出一个同样3维的数据到下层,所以卷积这个操作更加有可能提取出隐藏的本质模式.与卷积相反,以全连接层为输入,忽视形状,将3维的输入拉直为一维向量,例如将MNIST输入图像,(1,28,28)的形状,拉直成784的向量, 所以无法利用与形状相关的信息.
卷积如何运算(感性认识)
一句话来说明卷积运算就是按照通道,把输入数据和滤波器卷积运算,结果相加,得到输出.
cnn.jpg输入的3维数据和滤波器都可以表示成一个多维数组,用(channel ,height,width )来表示.上图可以得到,经过计算后可以看到输出是一张特征图.如果需要通道上也有多个卷积计算输出,那么需要多个滤波器.
cnn-2.jpg这个时候的多维数组,用(output_channel ,input_channel , height,width )来表示.比如通道数3,10个大小2*2的滤波器,就可以写成(10,3,2,2).
卷积如何运算(本质认识)
下面盗用github上的CNN课程中的图来详细描述CNN的参数如何参与运算的。
图解cnn.png首先看网络的输入, input_image ,是一张通道数为1,数值为7的灰度图, 第一层卷积有16个(5 * 5)的卷积核,这个环节的计算过程是,先取第一个5*5的卷积核,和input_image 的左上角的对应元素点积运算,得到第一个value值,接下来,按照5 * 5卷积核左移stride 个单位,和input_image的对应元素再做点积运算,得到第二个value值,重复运算,直到卷积核移动到input_image右下角的最后一块元素。
这轮计算的所有value值按计算顺序排列,就是卷积的结果了,也就是上图中第三张图14 * 14 pixel下面的第一张灰度图7。由于第一卷积层有16个卷积核,每个卷积核做的事情(计算)都是一样的,因此得到16个(channel)(14 * 14)pixel的image。为什么第一张灰度是(28 * 28),现在变成(14 * 14)? 很简单,因为进行池化操作了。
接下来第二个卷积层就比第一个复杂多了。这也是验证是不是正确理解卷积过程的关键。要提醒的一点是,经过第一层卷积之后,原来通道数只有1的灰度图7,已经变成通道数为16的灰度图,那么同样是(5 * 5)的卷积核,这轮的计算过程是,取图4第一组(16个的(5 * 5)的卷积核)第1个卷积核与图3第1个7的左上角点积运算,得到value1, 接着图4第二组16个的(5 * 5)第1个卷积核与图3第2个7的左上角点积运算,得到value2, 重复计算,直到图4 第16组的第1个卷积核,计算得到value16,将value1+value2 +...+ value16的结果就是图5第一图左上角的值,16组卷积核同时向左移动stride个单位,相同的计算方法,得到图5第一图左上角第二个图。
明白了这个过程之后,后面的计算也就不难理解了,取16组(5 * 5)卷积核的第2,3,...36个卷积核,同样的计算,最后就得到图5,36个channel的(7 * 7) image.
池化层
如果说卷积层的作用是提取特征,那么池化层又是一个什么存在?池化层直观的作用就是减少网络的参数,然后进一步提取局部特征. 池化层的专业解释是池化是缩小高,长方向上的空间运算.
看图说话,对于原始特征图,用一个做maxpooling.最后特征图就缩小到一个大小的特征图了.对于一个庞大的网络来说,通过这样的方法,能大大减少网络的参数和复杂度.
因为池化层不存在参数学习,只对特征图做局部的运算,所以就算输入数据发生微小的偏差,池化都会返回相同的结果,严谨的语言表述就算池化对微小位置变化具有鲁棒性.为什么这么说,我们在一个步幅内(比如2*2),不管是及其组合,都是取一个最值,那么在这个步幅内,就算输入的值有微小差别,池化也会返回相同的值.认真看上图,左右两边特征图,可以发现是不同的,但是经过相同的 maxpooling之后,最后得到的特征是相同的.
结束语
CNN的代表网络LeNet ,AlexNet ,虽然很复杂,但是拆看看,除了用了一些trick, 就是卷积和池化的组合使用,读者可以看看论文,看他们的是怎么组合使用的.
网友评论