前言
深度学习中concat和add是常见的两种特征融合的方法。最近思考了一下这两个方法的区别是什么?什么时候用?
两者都可以理解为整合特征图信息。concat是通道数的增加;add是特征图相加,通道数不变。
add是描述图像的特征下的信息量增多了,但是描述图像的维度本身并没有增加,只是每一维下的信息量在增加,这显然是对最终的图像的分类是有益的。
concatenate是通道数的合并,也就是说描述图像本身的特征数(通道数)增加了,而每一特征下的信息是没有增加。
concat每个通道对应着对应的卷积核。 而add形式则将对应的特征图相加,再进行下一步卷积操作,相当于加了一个先验:对应通道的特征图语义类似,从而对应的特征图共享一个卷积核(对于两路输入来说,如果是通道数相同且后面带卷积的话,add等价于concat之后对应通道共享同一个卷积核)。因此add可以认为是特殊的concat形式。但是add的计算量要比concat的计算量小得多。
Resnet是做值的叠加,通道数是不变的,DenseNet是做通道的合并。你可以这么理解,add是描述图像的特征下的信息量增多了,但是描述图像的维度本身并没有增加,只是每一维下的信息量在增加,这显然是对最终的图像的分类是有益的。而concatenate是通道数的合并,也就是说描述图像本身的特征增加了,而每一特征下的信息是没有增加。
总结
concat更像是一个在信息扩增的操作。add更像一个信息融合的操作。在backbone中随着特征图减小,可以用concat来增加通道的同时增加信息。然而在网络的head或者classifier的时候,需要使用add来增加每个像素的信息。