CNN卷积神经网络学习笔记

对CNN卷积神经网络学习过程中的学习笔记,会持续更新。

本文所说的CNN(Convolution Neural Network)是卷积神经网络的英文首字母,非"美国有线电视新闻网(Cable News Network)"。

CNN结构大同小异,主要由三个部分构成:

1.卷积层(Convlolutional layer)
2.池化层(Pooling layer)
3.全连接层(Full connected layer)

卷积层:

卷积层由多个卷积核构成,卷积核为带有表示权重大小的矩阵。

卷积公式:


它的物理意义大概可以理解为:系统某一时刻的输出是由多个输入共同作用(叠加)的结果。

放在图像分析里,f(x) 可以理解为原始像素点(source pixel),所有的原始像素点叠加起来,就是原始图了。

g(x)可以称为作用点,所有作用点合起来我们称为卷积核(Convolution kernel)。

卷积核上所有作用点依次作用于原始像素点后(即乘起来),线性叠加的输出结果,即是最终卷积的输出,也是我们想要的结果,我们称为destination pixel.



卷积过程动态图

卷积的意义:

提取特征。

卷积后输出单元数量计算:

一个输出单元的大小有以下三个量控制:depthstride 和 zero-padding

  • 深度(depth) : 顾名思义,它控制输出单元的深度,也就是filter的个数,连接同一块区域的神经元个数。又名:depth column
  • 步幅(stride):它控制在同一深度的相邻两个隐含单元,与他们相连接的输入区域的距离。如果步幅很小(比如 stride = 1)的话,相邻隐含单元的输入区域的重叠部分会很多; 步幅很大则重叠区域变少。

  • 补零(zero-padding) : 我们可以通过在输入单元周围补零来改变输入单元整体大小,从而控制输出单元的空间大小。

输出单元数量计算定义如下:

  •  : 输入单元的大小(宽或高)
  •  : 感受野(receptive field)
  •  : 步幅(stride)
  •  : 补零(zero-padding)的数量
  •  : 深度,输出单元的深度

则可以用以下公式计算一个维度(宽或高)内一个输出单元里可以有几个隐藏单元: 

如果计算结果不是一个整数,则说明现有参数不能正好适合输入,步幅(stride)设置的不合适,或者需要补零。

池化层:

池化主要方式:

1) mean-pooling,即对邻域内特征点只求平均,对背景保留更好;

2) max-pooling,即对邻域内特征点取最大,对纹理提取更好;

3) Stochastic-pooling,介于两者之间,通过对像素点按照数值大小赋予概率,再按照概率进行亚采样;

作用:

1. invariance(不变性),这种不变性包括translation(平移),rotation(旋转),scale(尺度)

2. 获得定长输出。(文本分类的时候输入是不定长的,可以通过池化获得定长输出)

3. 保留主要的特征同时减少参数(降维,效果类似PCA)和计算量,防止过拟合,提高模型泛化能力

做窗口滑动卷积的时候,卷积值就代表了整个窗口的特征。因为滑动的窗口间有大量重叠区域,出来的卷积值有冗余,进行最大pooling或者平均pooling就是减少冗余。

减少冗余的同时,pooling也丢掉了局部位置信息,所以局部有微小形变,结果也是一样的。就像图片上的字母A,局部出现微小变化,也能够被识别成A。
而平移不变性,就是一个特征,无论出现在图片的那个位置,都会识别出来。
所以平移不变性不是pooling带来的,而是层层的权重共享带来的[1]。


全连接层:

全连接层(fully connected layers,FC)在整个卷积神经网络中起到“分类器”的作用。如果说卷积层、池化层和激活函数层等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的“分布式特征表示”映射到样本标记空间的作用,大大减少特征位置对分类带来的影响因为空间结构特性被忽略了,所以全连接层不适合用于在方位上找Pattern的任务,比如segmentation。

泰勒公式 用多项式函数去拟合光滑函数,全连接层中一层的一个神经元就可以看成一个多项式;用一层fully connected layer 有时候没法解决非线性问题,而如果有两层或以上fully connected layer就可以很好地解决非线性问题了。

