提纲
- 上下文
- 卷积:空洞卷积
- 池化:Adaptive Pool
- 填充:paddings=[h_diff//2, h_diff - h_diff//2, w_diff//2, w_diff - w_diff//2]
- 感受野、多尺度:不同层的特征图、不同尺度卷积核、空洞卷积
- 上采样 / 特征图变大的三种方式:双线性插值、反卷积、反池化
- 信息融合的方式:直接相加、concat + 1x1 卷积
PS :
- a,b = 1 是将数值1同时赋值给a、b 两个变量
- 网络安全:美团密码不能是身份证中连续数字
上下文
图1:上下文
上下文是什么?
- 物体空间依赖:人脸是人体的一部分
- 语义类别依赖:厨房中常见厨具(共现关系),厨房中不应该出现床(互斥关系)
- 场景先验:在知道背景是操场的情况下,应该出现草地、足球,而不应该出现床或者厨具。
通俗理解来说:一篇文章,给你摘录一小段,没前没后,你读不懂,是因为没有了语境,也就是没有了语言环境的存在,一段话说了什么,要通过上下文(文章的上下文)来推断(链接 )。
而在深度学习中,上下文信息对当前像素位置的信息判断也是有帮助的,举个例子:有一个物体,你对它的预测是 汽车 或者是 船 且预测的可能性是相同的,这时候如果你知道它周围的像素都是属于 水 那一类,自然就应该将该物体分类为船,而不是汽车。在这里“ 它周围的像素都是属于 水 那一类 ” 就是上下文。
卷积(Convolution)
卷积:
- 卷:翻转 + 滑动
- 积:加权求和
整体看来是这么个过程:
翻转——>滑动——>叠加——>滑动——>叠加——>滑动——>叠加…
此图出处:链接
为什么实际过程中没有对卷积核进行翻转操作?
因为卷积核的参数是可学习的,将其翻转之后在学习和直接对不翻转的卷积核进行学习,学习到的卷积核结果是一样的(一样的体现:二者差的只是一个翻转,如果翻转后,二者会完全一样)。
卷积公式:
空洞卷积(Dilated Convolution):
空洞卷积
- 空洞卷积,中间空出来的位置填0 ,卷积核只是看起来是变大了
- 空洞卷积优点:增大感受野
空洞卷积公式:
此图出处:链接
- 其中 D ,是空洞卷积中的参数,表示的是将原
参考文章:
- 从不同角度理解卷积:知乎链接
- 关于卷积的一些想了解的问题:CSDN链接
- 卷积核一定越大越好?(不一定,因为卷积核越大,记录的信息越多,计算量越大,不利于模型深度的增加。)
- 每层卷积只能用一种尺寸的卷积核?(Inception结构,一层卷积中使用了不同尺度的卷积模块。但参数量增加导致计算量增加了)
- 怎样才能减少卷积层参数量?(1x1 卷积降维)
- 能否让固定大小的卷积核看到更大范围的区域?(Dilated convolution,空洞卷积)
- 未来一些趋势:
- 卷积核方面:
- 大卷积核用多个小卷积核代替;
- 单一尺寸卷积核用多尺寸卷积核代替;
- 固定形状卷积核趋于使用可变形卷积核;
- 使用1×1卷积核(bottleneck结构)。
- 卷积层通道方面:
- 标准卷积用depthwise卷积代替;(depthwise卷积,对输入层的每个通道独立进行卷积运算)
- 使用分组卷积;
- 分组卷积前使用channel shuffle;
- 通道加权计算。
- 卷积层连接方面:
- 使用skip connection,让模型更深;(残差块的连接方式,为了解决在训练的过程中梯度爆炸和梯度消失问题。)
- densely connection,使每一层都融合上其它层的特征输出(DenseNet)
- 卷积核方面:
- 如何理解空洞卷积:知乎链接,主要是有两个gif动图,形象的描述了正常卷积和空洞卷积。
填充:paddings=[h_diff//2, h_diff - h_diff//2, w_diff//2, w_diff - w_diff//2]
池化
- 最大池化
- 平均池化
- Adaptive Pool:池化结果可以不满足 H=W
Adaptive Pool
- 行列是分开计算的, i 就是指具体的第 i 行 或 第i列 。
- 区别:
- 正常的池化操作,Hin/Hout 在 H 和 W 维度,二者是相等的。
- Adaptive Pool,Hin/Hout 在 H 和 W 维度,二者是可以不同的。
感受野
感受野:在卷积神经网络中,感受野(Receptive Field)的定义是卷积神经网络每一层输出的特征图(feature map)上的像素点在输入图片上映射的区域大小。再通俗点的解释是,特征图上的一个点对应输入图上的区域。
为什么需要多尺度?
- 距离不同,在原图上所占区域不同:近大远小。
- 个体差异:距离相同,人和猫在原图上所占区域不同。
上采样(特征图变大的三种方式)
参考链接:博客园链接
问:反池化时:填回去的时候怎么知道填在哪?
答:有一些框架在实现 UnPooling 时需要给一个 Indices 来记录原来哪些最大值所在的 block 中的位置信息。
反卷积计算过程:
- 第一步:将卷积核做一个翻转(水平翻转 + 垂直翻转 --> 最终是关于原来的一个中心翻转)。(PS:标准卷积过程是先对卷积核做180度的中心翻转,然后进行滑窗卷积过程)
- 第二步:padding ,简单来说,填充实现的目标是:卷积核右下角元素与数据左上角元素能够重合。(填充 = (卷积核大小 - 1 )* 2 , 乘 2 原因是因为在上下左右两侧都需要进行填充)。
- 第三步:执行正常的卷积过程,卷积结果就是上采样得出的结果。
矩阵角度理解反卷积
信息融合的方式:
- 直接相加:后面再接其他卷积核进行学习
- concat + 1x1 卷积(降维,否则计算量太大)
concat 举例