CNN阶段学习笔记
由于毕设需要,恶补关于卷积神经网络(CNN)的知识。为了方便自己复习巩固,随时总结补充。本人理解浅薄,欢迎各路大神指点小白~~😁
CNN与普通的神经网络最大的不同有两点:
- 局部连接 locally connection
- 权值共享 shared weights
1.局部连接
我们都知道,普通的神经网络,每一层的神经元都和下一层所有的神经元相连接(fully connected),如下图所示
相反地,就是局部连接,如下图所示
同时借此图补充一个"接受域"的概念。上图中每层中的神经元与上一层的3个神经元相连接,那么该层的接受域就为3。
显然,局部连接可以大大降低参数个数。
再以二维图像输入为例。假设有一图像大小为1000*1000。我们可以对比全连接与部分连接的参数个数
如上图所示,这里的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)
这里的strides
,padding
两个参数困扰本渣好久,他们也对应于二维卷积操作时的具体控制参数。
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
平均池化,就是取邻域内的加权平均。
Drop out
(to be continued...)
参考资料
当我们在谈论 Deep Learning:CNN 其常见架构(上)
卷积神经网络
卷积神经网络(CNN)
An Intuitive Explanation of Convolutional Neural Networks