Mutual-Channel Loss 论文解读

论文标题:The Devil is in the Channels: Mutual-Channel Loss for Fine-Grained Image Classification
来源:IEEE TIP 2020
针对目标:细粒度图像分类
下载地址:https://arxiv.org/abs/2002.04264
github地址:https://github.com/PRIS-CV/Mutual-Channel-Loss

首先,说说这篇论文的优点:简单,高效,易于实现。这篇论文相比于SOTA的其余方法,代码量少,只是在常用的网络结构上加入了一个辅助结构。并且,该辅助结构没有引入额外的网络参数,只包含正则化,池化等操作,就达到了SOTA的效果。

创新点: 在细粒度图像分类任务中引入了互通道损失 L M C L_{MC} LMC,由 判别性组件多样性组件 组成。

网络结构

在这里插入图片描述
通过观察网络结构图,可以看出来:该网络仅仅是在常规的图像分类网络结构下,加入了一个互通道损失 L M C L_{MC} LMCFeature channels 是之前 Conv.layers 的最后一个卷积层输出的特征图, L C E L_{CE} LCE 使得网络专注于全局判别性区域, L M C L_{MC} LMC 则使得网络专注于局部判别性区域。
L o s s ( F ) = L C E ( F ) + μ   x   L M C ( F ) Loss({\rm F}) = L_{CE}({\rm F}) + μ\,{\sf x}\,L_{MC}({\rm F}) Loss(F)=LCE(F)+μxLMC(F)

邀请主角登场 – MC-LOSS在这里插入图片描述

(a)图左侧通道的判别性组件,(a)图右侧通道的多样性组件。(b)图表示使用了 L M C L_{MC} LMC 前后的特征图变化,可以看出,使用 L M C L_{MC} LMC 之后,得到了了判别性区域,且不同特征图的判别性区域各不相同。
假设,(a)图中的输出特征图 F {\rm F} F N N N通道,总共 c c c 个类别, ξ ξ ξ 表示每个类别中特征图的个数。那么: N = c   x   ξ N = c\,{\sf x}\,ξ N=cxξ有意思的是,每个类别有 ξ ξ ξ个特征图专门负责,该策略由判别性组件实现。

判别性组件的构成:
  1. CWA: Channel-Wise Attention,通道注意力机制。与其他论文中(如SE-Net)的通道注意力机制有所差别,虽然也是通道加权,但是本论文的权值只有0和1。所以,本文的CWA有点类似于Dropout随机失活,不过Dropout是在空间域,CWA是在通道域。比如,有10个类别(c=10),共有40通道的特征图(N=40),此时每个类别4个通道的特征图(ξ=4)。 经过失活概率为0.5的CWA之后,虽然输出也是 N N N 通道,但是其中有 N / 2 N/2 N/2 通道的特征图中所有的值都归为0了。并且失活与类别也有关,相应的,每个类别中通道失活概率也为0.5,也就是说每个类别有2个通道(ξ/2)失活了。
    CWA的作用: 强制让每个通道努力学到充足的判别性信息。因为每次迭代的时候,原先每个类别特征图有一半(ξ/2)都置零了,为了能够进行分类,那剩下的特征图的任务就更大,更需要去学习判别性信息。
  2. CCMP: Cross-Channel Max Pooling,跨通道的最大池化。将每个类别中所有通道的最大响应值全部放在一张特征图上。原则上,越具有判别性的点,响应越大。关于CCMP的具体实现,可以参考我的另一篇博客:cross channel pooling 的原理与代码实现
    CCMP的作用: 通道降维,得到c通道的特征图。
  3. GAP: GlobalAveragePooling,全局平均池化,应用非常广泛,能够将(b, c, w*h)的特征图池化为(b, c, 1)的特征图。
    GAP的作用: 空间降维。
  4. Softmax: 打分,用于分类。

     g ( F i ) = 1 W H ∑ k = 1 W H ⏟ G A P max ⁡ j = 1 , 2 , ⋯   , ξ ⏟ C C M P [ M i ⋅ F i , j , k ] ⏟ C W A g\left(\mathbf{F}_{i}\right)=\underbrace{\frac{1}{W H} \sum_{k=1}^{W H}}_{\mathrm{GAP}} \underbrace{\max _{j=1,2, \cdots, \xi}}_{\mathrm{CCMP}} \underbrace{\left[M_{i} \cdot \mathbf{F}_{i, j, k}\right]}_{\mathrm{CWA}} g(Fi)=GAP WH1k=1WHCCMP j=1,2,,ξmaxCWA [MiFi,j,k]

     L d i s ( F ) = L C E ( y , [ e g ( F 0 ) , e g ( F 1 ) , ⋯   , e g ( F c − 1 ) ] T ∑ i = 0 c − 1 e g ( F i ) ⏟ Softmax ) L_{d i s}(\mathbf{F})=L_{C E}(\boldsymbol{y}, \underbrace{\frac{\left[e^{g\left(\mathbf{F}_{0}\right)}, e^{g\left(\mathbf{F}_{1}\right)}, \cdots, e^{g\left(\mathbf{F}_{c-1}\right)}\right]^{\mathrm{T}}}{\sum_{i=0}^{c-1} e^{g\left(\mathbf{F}_{i}\right)}}}_{\text {Softmax}}) Ldis(F)=LCE(y,Softmax i=0c1eg(Fi)[eg(F0),eg(F1),,eg(Fc1)]T)

判别性组件的功能: CWA和CCMP的协作,使得网络能够专注于各种类别的判别性区域。CCMP+GAP+softmax得到的特征向量与类别标签进行比对得到损失函数的这一过程,由于没有任何卷积操作,为了使得softmax打分结果接近标签one-hot值,属于某个类别的 ξ ξ ξ个特征图便会有更大的响应。这一过程就解释了如何实现每个类别有 ξ ξ ξ个特征图专门负责。

