文章目录
——————————————————————————————————————
空洞卷积
参考文章:
https://zhuanlan.zhihu.com/p/50369448
https://www.zhihu.com/question/54149221/answer/323880412
概述
空洞卷积在神经网络处理中,可以理解为是相比于传统的卷积(卷积核和特征图),是在特征图里添加空洞。以此来增加感受野。相比原来的正常 c o n v o l u t i o n convolution convolution卷积, d i l a t e d c o n v o l u t i o n dilated convolution dilatedconvolution空洞卷积 多了一个 h y p e r − p a r a m e t e r hyper-parameter hyper−parameter超参数 称之为 dilation rate 指的是 k e r n e l kernel kernel的间隔数量。
模型
空洞卷积模型如下所示:
这里只讨论在目标检测任务中,空洞卷积的作用。在参考的文章中指出,在池化层和上采样层中,比如池化来说,假如是最大池化,在实际的操作中,在规定的核(3x3区域)寻找最大值,最大值保留,其余值剔除,这会导致内部数据结构丢失–空间层级化信息丢失。而空洞卷积表明,他正好可以解决这种丢失内部数据的问题。与正常的卷积不同的是,空洞卷积引入了一个称为 “扩张率(dilation rate)”的超参数(hyper-parameter),该参数定义了卷积核处理数据时各值的间距。扩张率中文也叫空洞数(Hole Size)。为了更好的理解 dilation rate到底是什么,请看下图,大致的意思就是卷积核之间的间隔数,实际上这个间隔数等于
d
i
l
a
t
i
o
n
r
a
t
e
−
1
dilation rate - 1
dilationrate−1,如下图所示:(图片来源于参考文章)
计算感受野:
https://zhuanlan.zhihu.com/p/113285797
优点
扩大感受野:在深层网络中为了增加感受野且降低计算量,总要进行降采样,这样虽然可以增加感受野,但空间分辨率降低了。为了能不丢失分辨率,且仍然扩大感受野,可以使用空洞卷积。这在检测,分割任务中十分有用。一方面感受野大了可以检测大目标,另一方面分辨率高了可以精确定位目标。
捕获多尺度上下文信息:空洞卷积有一个参数可以设置dilation rate,具体含义就是在卷积核中填充dilation rate个0,因此,当设置不同dilation rate时,感受野就会不一样,也即获取了多尺度信息。多尺度信息在视觉任务中相当重要啊。
不足
从这里可以看出,空洞卷积可以任意扩大感受野,且不需要引入额外参数,但如果把分辨率增加了,算法整体计算量肯定会增加。
可变形卷积
参考文章
https://zhuanlan.zhihu.com/p/62661196
模型
通过研究发现,标准卷积中的规则格点采样是导致网络难以适应几何形变的“罪魁祸首”,为了削弱这个限制,对卷积核中每个采样点的位置都增加了一个偏移变量,可以实现在当前位置附近随意采样而不局限于之前的规则格点。如下图所示,常见的采样点和可变形卷积采样的对比:
图A是卷积中的标准卷积核,图B是可变形卷积,加上偏移量之后的卷积采样点,C和D是特殊的可变形卷积
在可变形卷积中,可变形卷积操作和池化操作都是二维的,都是在同一个channel上进行的。在常规的卷积中:输入的特征图(feature map)上使用规则的网格R进行卷积(固定的卷积核,比如3x3大小),进形加权运算(矩阵乘法),卷积核R定义了感受野的大小。
可变形卷积———如何操作????
关于双线性插值:
假设原图像大小为
m
∗
n
m*n
m∗n,目标图像的大小为
a
∗
b
a*b
a∗b,那么两幅图像的边长比为
m
/
a
,
n
/
b
m / a,n / b
m/a,n/b。注意,通常这个比例不是整数,而非整数的坐标是无法在图像这种离散数据上使用的。双线性插值通过寻找距离这个对应坐标最近的四个像素点,来计算该点的值。比如,对应的坐标为
(
2.5
,
4.5
)
(2.5,4.5)
(2.5,4.5),那么最近的像素是
(
2
,
4
)(
2
,
5
)(
3
,
4
)(
3
,
5
)
(2 ,4)(2,5)(3,4)(3,5)
(2,4)(2,5)(3,4)(3,5)若图像为灰度图像,那么最终的
(
i
,
j
)
(i , j)
(i,j)的灰度值可以通过以下公式计算:
f
(
i
,
j
)
=
∑
i
=
1
4
W
i
×
P
i
=
W
1
×
P
1
+
W
2
×
P
2
+
W
3
×
P
3
+
W
4
×
P
4
f(i , j) = \sum_{i=1}^{4}W_i \times P_i = W_1\times P_1+W_2\times P_2+W_3\times P_3+W_4\times P_4
f(i,j)=i=1∑4Wi×Pi=W1×P1+W2×P2+W3×P3+W4×P4
其中:
P
i
(
i
=
1
,
2
,
3
,
4
)
P_i(i = 1,2,3,4)
Pi(i=1,2,3,4)为最近的四个像素点,
W
i
(
i
=
1
,
2
,
3
,
4
)
W_i(i = 1,2,3,4)
Wi(i=1,2,3,4)为四个像素点各自的权值。
可变形卷积的网络结构:
根据上图来理解,在输入的input feature map中,普通的卷积的操作过程可以理解为滑动窗口的形式,在输入的特征图中,如绿色的窗口(小区域)所示。引入可变形卷积后,卷积的过程变为两路来实现,共享input feature map。如上图所示,上面的一路用一个额外的卷积层来学习offset(可以理解为偏移量),得到
H
×
W
×
2
N
H\times W\times 2N
H×W×2N的输出offect(偏移量),其中2N表示有x,y两个方向的偏移,得到了这个偏移量之后,原始的卷积滑动窗口就不是在以前input feature map上规则的绿色小区域,而是得到经过平移后的不规则多个小区域(input feature map中的蓝色小区域),当得到这些蓝色小区域(可变形卷积)后,卷积过程就和常规卷积一致了。这样input feature map 和 offset 共同作为可变形卷积层(deformable conv)的输入。
该文章中特别提醒可变形卷积到底可变形(deformable)在哪里?这里指出,可变形卷积学习的不是可变形的卷积核(kernel),可变形卷积而是对input feature map 的每个位置学习一个offset(偏移量)。
最后总结的说:就是可变形卷积相比于普通的卷积从形状来说,确实不再是标准的小区域(方块),而是不规则的多个采样点,造成这种原因是因为可变形卷积的每个采样点都学习到了关于输入特征图的宽和高的一个偏移量。这个偏移量是卷积层在输入特征图学习到的超参数。
————————————————————————————————
当我看到这里的时候,以为理解了可变形卷积,但是该篇文章的评论提出了众多的疑问,所以这篇文章的理解还是不够透彻,有些细节还需要搞懂,还记得在开始的双线性插值吗,在最后的可变形卷积的计算过程中,丝毫没有体现出来双线性插值的作用,而且这个偏移量到底怎么回事?怎么来的都存在问题------>下面是另一篇文章的解释:
该文章直接就说了比较有意思的一个有道理的一句话:卷积核不应当限制在仅仅是方形和矩形核,形状能动态变化的卷积核似乎更加符合常理。
参考文章
https://zhuanlan.zhihu.com/p/340229225
Inception结构
模型
最初版本的Inception结构如下图所示,一个输入的feature map分别同时经过1×1、3×3、5×5的卷积核的处理,得出的特征再组合起来,获得更佳的特征。
但这个结构会存在一个严重的问题:参数量比单个卷积核要多很多,如此庞大的计算量会使得模型效率低下。因此,在该基础上加了
1
×
1
1\times1
1×1卷积,新的Inception结构如下图所示:
在新设计的Inception结构中,
1
×
1
1\times1
1×1卷积的作用总的概述就是:对于高维通道的输入,如果直接进行
3
×
3
3\times3
3×3卷积,输出与输入通道数一致,这样下来参数量会非常的大,所以设计者对输入的特征图直接经过
1
×
1
1\times1
1×1卷积,先进行降维操作,在经过
3
×
3
3\times3
3×3卷积,然后再经过
1
×
1
1\times1
1×1卷积进行升维操作,使输入的通道数等于输出的通道数。(总的说就是,先降维的作用,在升维的作用)
MobileNet
草考文章:https://zhuanlan.zhihu.com/p/70703846
V2原文地址:https://arxiv.org/abs/1801.04381
模型
首先是monilenetv1与标准卷积的对比图:从v1的结构图中来看,总的概括就是引入了深度可分离卷积来替换普通的卷积,在获得相同效果的同时,减少了参数量。
有人在实际使用的时候, 发现深度卷积部分的卷积核比较容易训废掉:训完之后发现深度卷积训出来的卷积核有不少是空的,这是为什么?作者认为这是ReLU这个浓眉大眼的激活函数的锅。
当n = 2,3时,与Input相比有很大一部分的信息已经丢失了。而当n = 15到30,还是有相当多的地方被保留了下来。也就是说,对低维度做ReLU运算,很容易造成信息的丢失。而在高维度进行ReLU运算的话,信息的丢失则会很少。这就解释了为什么深度卷积的卷积核有不少是空。发现了问题,我们就能更好地解决问题。针对这个问题,可以这样解决:既然是ReLU导致的信息损耗,将ReLU替换成线性激活函数。
深度卷积本身没有改变通道的能力,来的是多少通道输出就是多少通道。如果来的通道很少的话,深度卷积只能在低维度上工作,这样效果并不会很好,所以我们要“扩张”通道。既然我们已经知道(PointWise convolution)逐点卷积也就是1×1卷积可以用来升维和降维,那就可以在(DepthWise Concolution)逐通道卷积之前使用逐点卷积(PointWise convolution)进行升维,再在一个更高维的空间中进行卷积操作来提取特征。
Mobilev2(2018年提出:https://arxiv.org/abs/1801.04381)与Mobilev1相比,在网络结构层面,把堆叠的小模块的最后一层激活函数替换成了线性激活函数,来避免个别卷积核参数为空的情况,另外在mobilev1的模型基础上,参考残差模块的结构,在原基础上另添加了残差分支,用来加强特征复用的好处。如下图所示:
左边是v1的block,没有Shortcut并且带最后的ReLU6。右边是v2的加入了1×1升维,引入Shortcut并且去掉了最后的ReLU,改为Linear。步长为1时,先进行1×1卷积升维,再进行深度卷积提取特征,再通过Linear的逐点卷积降维。将input与output相加,形成残差结构。步长为2时,因为input与output的尺寸不符,因此不添加shortcut结构,其余均一致。
Mobilenetv3理解
——————————————————————————————————
参考文章:https://www.zhihu.com/question/287988785/answer/469932620
——————————————————————————————————
- 1.网络的架构基于NAS实现的MnasNet(效果比MobileNetV2好)
- 2.引入MobileNetV1的深度可分离卷积
- 3.引入MobileNetV2的具有线性瓶颈的倒残差结构
- 4.引入基于squeeze and excitation结构的轻量级注意力模型(SE)
- 5.使用了一种新的激活函数h-swish(x)
- 6.网络结构搜索中,结合两种技术:资源受限的NAS(platform-aware NAS)与NetAdapt
- 7.修改了MobileNetV2网络端部最后阶段
1解释:
(1)资源受限的NAS(platform-aware NAS):计算和参数量受限的前提下搜索网络的各个模块,所以称之为模块级的搜索(Block-wise Search)。
(2)NetAdapt:用于对各个模块确定之后网络层的微调。
对于模型结构的探索和优化来说,网络搜索是强大的工具。研究人员首先使用了神经网络搜索功能来构建全局的网络结构,随后利用了NetAdapt算法来对每层的核数量进行优化。对于全局的网络结构搜索,研究人员使用了与Mnasnet中相同的,基于RNN的控制器和分级的搜索空间,并针对特定的硬件平台进行精度-延时平衡优化,在目标延时(~80ms)范围内进行搜索。随后利用NetAdapt方法来对每一层按照序列的方式进行调优。在尽量优化模型延时的同时保持精度,减小扩充层和每一层中瓶颈的大小。
也就是说mobilenetv3的结构是通过搜索网络得到的最优的模型结构,对于我们来讲,拿来直接用模型就可。
————有待深入研究
AdaBelief(Adaptive"belief"stepsize)优化算法
参考文章
https://zhuanlan.zhihu.com/p/266647541
https://zhuanlan.zhihu.com/p/266553813
论文链接:https://arxiv.org/pdf/2010.07468.pdf
论文页面:https://juntang-zhuang.github.io/adabelief/
代码链接:https://github.com/juntang-zhuang/Adabelief-Optimizer
在处理文本数字方面,该优化算法较Adam优化算法还是有差距,差距不大。在处理图像信息方面,有待尝试。
模型
AdaBelief 、SGD+Momentum、Adam三种优化器收敛到最佳点的过程路线,如下图所示
所谓AdaBelief,是指根据梯度方向上的“信念”(Belief)来调整训练的步长。它和Adam在算法上的差别并不大,如下图所示
Adam和AdaBelief的算法如上图所示,不同之处已经用蓝色字体标注。从图中可以看出,AdaBelief没有引入额外的参数。为了简便,研究者省略了偏置矫正步骤。具体来说,在Adam中,更新方向是
m
t
v
t
\frac{m_t}{\sqrt{v_t}}
vtmt,其中
v
t
v_t
vt是
g
t
2
{g_t}^2
gt2的指数移动平均值(EMA)。在AdaBelief中,更新方向是
m
t
s
t
\frac{m_t}{\sqrt{s_t}}
stmt,其中
s
t
s_t
st是
(
g
t
−
m
t
)
2
({g_t - m_t})^2
(gt−mt)2的EMA。直观来看,将
m
t
m_t
mt看做
g
t
g_t
gt的预测,当预测值
m
t
m_t
mt与真实值
g
t
g_t
gt接近时,该优化算法的步长较大,当预测值
m
t
m_t
mt与真实值
g
t
g_t
gt相差较大时,该算法的步长较小。
推荐这篇文章:https://zhuanlan.zhihu.com/p/266553813
ECANet
参考文章:https://zhuanlan.zhihu.com/p/153112149
概述
首先回顾一下SENet中的通道注意模块。具体来说,在给定输入特征的情况下,SE块首先对每个通道单独使用全局平均池化,然后使用两个具有非线性的完全连接(FC)层,然后使用一个Sigmoid函数来生成通道权值。两个FC层的设计是为了捕捉非线性的跨通道交互,其中包括降维来控制模型的复杂性。虽然该策略在后续的通道注意模块中得到了广泛的应用,但作者的实验研究表明,降维对通道注意预测带来了副作用,捕获所有通道之间的依赖是低效的,也是不必要的。因此,提出了一种针对深度CNN的高效通道注意(ECA)模块,该模块避免了降维,有效捕获了跨通道交互的信息。
模型
在不降低维数的通道级全局平均池化之后,ECA通过考虑每个通道及其k个邻居来捕获局部跨通道交互信息。实践证明,该方法保证了模型效率和计算效果。需要注意的是,ECA可以通过大小为k的快速1D卷积来有效实现,其中卷积核大小为k代表了局部跨信道交互的覆盖率,即,该通道附近有多少邻居参与了这个信道的注意力预测,为了避免通过交叉验证对k进行手动调优,本文提出了一种方法来自适应地确定k,其中交互的覆盖率(即卷积核大小 k)与通道维数成正比。
避免降维有助于学习有效的通道注意。因此,作者提出了不降低通道维数来进行跨通道信息交互的ECA模块。
代码实现:
import torch
from torch import nn
from torch.nn.parameter import Parameter
class eca_layer(nn.Module):
"""Constructs a ECA module.
Args:
channel: Number of channels of the input feature map
k_size: Adaptive selection of kernel size
"""
def __init__(self, channel, k_size=3):
super(eca_layer, self).__init__()
self.avg_pool = nn.AdaptiveAvgPool2d(1)
self.conv = nn.Conv1d(1, 1, kernel_size=k_size, padding=(k_size - 1) // 2, bias=False)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
# x: input features with shape [b, c, h, w]
b, c, h, w = x.size()
# feature descriptor on the global spatial information
y = self.avg_pool(x)
# Two different branches of ECA module
y = self.conv(y.squeeze(-1).transpose(-1, -2)).transpose(-1, -2).unsqueeze(-1)
# Multi-scale information fusion
y = self.sigmoid(y)
return x * y.expand_as(x)