CNN阶段学习笔记

由于毕设需要,恶补关于卷积神经网络(CNN)的知识。为了方便自己复习巩固,随时总结补充。本人理解浅薄,欢迎各路大神指点小白~~😁

CNN与普通的神经网络最大的不同有两点:

  • 局部连接 locally connection
  • 权值共享 shared weights

1.局部连接

我们都知道,普通的神经网络,每一层的神经元都和下一层所有的神经元相连接(fully connected),如下图所示
fully connected
相反地,就是局部连接,如下图所示
locally connected

同时借此图补充一个"接受域"的概念。上图中每层中的神经元与上一层的3个神经元相连接,那么该层的接受域就为3。

显然,局部连接可以大大降低参数个数。
再以二维图像输入为例。假设有一图像大小为1000*1000。我们可以对比全连接与部分连接的参数个数
全连接vs部分连接

如上图所示,这里的filter其实就是所谓的卷积核kernel,一个filter只与10*10大小的像素相连,这样参数的个数为1000000*100,是全连接的1/10000。

2.权值共享

那么如果想继续减少网络参数呢?答曰:权值共享!
还拿上图的例子来说,如果那1000000个神经元的参数都一样,那么他们实质上就是同一个卷积核了,这样参数数目就继续缩小为10*10=100个了

卷积核

不同的卷积核对应的是不同的参数,对同一个输入施加不同的卷积核进行卷积,输出的不同的图(也就是feature map)叫做不同通道。

卷积操作

本人是用tensorflow来实现卷积的,对应的函数是:tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)

这里的stridespadding两个参数困扰本渣好久,他们也对应于二维卷积操作时的具体控制参数。

1.步长(strides)

可以把卷积核看作是一个矩形窗口,当这个窗口在某个位置完成一次卷积操作后,他需要进行水平or竖直方向上的滑动,‘步长’就是控制每次滑动的距离的。下面演示的就是两个方向步长都为1的情况
注意窗口的滑动

2.填充(padding)

所谓“填充”,可以预想,当你在水平向右平移窗口时,可能会遇到窗口“出界”的情况,这时就有两种选择了,对应padding='SAME'(填充0元素),或者是padding='VALID'(不填充元素)。

what's more,有意思的是这两种控制参数会影响输出的特征图的大小,此处总结下:
假设输入的图像的长和宽相等,且输入图的大小为x*x,卷积核大小为f*f,步长为s

填充方式 'SAME' 'VALID'
输出的大小y
需要填充的行(列)数 0

3.池化(pooling)

池化的本质就是采样,也达到了降低feature map维度的效果,同时使得得到的特征更加鲁棒。比如有一个p*p大小的池化核,具体实现的时候,它和卷积核的移动是有区别的,在操作完feature map后,就直接滑到下一个p*p的窗口(可以看作移动步长就是p)。
池化最常见的有两种:

  • max pooling 最大池化
  • mean pooling 平均池化
a. max pooling

最大池化,顾名思义,就是取p*p邻域内的最大值作为输出。

b. mean pooling

平均池化,就是取邻域内的加权平均。
pooling and downsampling

pooling

Drop out

(to be continued...)

参考资料

当我们在谈论 Deep Learning:CNN 其常见架构(上)
卷积神经网络
卷积神经网络(CNN)
An Intuitive Explanation of Convolutional Neural Networks

posted @ 2018-03-12 17:22  从菜鸟开始  阅读(451)  评论(0编辑  收藏  举报