date: 2018/04/18

update: 2020/03/26

梦のしずく(梦的点滴) - 松たか子:怀旧~小学时候听的歌


参考:

  1. Hands-On Machine Learning with Scikit-Learn and TensorFlow(2017)》Chap13
  2. 卷积神经网络——深度学习实践手册(2017.05)
  3. Deep Learning 深度学习(2017)


CNN原理

卷积神经网络主要由卷积层+激活函数+池化层组成,并且在最后用全连接层输出

12CNN.png


卷积层(Convolution)

卷积层并不是使用严格数学意义的卷积运算,而是使用保留卷积性质但抛弃可交换性的互相关函数;

卷积运算具有可交换性,这在数学证明上是很有用的,但在神经网络的应用中却是一个比较鸡肋的性质

卷积操作选用一定大小的卷积核(下图黄色区域)在原始数据上移动,与重合部分数据做乘和运算;

依次类推,最终输出一张特征图(Feature Map)

12Convolutional_Kernel.gif


卷积核的作用相当一个滤波器,其参数是经过学习得到的,可以用于提取图片中的特征;

由于核参数是随机初始化的,所以它们很可能会提取出不同的特征;

由低层的卷积层提取简单特征,然后逐层堆叠卷积层,将简单特征逐渐抽象为更高层次的语义概念;


多层小核卷积层可以实现单层大核卷积层的类似效果。

比如用三层3x3卷积核的卷积层可以提取到一层7x7卷积核的卷积层类似的特征——

12Multi_Conv_Layers.png

而且,使用多层小核卷积层由以下优势:

  1. 减少参数和计算量
    7x7卷积核有 个参数,而三层3x3卷积核只有  个参数
  2. 增加网络深度
    增加网络容量和复杂度


关于卷积层的更详细讨论可以参见《漫谈卷积层 | Hey~YaHei!


池化层(Pooling)

池化操作与卷积操作类似,但池化层是不需要参数的;

选用一定大小的池化核在原始数据上移动,与重合部分数据做一定的聚合运算(取均值、取最值、按一定概率随机取值等);

1581241191927.gif

依次类推,最终输出一张特征图。

关于卷积层的更详细讨论可以参见《漫谈池化层 | Hey~YaHei!


全连接层(Fully Connection)

参考:《全连接层的作用是什么?——魏秀参的回答 | 知乎


全连接层在CNN中起“分类器”作用,将卷积层、池化层、激活函数学到的特征表示映射到样本的标记空间。

    image.png

(随手画了张草图,找机会用visio重新画一张)


CNN可视化

论文:

  1. Adaptive Deconvolutional Networks for Mid and High Level Feature Learning(2011) 》提出反卷积技术
  2. Visualizing and Understanding Convolutional Networks(2013) 》用反卷积技术实现CNN可视化(以AlexNet为例)


网络压缩

深度神经网络面临严峻的过参数化(over-parameterization)问题,

如论文《Predicting Parameters in Deep Learning(2014)》指出只给定很小一部分参数子集(约5%)就可以完整地重构剩余的参数;


但事实上,参数的冗余在模型训练过程中是十分必要的,因为面临一个极其复杂的非凸优化问题,对现有基于梯度下降的优化算法而言,参数冗余保证了网络能够收敛到一个比较好的最优值。一定程度上,网络越深,参数越多,模型越复杂,最终效果也往往越好;


压缩既指体积上的压缩,也指时间上的压缩。

绝大多数压缩算法旨在将一个庞大而复杂的预训练模型转化为一个精简的小模型;

按对网络结构的破坏程度分,可以分为前端压缩和后端压缩——


图像预处理:zscore数据标准化

图像在输入CNN前,通常会先进行zscore数据标准化操作,也即

将数据标准化为均值0,标准差为1的分布。


以RGB图像为例,通常会在训练集(注意:不涉及验证集和测试集)上分别统计RGB三个通道各自的均值和标准差,然后以此对三个通道的数值进行标准化操作


有时候为了偷懒,也可以直接取,令的值域落到;其效果跟实际统计的相比多数情况下不会有太大的差距。


超参数

输入数据像素大小

在设备、时间条件允许的情况下,一般分辨率高的数据有助于网络性能的提升,尤其是对基于注意力模型的网络;

一般CNN最后采用FC作为分类器,如果改变了原模型的图像分辨率,也需要重新设定FC输入的滤波器大小以及其他相关参数


卷积层参数

包括卷积核大小、卷积步长、卷积核个数(即输出的特征图数量);


实践中通常采用3x3和5x5的小核,小的卷积核有以下作用:

  1. 增加模型复杂度,防止欠拟合
  2. 减少参数数量


卷积操作可以选择性的搭配填充操作(padding),有以下作用:

  1. 充分利用和处理输入数据的边缘信息
  2. 搭配合适的参数可以保持输入、输出大小不变,避免随着网络深度增加输入大小急剧减小
    对于fxf的卷积核、步长为1的卷积操作,在边缘各添加 个像素可以维持输入输出大小不变


为了便于GPU设备方便存储,卷积核个数也即输出的特征图数量通常为

可参考:《How can I decide the kernel size, output maps and layers of CNN? | Quora


论文:

  1. Efficient BackProp(1998)
  2. Systematic evaluation of CNN advances on the ImageNet(2017) 比较了ILSVRC上各种技术、模块在不同参数下的表现
    对应github评估项目:ducha-aiki/caffenet-benchmark | github


通常,


池化层参数