卷积神经网络的结构细节

一方面是准备复试,一方面是因为毕业设计也是人脸检测的选题,最近想要学习一下这几年比较火的物体检测算法YOLO,参考一个教程想要复现pytorch实现该算法。参考的教程链接: link.
由于教程里面给出了cs231n关于卷积神经网络的介绍:link,我也就看了下,介绍的还是很详细,发现了很多之前并没有了解到的细节,所以记录下来,当做自己的学习笔记,同时也可以监督自己好好学习吧。

卷积神经网络结构细节

卷积神经网络结构

卷积神经网络和传统的神经网络的对比图如图:
卷积神经网络的结构细节
如上图所示,一个卷积神经层有三个维度:宽度width、高度height、深度depth
其实卷积神经网络跟传统神经网络原理没有什么不同,但是针对处理图片数据,由于一张图片包含了许多像素,而且一般来说一张彩色图像数据包含了RGB三个通道,如果仍然使用传统神经网络全连接的结构,则网络的参数过多,难以训练。所以卷积神经网络引入了卷积操作实现参数共享、池化pooling layer减少参数防止模型过拟合以及训练时间过长(也可通过加大stride步长来实现这一效果),前两年也出现了一些新的网络结构,比如
GoogLeNet的Inception architectures 极大的减少了网络的参数,以及 Residual Networks 。

卷积filters参数数量与细节

卷积神经网络的结构细节
如图所示,假设输入的图片数据规格是32*32*3,3代表RGB三个通道,第二层蓝色的神经层,是7*7*89,我们采用3*3的卷积filter进行局部神经元连接和参数共享。虽然通常情况下卷积filter规格写的是n*n,但是实际上其规格大小是n*n*m,其中n代表卷积filter的宽和高,m等于上一层的神经层的深度width,比如上面输入层深度是3,所以每个卷积模板大小是3(height)*3(width)*3(depth),共有27个参数,这27个权值参数,是蓝色神经层中的每一深度对应的7*7=49个神经元所共享的,具体来说,卷积模板filter中每一深度的切面3(height)*3(width)与输入层中对应深度的切面32*32进行卷积操作,得到的7*7切面,然后不同深度的切面相加得到第二层神经层中(蓝色)的一个切面。使用89个不同的filters,得到蓝色神经层中89个不同的切面,深度就是89。
如果用全连接,则从输入层到第二层的权重参数个数为(32*32*3)*(7*7*89)=13396992,这么多参数,如果深度网络多层叠加,那要训练的参数数量简直爆炸,而卷积结构,参数个数仅为27*89=2403。

前后卷积层大小计算总结

卷积神经网络的结构细节
其中F是卷积模板的大小F*F。

卷积网络层与层之间的计算

为了实现卷积网络层与层之间的快速前馈计算,实际操作中都是以矩阵相乘的形式。具体是利用im2col来实现。将卷积神经层3维矩阵展开成columns拼接成新的2维矩阵。
卷积神经网络的结构细节
比如上面图片所介绍,假设输入大小是227*227*3,卷积模板大小为11*11*3,模板展开为11*11*3=363长的向量,如果步长为4,则一个卷积filter共在((227-11)/4+1=55)*55个局部位置进行卷积操作过,也就是在55*55=3025个小矩阵(11*11的小矩阵)上移动过,每个小矩阵都可以展开成363长的向量,所以共有3025个向量。可以把输入层到第一个隐层的连接情况,理解成传统神经网络全连接的形式,输入数据为3025个363维度的向量,经过线性变换,得到3025个96(96个卷积filters)维度的输出向量,从这个角度来看,其实卷积神经网络和传统神经网络没有什么区别,只是数据向量之间有很多重复数据。所以繁琐的卷积操作、卷积模板移动过程可以简化成两个矩阵相乘。即X[3025*363]与W[363*96]相乘得到Y[3025*96],最后将得到的Y二维矩阵恢复成55*55*96的三维矩阵形式。

全连接层和卷积层的相互转化

一般来说,卷积层之后需要连接全连接层,以得到最后的一维结果。如最后一层卷积层输出大小为7*7*512,首先先把该3维数据展开成一维向量1*25088(其中25088=7*7*512),然后再通过全连接层输出1*4096的向量。这一操作可以替代成用4096个 7*7的模板局卷积,也能得到1*1*4096的输出,前后这两种输出的意义其实是一样。

多个选择小的卷积层

卷积神经网络的结构细节
正如上面截图所说,连续三次使用3*3的卷积模板进行卷积操作,相当于使用一次7*7的卷积操作,但是通过计算可以发现,前者的权值参数数量更少。