参考文章:https://blog.csdn.net/weixin_44878336/article/details/120646078
这是我实验室的同门,在学习上给予了我很大的帮助,该文章一定能解决你的困惑。
特征通道与信息融合我的理解是特征融合,我相信Resnet论文中提出的残差模块是特征信息融合最好的体现。
就拿残差模块来说,有一条主干路,在这条通路上面,包含卷积、归一化、池化、激活函数等各个处理输入特征信息的模块,而在主干路之外还有一条对输入特征信息进行压缩的卷积模块,该作用仅仅就是为了和主干路的输出特征信息进行融合。因此,两条支路的特征信息融合在一起,就包括了源输入的信息和处理后的深层次信息。这里还要说的就是,在两通路特征信息进行融合之前,主要的融合方式可以概括为:add:特征通道数不变,在原尺寸的基础上特征信息直接叠加;concatenate另一种方法就是原通道信息上的信息不变,进行通道数上的叠加。这只是两种特征信息的融合方式。
“注意力”特征融合:注意力特征融合可以概括为通道注意力特征融合和空间注意力特征融合。
通道注意力模块:
通道注意力是关注什么样的特征是有意义的。对于图像而言,输入是三通道的信息,经过卷积等操作后,输入维度上压缩,而通道数增加,每个通道都有自己信息,而通道注意力模块就是对每个通道进行衡量,分别得到每个通道的重要程度,而这个重要程度可以理解为我们想要的特征信息在每个通道上的多少,特征信息多的通道,会得到一个大的权重,也就是我们更关注这个通道,特征信息少的通道自然得到的权重小,我们的关注程度更低。通道注意力怎么得到每个通道的权重:输入是一个 H × W × C H\times W \times C H×W×C 的特征 F F F(H x W代表像素大小),我们先分别进行一个空间的全局最大池化和平均池化得到两个 1 × 1 × C 1\times 1\times C 1×1×C的通道描述。接着,再将它们分别送入一个多层神经网络,比如两层:第一层神经元个数为 C r \frac{C}{r} rC,激活函数为 R e l u Relu Relu,第二层神经元个数为 C C C。这个两层的神经网络是共享的。然后,再将得到的两个特征相加后经过一个 S i g m o i d Sigmoid Sigmoid激活函数得到权重系数 W i W_i Wi。最后,输入的特征 F F F每个通道就可得到刚刚计算得到的权重,这样每个通道就有了自己的权重,也就是每个通道的特征信息的重要程度得到了划分。通道注意力代表作有:
SENet
我的另一篇文章:https://editor.csdn.net/md/?articleId=120718999
空间注意力模块:
空间注意力类似于通道注意力模块,最终的目的都是针对输入的特征信息的每个通道乘以一个权重,为了就是对后续的处理,模型或者网络更加关注权重系数大的通道,而不在纠结花算力在权重系数(重要程度小的通道上)。
如果卷积的输出输入都只是一个平面,那么 1 × 1 1\times1 1×1卷积核并没有什么意义,它是完全不考虑像素与周边其他像素关系。但卷积的输出输入是长方体,所以 1 × 1 1\times1 1×1卷积实际上是对每个像素点,在不同的channels上进行线性组合(信息整合),且保留了图片的原有平面结构,调控depth(深度,我认为就是指的通道数吧),从而完成升维或降维的功能。
1 × 1 1\times1 1×1卷积在瓶颈结构中的作用: 1 × 1 1\times1 1×1卷积可以保证和特征图卷积之后不损失分辨率,而且在模块组合中,在 3 × 3 3\times3 3×3卷积之前增加 1 × 1 1\times1 1×1卷积可以减少通道数。但是实验中表明, 1 × 1 1\times1 1×1卷积不适合在特征尺寸很大的时候使用,我认为是在特征尺寸很大的时候,我们的目的就是压缩尺寸,使得到的特征图尺寸更小,具有更大的感受野,也就是充分提取关键信息。而 1 × 1 1\times1 1×1卷积只会压缩通道数或者增加通道数,不会对特征图进行任何的操作。在特征图已经经过很多次卷积,变得很小的时候,使用 1 × 1 1\times1 1×1卷积在扩张或压缩通道数,在进行最后的卷积,可能效果更佳。另外 1 × 1 1\times1 1×1的卷积可以极大地减少参数量,但是也要清楚,参数量的减少不一定会提升模型的运算速度,即使拥有小的参数量,运算速度仍会很慢。
对于深度学习处理图像类的信息而言,网络层数的加深对于网络模型而言,至关重要。相比较提取图像的特征,更深层次的网络,往往能够提取更好的特征信息。如下图所示:
从上图就可以看出,网络的深度对图像提取关键信息,至关重要。如果一味地加深网络的层数,也会带来很多问题。比如:梯度不稳定(网络反向传播),网络退化的问题始终都是存在的,可以缓解,没法消除,这就有可能出现网络加深,性能反而开始下降。
参考文章:https://www.zhihu.com/question/291790340/answer/667260880
宽度,即通道(channel)的数量。增加网络的深度就是逐层的抽象,不断精炼提取关键信息。如上图所示:第一层学习到了目标的边缘,第二层学习到了目标简单的形状,第三层开始学习到了目标的形状。通过读文章,有文章指出,增加通道数在一定意义上确实使原有的特征信息更加丰富,但是通道数的增加对于计算量而言使倍数增加的,也有作者实验验证了,再同时增加深度和宽度的基础上,确实可以取得更优的性能,也就是说我们不知道深度增加到多少宽度增加到多少,模型可以取得最佳的性能,所以只能相对而言。另外宽度相对于深度而言,对GPU的利用更优,GPU的并行计算,更加容易训练模型。
**总结:**模型增加宽度非常关键。比如DenseNet中的密集连接,充分利用了每个通道信息。总结的来说就是充分利用通道数,在一个模块的输出,以concat的连接方式融合上一层的输出,完美的结合了原有的特征信息,而且也在此基础上增加了更加丰富的特征信息。何乐而不为~
这个问题是我在一本付费的电子书上面看到的章节题目,因为付费不能看到他的答案,但是自己又对这个问题感兴趣,所以拿出来分享一下,我也是查阅网上的相关资料,基本都是针对神经网络多输入和多输出或者多输入和单输出类似的回答和博客。总的回想一下,多输入这个问题其实我们早就遇到了,对于神经网络入门的房价预测,对于最终的房价,影响因素不单单只有房屋的面积,还有楼层,地段等等因素,这个就是多因素影响最终房价的自变量,如果根据这些影响因素建立与房价的回归网络,就是一个多输入单输出的问题了,所以在很多问题上面都有体现。这就是我理解的多输入问题,至于什么时候选择或者需要多输入,那一定是单一的自变量不足以满足最终的结果,也就是最终的结果不是单一的输入是可以决定的,此时,我们引入其他的影响因素,来共同决定输出。我认为不管是多对单,还是多对多的形式,一切都是按着你的需求,解决问题的需求来决定。(个人理解)
常规卷积:
如果输入feature map尺寸为 C ∗ H ∗ W C∗H∗W C∗H∗W,卷积核有N个,输出feature map的通道数与卷积核的数量相同也是N。
分组卷积:
上图展示了具有两个过滤器分组的分组卷积。在每个过滤器分组中,每个过滤器的深度仅有名义上的 2 D 2D 2D卷积的一半。它们的深度是 D o u t 2 \frac{Dout}{2} 2Dout。每个过滤器分组包含 D o u t 2 \frac{Dout}{2} 2Dout个过滤器。第一个过滤器分组(红色)与输入层的前一半 ( [ : , : , 0 : D i n / 2 ] ) ([:, :, 0:Din/2]) ([:,:,0:Din/2])卷积,而第二个过滤器分组(橙色)与输入层的后一半 ( [ : , : , D i n / 2 : D i n ] ) ([:, :, Din/2:Din]) ([:,:,Din/2:Din])卷积。因此,每个过滤器分组都会创建 D o u t 2 \frac{Dout}{2} 2Dout个通道。整体而言,两个分组会创建2× D o u t 2 \frac{Dout}{2} 2Dout=Dout 个通道。然后我们将这些通道堆叠在一起,得到有 Dout 个通道的输出层。
分组卷积的优点:
在非常深的神经网络中,分组卷积非常重要。会使模型更加高效,模型参数会随过滤器分组数的增大而减小。
参考:https://zhuanlan.zhihu.com/p/257145620
个人理解:深度可分离卷积可以理解为将普通的卷积分为两步来计算,第一步为逐通道卷积,第二步为逐点卷积。
逐通道卷积:假如输入为三通道的特征图,逐通道卷积就是设置和通道数相同的卷积核,与输入特征进行卷积,得到的是通道数一样,尺寸改变的特征信息。这样的卷积运算仅仅是对每个通道的特征进行卷积,并没有有效利用不同通道在空间位置的信息。所以特征图经过逐通道卷积后,得到的特征图进行逐点卷积。配合图来理解:
逐点卷积:对逐通道卷积后的特征图进行 1 × 1 1\times1 1×1卷积,卷积核个数由上一层的通道数决定,经过 1 × 1 1\times1 1×1卷积后,各层的特征图就利用在一起,起到了和普通卷积的效果。配合图来理解:
参考文章:https://zhuanlan.zhihu.com/p/257145620
首先从普通的2D卷积来看(先不考虑通道数),如下图所示,输入是特征图维度为 5 ∗ 5 5*5 5∗5,卷积核为: 3 ∗ 3 3*3 3∗3,步长为1,填充为0,特征图经过卷积后的输出为 3 ∗ 3 3*3 3∗3大小。
空间分离卷积就是对卷积核进行矩阵行和列的矩阵分解,比如下面公式所示:
[ 2 4 1 2 ] = [ 2 1 ] × [ 2 1 ] \left[\begin{matrix}2 & 4 \cr 1 & 2\end{matrix}\right] =\left[\begin{array}{ccc}2\\\\1\\\\\end{array}\right] \times \left[\begin{array}{ccc} 2 & 1 \end{array}\right] [2142]=⎣ ⎡21⎦ ⎤×[21]
从公式上理解就是把上图中的 3 × 3 3\times3 3×3卷积分解为 3 × 1 3\times1 3×1和 1 × 3 1\times3 1×3的两个卷积,前后分别对输入特征图进行卷积处理。具体如下图所示:
最终都可以得到 3 × 3 3\times3 3×3的特征图,只不过是把卷积核给分开,然后卷积核分开对输入的特征进行处理,空间分离卷积确实在卷积操作中减少了参数量,但深度学习却很少使用它。一大主要原因是并非所有的核都能分成两个更小的核。如果我们用空间可分卷积替代所有的传统卷积,那么我们就限制了自己在训练过程中搜索所有可能的核。这样得到的训练结果可能是次优的。
参考文章:
https://zhuanlan.zhihu.com/p/93643523
https://zhuanlan.zhihu.com/p/24810318
批量标准化(Batch Normalization)
Batch normalization 的 batch 是批数据, 把数据分成小批进行随机梯度下降, 而且在每批数据进行前向传播的时候, 对每一层都进行 normalization (标准化或者归一化)的处理。BN通常被加在卷积池化后激活函数的前面,其作用可以加快模型训练时的收敛速度,使得模型训练过程更加稳定,避免梯度爆炸或者梯度消失。在残差结构的模块中,通常都是 卷积+BN+激活 的结构。下图是有或者没有BN层,使用 tanh 激活函数以后, 输出值得分布情况。
Batch Normalization核心公式:
式中:
参考文章:https://zhuanlan.zhihu.com/p/390990848
对于神经网络来说,当数据集过小或者过于简单,当你在一个复杂的模型训练时,就会出现过拟合的情况。Dropout的提出作为训练神经网络的一种trick选择。在每个训练批次中,通过忽略一半的特征检测器(让一半的隐层节点值为0),可以明显地减少过拟合现象,通俗的来说,就是在某一层神经元使用Dropout,该层的神经元会随机丢弃一些神经元参与训练,因为在该层你丢弃了一部分神经元,所以在下一层也只有一部分神经元参与训练,在一定程度上可以防止模型过拟合,增加模型的泛化性。如下图所示:
起初我是只知道我们在做检测或者分类任务时,Dropout作为提高模型能力的一种方式,可能大多数的人只知道我们加入该trick,模型会随机丢弃掉我们设置比率的神经元,需要注意的是,假如有十个神经元,我们设置丢弃率为 p = 0.3 p=0.3 p=0.3,最后保留参与训练的神经元个数为7个,我们还需要对剩余的7个神经元进行缩放,也就是乘以 1 1 − p \frac{1}{1-p} 1−p1,如果在训练的时候没有对剩余神经元进行缩放,那么在测试的时候,就要对权重进行缩放。
疑惑:对于CNN来说,其中应用的Dropout是对于神经元的随机丢弃还是对输入特征图的随机丢弃还有待研究
比较推荐李沐博主提出的:用梯度下降来优化人生~~连接:https://zhuanlan.zhihu.com/p/414009313
非常有感触的一句话送给大家,像我一样在迷途中的人:所谓成熟,就是习惯任何人的忽冷忽热,看淡任何人的渐行渐远;用绝对清醒的理智;压制不该有的情绪
在代码中就是首先生成特征层大小的网格,然后将我们预先设置好了的在原图中416416先验框的尺寸调整到有效特征层大小上,最后从v4的网络预测结果获得先验框的中心调整参数 x o f f s e t x_offset xoffset和 y o f f s e t y_offset yoffset和宽高的调整参数h和w,对在特征层尺寸大小上的先验框进行调整,将每个网格点加上它对应的x_offset和y_offset的结果就是调整后的先验框的中心,也就是预测框的中心,然后再利用先验框和h、w结合 计算出调整后的先验框的的长和宽,也就是预测框的高和宽,这样就能得到在特征层上得到整个预测框的位置了,最后我们将在有效特征层上的预测框的位置再调整到原图416416的大小上。有待确认此时在原图上就可以得到三个有效特征层的所有先验框,总数为 13 ∗ 13 ∗ 3 + 26 ∗ 26 ∗ 3 + 52 ∗ 52 ∗ 3 13*13*3 + 26*26*3 + 52*52*3 13∗13∗3+26∗26∗3+52∗52∗3个框框,—>,我们就可以获得预测框在原图上的位置,当然得到最终的预测结果后还要进行得分排序与非极大抑制筛选,由于一个网格点有3个先验框,则调整后有3个预测框,在原图上绘制的时候,同一个目标就有3个预测框,那要找出最合适的预测框,我们需要进行筛选。如下图举例:假设3个蓝色的是我们获得的预测框,黄色的是真实框,红色的是用与预测目标的网格,我们就需要对这检测同一个目标的网格点上的3个调整后的先验框(也就是预测框)进行筛选。
笔记:基于锚点和无锚点检测的本质区别在于如何定义正训练样本和负训练样本,从而导致了两者之间的性能差异。如何选择正负训练样本是当前目标检测器的重要问题,自适应训练样本选择—>根据目标的统计特征自动选择正样本和负样本。
模型通过框架中至少两个模块:生成模型(Generative Model)和判别模型(Discriminative Model)的互相博弈学习中产生更好的输出。
机器学习的模型大体可以分为两类,生成模型和判别模型。判别模型需要输入变量,通过某种模型来预测,生成模型是给定某种隐含信息,来随机产生观测数据。
(注:参考的都是性价比很高的文章,已给出参考地址,不是原创,但是在此基础上加了很多自己的理解,不断更新中 …ing)