多样性组件的构成:

虽然判别性组件能够专注于各种类别的判别性区域,但是,仍然无法保证大部分判别性区域都被定位了,于是引入了多样性组件。

  1. Softmax: 正则化。
  2. CCMP: 和上文中的CCMP一样的作用,得到c个通道的特征图。
  3. Sum: 将每个特征图上所有元素求和,每个通道只有一个元素。
  4. Average: 将所有通道的值求平均。

     h ( F i ) = ∑ k = 1 W H max ⁡ j = 1 , 2 , ⋯   , ξ ⏟ C C M P [ e F i , j , k ∑ k ′ = 1 W H e F i , j , k ′ ] ⏟ Softmax  h\left(\mathbf{F}_{i}\right)=\sum_{k=1}^{W H} \underbrace{\max _{j=1,2, \cdots, \xi}}_{\text{C C M P}} \underbrace{\left[\frac{e^{\mathbf{F}_{i, j, k}}}{\sum_{k^{\prime}=1}^{W H} e^{\mathbf{F}_{i, j, k^{\prime}}}}\right]}_{\text {Softmax }} h(Fi)=k=1WHC C M P j=1,2,,ξmaxSoftmax  [k=1WHeFi,j,keFi,j,k]

     L d i v ( F ) = 1 c ∑ i = 0 c − 1 h ( F i ) L_{d i v}(\mathbf{F})=\frac{1}{c} \sum_{i=0}^{c-1} h\left(\mathbf{F}_{i}\right) Ldiv(F)=c1i=0c1h(Fi)

L d i v ( F ) L_{div}(\mathbf{F}) Ldiv(F)越大越好。 L d i v ( F ) L_{div}(\mathbf{F}) Ldiv(F)越大,每个类别中 ξ ξ ξ个通道的特征图,专注的区域越分散。

如上图,假设输入特征图经过softmax之后,得到极端情况,每张图上,只有一个点为1(红色点),其余全为0(橙色点)。再经过CCMP和Sum后计算结果。当判别性区域越分散,累加值越高(ξ)。当每个特征图上,判别性区域都一样时,那么CCMP之后的特征图,只有一个点为1,于是Sum之后,累加值最小(1)。另外,多样性组件的存在是以判别性组件的存在为前提,若没有判别性组件,那么多样性组件将毫无意义。
MC-LOSS:   L M C ( F ) = L d i s ( F ) − λ   x   L d i v ( F ) L_{MC}({\rm F}) = L_{dis}({\rm F}) - λ\,{\sf x}\,L_{div}({\rm F}) LMC(F)=Ldis(F)λxLdiv(F).

实验

1.与SOTA模型比较(加入预训练模型):


2.与其他分类损失函数比较(未加入预训练模型):
在这里插入图片描述

复现

在未加入预训练模型使用VGG16作为主干网络复现时,MC-Loss(ξ=3)的方法下,鸟类数据集准确率达到了67.33(原文65.98),车辆数据集准确率达到了90.34(原文90.85)。
特征图可视化效果:
属于某一类的特征图(文中每ξ个特征图负责一个类别),前三列表示三个特征图,最后一列为前三列叠加效果。(可视化效果一般般呀)

在这里插入图片描述

不属于某一类的特征图(文中每ξ个特征图负责一个类别),前三列表示三个特征图,最后一列为前三列叠加效果。
在这里插入图片描述

预训练的Resnet50作为主干网络复现时,属于某一类的特征图(有些部分学到了背景信息)
在这里插入图片描述合并
在这里插入图片描述

特征图注意力区域可视化的方法可以参考:特征图可视化为类激活图(CAM)
参考链接:
https://blog.csdn.net/u013347145/article/details/105568990
https://zhuanlan.zhihu.com/p/106922799

  • 14
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
AMC-loss (Adversarial Mutual Contrast) 是一种在深度学习中用于增强模型对对抗样本鲁棒性的损失函数。它结合了对抗训练(adversarial training)和对比学习的思想,通过同时优化模型的正向预测和负向区分能力。在PyTorch中实现AMC-loss,你需要定义一个新的损失函数,并可能在训练循环中使用`nn.Module`或自定义优化器。 以下是一个简单的AMC-loss的PyTorch代码概述: ```python import torch import torch.nn as nn class AMCContrastLoss(nn.Module): def __init__(self, base_loss, device='cuda'): super(AMCContrastLoss, self).__init__() self.base_loss = base_loss self.device = device self.criterion = nn.CrossEntropyLoss() def forward(self, outputs, targets, adversarial_samples): # 假设outputs是模型的预测,targets是真实标签,adversarial_samples是生成的对抗样本 real_pred, adv_pred = outputs[0], outputs # 分离原始输出和对抗输出 # 正向预测 real_loss = self.base_loss(real_pred, targets) # 负向区分(对比学习) contrast_logits = torch.cat((real_pred, adv_pred), dim=0) contrast_labels = torch.cat((torch.zeros_like(targets), torch.ones_like(targets)), dim=0).to(self.device) contrast_loss = self.criterion(contrast_logits, contrast_labels) # 总损失 total_loss = real_loss + contrast_loss return total_loss # 使用示例 model = MyModel().to(device) optimizer = torch.optim.Adam(model.parameters()) amc_loss = AMCContrastLoss(nn.CrossEntropyLoss()) for inputs, targets in train_loader: inputs, targets = inputs.to(device), targets.to(device) adversarial_inputs = generate_adversarial(inputs) # 假设这个函数能生成对抗样本 outputs = model(inputs, adversarial_inputs) loss = amc_loss(outputs, targets, adversarial_inputs) optimizer.zero_grad() loss.backward() optimizer.step() ```
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值