一、卷积核(convolutional kernel):
1.1 介绍
目标: 实现对应于输入的局部感知
实现方式: 对输入的某个局部块进行加权求和
理由: 感受野的提出(观察某个物体时我们既不能观察每个像素,也不能一次观察整体,而是先从局部开始认识)
举例: 卷积核的大小一般有1x1,3x3和5x5的尺寸(一般是奇数x奇数)。
卷积核参数定义、输出形状、计算量:
卷积核的形状定义为W*D*C 分别为单个感受野的长度宽度(一般长宽相等),卷积核的深度(对应于卷积核所需要提供的三维深度上的连接需要,也就是输入深度,输入矩阵的通道数)
卷积核的个数,每个卷积核大小形状的定义如上,但是可以定义多个卷积核,每一个卷积核,输出一个对应的结果,是一个一维的特征图(feature map),那么多个卷积核就会输出对应个数的特征图,堆叠在一起输出一个有深度的特征图矩阵。
(备注理解:卷积核的权值共享只在每个单独通道上有效,这句话的意思是,对应于输入的一个通道,有一个卷积核的一个通道去对应滑动并且计算过这个通道每一个部分,在这个输入通道的图片或者讲featuremap中,我们可以说这个权值是共享的,应用范围仅限于这一个featuremap通道,但是对应于输入的其他通道呢,会有卷积核的其他部分去做这个通道的感受野特征提取。所以说通道与通道间的对应的卷积核是独立不共享的)。
输入为32 32 1 卷积核为 3 3 1 1
卷积核的参数为3*3*1
输入为32 32 10 卷积核为 3 3 10 3
卷积核的参数为3*3*10*3
对应有了三个输出featuremap 分别是由三个卷积核分别的出来的
1.2 设计中的问题
关于卷积核大小设计的几个理解:
卷积核大小必须大于1才有提升感受野的作用,所以最常用于特征提取的卷积核不能为1
大小为偶数的卷积核即使对称地加padding也不能保证输入feature map尺寸和输出feature map尺寸不变(例如输入为4*4 卷积核大小为2*2,两边各加padding为1,滑动后一共有5个输出,与输入无法对应)
想要达到相同感受野,卷积核越小,所需要的参数量越小,同时计算量也有越小。
错误想法记录:(这下面一段是错误想法)
如果用小卷积核叠成两层我个人认为计算量会增加,如下图虽然参数量上两种方式分别为3*3+3*3 和 5*5 达到了感受也相同的目的 但是计算量上前者需要3*3*9+3*3次浮点型运算 后者需要5*5次运算即可(是由于这张图片引起的)
正确想法修正:(这下面一段是才是正确想法)
如果用小卷积核叠成两层总体计算量会减少,虽然上面一段计算看似没有什么错误但是实际上是不正确的,因为当输入的featuremap较大(大于5的时候)5*5这种卷积和设置方法所增加的计算量远远大于小卷积核的堆积
下面计算一下(假设输入featuremap为无限大H的一个矩阵)
使用这一张图片就会容易辨析很多
另外小卷积核的优势进行如下总结
优势一:
整合了一个以上个非线性**层,代替单一非线性**层,增加了非线性的拟合能力。
优势二:
减少了网络参数。
以3个3*3的级联卷积代替1个7*7的卷积为例:可以减少7*7-3*3*\3=22个参数,减少了45%的参数。
以2个3*3的级联卷积代替1个5*5的卷积为例:可以减少5*5-2*3*3=7个参数,减少了28%的参数。
优势三:
减少了计算量
以3个3*3的级联卷积代替1个7*7的卷积为例:可以减少7*7*L-3*3*3*L=22*L次计算,减少了45%的计算量。
以2个3*3的级联卷积代替1个5*5的卷积为例:可以减少5*5*L-2*3*3*L=7*L次计算,减少了28%的计算量。
优势四:
有感于1*1卷积核中还可以起到对通道数的升降进行控制的作用 (达到特征降维和升维的作用)。多个小卷积核的串联是否也可以在网络结构搜索中,给通道数设置增加更多的灵活性。
基于以上几个理解所以,一般都用3作为卷积核大小。
关于卷积核个数,卷积层深度的理解:
每一层卷积有多少卷积核(输出多少channel),以及一共有多少层卷积,这些暂时没有理论支撑,一般都是靠感觉去设置几组候选值,然后通过实验挑选出其中的最佳值。
多说几句,每一层卷积的channel数和网络的总卷积层数,构成了一个巨大的超参集合,这个超参集合里的最优组合,很可能比目前业界各种fancy的结构还要高效。只是我们一来没有理论去求解这个超参集合里的最优,二来没有足够的计算资源去穷举这个超参集合里的每一个组合,因此我们不知道这个超参集合里的最优组合是啥。
现在业界里提出的各种fancy结构中不少都是不断trial and error,试出来一个效果不错的网络结构,然后讲一个好听的story,因为深度学习理论还不够,所以story一般都是看上去很美,背后到底是不是这回事只有天知道。比如好用到不行的batch norm,它的story是解决internal covariate shift,然而最近有篇文章How Does Batch Normalization Help Optimization? (No, It Is Not About Internal Covariate Shift)通过实验证明实际情况并不如此。
推荐一篇讲如何设计CNN网络的文章A practical theory for designing very deep convolutional neural networks。
二、池化(pooling):
卷积特征往往对应某个局部的特征。要得到global的特征需要将全局的特征执行一个aggregation(聚合)。池化就是这样一个操作,对于每个卷积通道中的一块、每个卷积通道的一整个通道上的卷积特征进行pooling就可以得到更有全局性的特征。这里的pooling当然就对应了cross region。
没有完全整理的blog
卷积神经网络中图像池化操作全解析_深度学习思考者-****博客_图网络+池化 site:****.net
整理完的blog
卷积神经网络的卷积核大小、卷积层数、每层map个数都是如何确定下来的呢? - 知乎