python项目|深入理解网络结构设计中的add操作和concatenate操作

在网络结构的设计上,Resnet是做值的叠加,通道数是不变的;DenseNet和Inception是做通道的合并。
在代码层面就是ResNet使用的都是add操作,而DenseNet使用的是concatenate操作。
add和concat的区别 两者都可以理解为整合特征图信息,但concat理解起来更加直观。
①add是特征图相加,通道数不变
add是描述图像的特征下的信息量增多了,但是描述图像的维度本身并没有增加,只是每一维下的信息量在增加,这显然是对最终的图像的分类是有益的。
②concat是通道数的增加
而concatenate是通道数的合并,也就是说描述图像本身的特征**(维度)增加了,而每一特征(维度)下的信息是没有增加**。
concatenate经常用于将特征联合,多个卷积特征提取框架提取的特征融合或者是将输出层的信息进行融合,而add层更像是信息之间的叠加。
【python项目|深入理解网络结构设计中的add操作和concatenate操作】③concat每个通道对应着相应的卷积核。 而add形式则将对应的特征图相加,再进行下一步卷积操作,相当于加了一个先验:对应通道的特征图语义类似,从而对应的特征图共享一个卷积核(对于两路输入来说,如果是通道数相同且后面带卷积的话,add等价于concat之后对应通道共享同一个卷积核)。
因此add可以认为是特殊的concat形式。但是add的计算量要比concat的计算量小得多。
优缺点 ①add操作必然会带来信息损失。如果两个被加的向量不具备同类特征含义时可能会导致信息损失,但是如果“损失”得当,就是信息提取!
②相同情况下,concat计算量大于add,但concat避免了直接add对信息相加导致的信息损失。
③add操作要求不同层的feature map具有完全一致的channel数量,如果不一致还需要用1×1卷积将通道数转化到一致,这样也增加了计算量;而cancat不受channel数量的限制。
④二者都解决了深层网络的梯度消失问题、加强了特征的传播、鼓励特征重用、能够减少小样本的过拟合问题;但concat非常消耗显存【(论文)Memory-Efficient Implementation of DenseNets 针对此缺点进行改进。】
适用情况 当两路输入可以具有对应通道的特征图语义类似的性质的时候,可以用add来替代concat,这样更节省参数和计算量(concat是add的2倍),如图像分类。

    推荐阅读