社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

深度学习中的特征融合方式(add/concate)

深度学习基础与进阶 • 7 月前 • 408 次点击  

concat通道数叠加,描述图像本身的特征增加了,而每一特征下的信息是没有增加

add为简单的像素叠加,通道不变;add后描述图像的特征下的信息量增多了,但是描述图像的维度本身并没有增加,只是每一维下的信息量在增加,这显然是对最终的图像的分类是有益的。

特征add的时候就是增加特征的信息量,特征concat的时候就是增加特征的数量注重细节的时候使用add,注重特征数量的时候使用concat


作用和注意事项

Concate

作用:Concate操作用于将两个或多个张量在某个维度上连接在一起,生成一个更大的张量。这可以用于在深度学习模型中增加通道数或特征维度,以便在后续层中更好地捕获不同特征之间的关系。

示例:在卷积神经网络中,特征图通常具有形状为(batch_size, channels, height, width),如果要在通道维度上连接两个特征图,可以使用concatenate操作,结果将是形状为(batch_size, channels1 + channels2, height, width)的特征图。

注意:在连接时,两个张量的维度(除了连接维度)必须保持一致。例如,在通道维度上连接时,其他维度的尺寸必须相同。


Add

作用:Add操作用于将两个张量逐元素相加在一起,生成一个新的张量。这可以用于实现跳跃连接(skip connection)或残差连接(residual connection),以促进梯度的流动,提高训练稳定性,以及在深层网络中减少梯度消失问题。

示例:在残差网络(ResNet)中,残差块的输入特征与残差块的输出特征被相加在一起,以生成最终的块输出。这有助于网络在训练时更容易地学习恒等映射。

注意:相加操作要求相加的张量具有相同的形状,因为它们是逐元素相加的。


直观理解


concat作用

concat是通道数的增加,也就是说描述图像本身的特征数(通道数)增加了,而每一特征下的信息是没有增加;横向或纵向空间上的叠加。


add作用

add为简单的像素叠加,是描述图像的特征下的信息量增多了,但是描述图像的维度本身并没有增加,只是每一维下的信息量在增加,这显然是对最终的图像的分类是有益的。

add操作经典代表网络是ResNet,concate操作经典代表网络是Inception系统网络中的Inception结构和DenseNet。

add操作相当于加入一种先验知识。我觉得也就是相当于你对原始特征进行人为的特征融合。而你选择的特征处理的操作是element-wise add。通过add操作,会得到新的特征,这个新的特征可以反映原始特征的一些特性,但是原始特征的一些信息也会在这个过程中损失。

但是concate就是将原始特征直接拼接,让网络去学习,应该如何融合特征,这个过程中信息不会损失。

add其实是concate的一种特殊情况。但是concate带来的计算量较大,在明确原始特征的关系可以使用add操作融合的话,使用add操作可以节省计算代价。


数学表达


CPN[2]为了进一步减少计算量,对于分辨率小的特征图在add前用1x1的卷积减少了通道数。



有一个例子是ResNet[4]的skip connection。这里的add主要是为了保持mapping的identity性质,使梯度回传得更加容易。同样的操作在LSTM[5]里的cell state也能看到。



当然,如果不在乎计算量且数据足够的时候,用concat也是可以的,因为这两个本身就是包含关系。实际上concat在skip connection里用的也比add更普遍,比如U-Net[6]、DenseNet[7]。 




其他理解

concatenate和add可以相互转化



oncat是肯定是计算量大于element-wise add的,但个人认为,concat避免了直接add对信息造成的负面影响。而且逐元素加和的方式要求不同层的feature map具有完全一致的channel数量,而cancat不受channel数量的限制(yolov3里就是concat,做concat操作的两层通道数不同)。


Resnet,Densenet等神经网络中,常常采用add来连接特征层,Unet中常常采用concatenate。因为Unet是做图像分割的,图像分割是像素级分类,对特征的数量要求很高。而add是在一个特征上增加其语义信息,举个例子,一张脸,没有通过add话,你可能只会看到眼睛,通过add后你可以看见鼻子,眉毛,这样就可以增加置信度更好的判断这个人是谁,从而增加目标检测的准确率。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/169329
 
408 次点击