在实际使用中,全连接层可由卷积操作实现:对前层是全连接的全连接层可以转化为卷积核为1x1的卷积;而前层是卷积层的全连接层可以转化为卷积核为hxw的全局卷积,h和w分别为前层卷积结果的高和宽

以VGG-16为例,对224x224x3的输入,最后一层卷积可得输出为7x7x512,如后层是一层含4096个神经元的FC,则可用卷积核为7x7x512x4096的全局卷积来实现这一全连接运算过程,其中该卷积核参数如下:

“filter size = 7, padding = 0, stride = 1, D_in = 512, D_out = 4096”

经过此卷积操作后可得输出为1x1x4096。

如需再次叠加一个2048的FC,则可设定参数为“filter size = 1, padding = 0, stride = 1, D_in = 4096, D_out = 2048”的卷积层操作[2]。

Reference: https://www.zhihu.com/question/41037974/answer/320267531

CNN训练过程:

如何调整Filter的权重:通过反向传播
反向传播过程:
1) 向前传递
2) 损失函数
3) 向后传递
4) 权重更新

开始阶段权重都是随机的,无法找出低层次的特性,无法得出分类的合理结论。

损失函数:

如何比较预测值和目标值的差异,用于衡量预测值和目标值的差异的方程。损失函数的输出值越高表示差异值越大。损失函数常见定义时MSE(平均平方误差)即(实际的-预测的)平方:
  

如何缩小loss:

梯度下降法:通过使loss值向当前点对应梯度的反方向不断移动来降低loss。一次移动多少是由学习速率(learning rate)控制的。
使用梯度下降训练神经网络有两个难题:
1、 局部最小值   梯度下降寻找的时损失函数的局部最小值,而我们想要的是全局最小值。
解决办法:
调节步伐:调节学习速率,使每一次的更新的“步伐”不同,常用方法有:
1) 随机梯度下降(SGD):每次只更新一个样本所计算的梯度
2) 小批量梯度下降(mini-batch gradient descent):每次更新若干样本所计算的梯度平均值
3) 动量(momentum):不仅仅考虑当前样本所计算的梯度
4) Neserov动量:momentum的改进
5) Adagrad、RMSprop、Adadelta、Adam:这些方法都是训练过程中依照规则降低学习速率
优化起点:合理初始化权重(weights initialization)、预训练网络(pre-train),使网络获得一个较好的“起始点”,如最右侧的起始点就比最左侧的起始点要好。常用方法有:
1) 高斯分布初始权重(Gaussian distribution)
2) 均匀分布初始权重(Uniform distribution)
3) Glorot初始权重
4) He初始权重
5) 稀疏矩阵初始权重(sparse matrix)
2、 梯度计算 

反向传播算法

为了达到预测的标签和训练标签一致的目的,需要最小化损失。把最小化损失看作微积分中的一个优化问题,找出时哪些输入直接导致了网络中的损失。


 
这是一个数学上的等价于dl/dw,其中W是一个特定层的权重。
 
学习速率是由程序员选择的一个参数。高学习率意味着在权重更新中会采取更大的步骤,因此,模型在最优权重集上的收敛可能会花费更少的时间。然而,一个太高的学习速率会导致跳得太大而不够精确以至于无法达到最佳点。

转发传递、丢失功能、反向传递和参数更新的过程是一个训练迭代。这个程序将重复这个过程,为每组训练图像(通常称为批处理)进行固定次数的迭代。一旦在上一个培训示例中完成了参数更新,希望网络应该得到足够的训练,从而使各个层的权重得到正确的调优。



参考文献

[1].CNN网络的pooling层有什么用? - 知乎https://www.zhihu.com/question/36686900

[2].全连接层的作用是什么? - 蒋竺波的回答 - 知乎https://www.zhihu.com/question/41037974/answer/320267531

猜你喜欢

转载自blog.csdn.net/weixin_42367212/article/details/80563179