引言
Convolutional Neural Network 是一种在计算机视觉和其他领域很常用的一种神经网络,它的结构主要包括一下几个层:
- Convolutional Layer(CONV layer): 卷积层
- Rectified Linear Unit: **层
- Polling Layer: 池化层
- Fully-Connected Layer: 全连接层
卷积层
这里先介绍卷积层,以及经过卷积层后,输出图像的大小。
假设我们有一张输入图片(默认为一维),大小为:n * n。 我们把输入看为一个 n * n 的矩阵。
(1)此时,我们用一个大小为 f * f 的filter(过滤器)对原图片进行卷积操作,得到的图片大小为:
(n-f+1)* (n-f+1)
如果你将这个过程表示出来,你会发现这个方法的缺点:
- 减小了图片的大小
- 边界点被处理的次数很少,因为filter经过它们的次数有限
- 中心点被处理的次数过多,因为filter经过它们太多次
那么,如何解决边界点和中心点被处理次数不均匀的问题呢?
答案是利用padding(填充),这种方法。
(2)padding
何为padding呢?就像这个名字一样,填充,就是在原有的图片外围填充额外的像素 0。这里假设padding的大小为p,那么经过padding后,原有图片的大小扩大了2p。(因为左和右,上和下,各自增加了p)
例如,p=1, 就使用1个像素的额外边缘填充了一圈。
此时,经过了padding的输出的图片大小为:
(n-f+2p+1)*(n-f+2p+1)
那么我们需要设置padding的个数为多少呢(p=?)?
这里一般有两种padding为方法:
- valid:就是没有padding,不填充,原来图片是什么样还是什么样。那么此时的输出图片大小为:(n-f+1)* (n-f+1)
- the same :就是经过了padding以后,使得输出图片的大小,与输入图片的大小一样大:(输出=输入)
此时,(n-f+2p+1)* (n-f+2p+1)= n * n
即为:(n-f+2p+1)= n,那么经过计算:p = (f-1)/2
(3) sride
stride 就是步长的意思,就是filter每次移动的像素数,用s来表示,s=1,就是filter每次移动一个步长。这里通常没有明确指出s的时候,s默认为1.
现在,我们设定图像大小 n * n, filter 大小 f * f, stride(步长) s, padding(填充) p, 那么输出图像大小为:
若该公式不能被整除,那就向下取整:
关于卷积层convolutional layer 的主要概念介绍就完成了。其实如果你去google或者百度convolution的概念,你会发现,convolution的定义其实包含翻转等操作。但是,在这里,cnn里的convolutional layer不需要翻转,它其实更应该叫做cross-correlation(交叉相关)。
参考
这段话以及上面的公式,都来源于Andrew Ng的公开课,在coursera上面可以找到。网站的链接为:
CNN_introduction_by Andrew Ng