【知识蒸馏】feature-based 知识蒸馏 - - CWD(channel-wise knowledge dissillation)

一、CWD特征蒸馏介绍

大部分的KD方法都是通过algin学生网络和教师网络的归一化的feature map, 最小化feature map上的激活值的差异。
逐通道知识蒸馏(channel-wise knowledge dissillation, CWD)将每个通道的特征图归一化来得到软概率图。通过简单地最小化两个网络的通道概率图之间的KL散度,蒸馏过程更关注每个通道最显著的区域,这对于密集预测任务很有价值。
参考论文:https://arxiv.org/pdf/2011.13256
在这里插入图片描述

二、CWD特征蒸馏实现流程

(1)使用softmax生成软概率图

class ChannelNorm(nn.Module):
    def __init__(self):
        super(ChannelNorm, self).__init__()
    def forward(self, featmap):
        n, c, h, w = featmap.shape
        featmap = featmap.reshape((n, c, -1))
        featmap = featmap.softmax(dim=-1)
        return featmap

self.normalize = ChannelNorm()

# 1.使用softmax生成软概率图
        norm_s = self.normalize(s_pred / self.temperature)
        norm_t = self.normalize(t_pred.detach() / self.temperature)

(2)对学生概率图取log

# 2.对学生概率图取log
norm_s = norm_s.log()

(3)计算学生和教师概率图之间的KL散度

# 3.计算学生和教师概率图之间的KL散度
loss = nn.KLDivLoss(reduction='sum')(norm_s, norm_t)
loss /= n * c
return loss * (self.temperature ** 2)

三、完整CWD特征蒸馏代码实现

class ChannelNorm(nn.Module):
    def __init__(self):
        super(ChannelNorm, self).__init__()
    def forward(self, featmap):
        n, c, h, w = featmap.shape
        featmap = featmap.reshape((n, c, -1))
        featmap = featmap.softmax(dim=-1)
        return featmap

class CriterionCWD(nn.Module):
    def __init__(self,  temperature=1.0):
        super(CriterionCWD, self).__init__()
        # define normalize function
        self.normalize = ChannelNorm()
        self.temperature = temperature
    def forward(self, s_pred, t_pred):
        n, c, h, w = s_pred.shape

        # 1.使用softmax生成软概率图
        norm_s = self.normalize(s_pred / self.temperature)
        norm_t = self.normalize(t_pred.detach() / self.temperature)

        # 2.对学生概率图取log
        norm_s = norm_s.log()

        # 3.计算学生和教师概率图之间的KL散度
        loss = nn.KLDivLoss(reduction='sum')(norm_s, norm_t)
        loss /= n * c
        return loss * (self.temperature ** 2)
### CWD蒸馏的概念与实现方法 #### 什么是CWD? 通道蒸馏Channel-wise Distillation, CWD)是一种基于特征的知识蒸馏技术,其核心思想在于通过比较教师网络和学生网络中间层的激活值来传递知识。不同于传统的空间蒸馏方法,CWD将每个通道的激活归一化为一个概率分布,并利用非对称KL散度衡量两个网络之间对应通道的概率分布差异[^2]。 #### CWD的核心原理 CWD的主要创新点在于如何处理卷积神经网络中的通道信息。具体来说: - **通道级归一化**:对于每一层的特征图,将其视为一组独立的通道向量。通过对每个通道的激活值进行L1范数归一化操作,得到一个标准化后的概率分布。 - **非对称KL散度**:计算教师网络和学生网络在同一位置处对应的通道概率分布之间的差异。由于采用非对称形式,这种方法能够更好地捕捉教师网络的信息并指导学生网络的学习过程。 #### CWD的具体实现步骤 以下是CWD的一个典型实现框架: ```python import torch import torch.nn.functional as F def channel_wise_distillation_loss(student_features, teacher_features, temperature=4): """ 计算通道蒸馏损失函数 参数: student_features (torch.Tensor): 学生网络某一层的特征图 (BxCxHxW) teacher_features (torch.Tensor): 教师网络相同层的特征图 (BxCxHxW) temperature (float): 温度参数,默认为4 返回: loss (torch.Tensor): 蒸馏损失值 """ # 将特征图展平成二维张量 B*C x H*W s_flat = student_features.view(student_features.size(0), student_features.size(1), -1) # BxCx(H*W) t_flat = teacher_features.view(teacher_features.size(0), teacher_features.size(1), -1) # BxCx(H*W) # 对每条通道进行 L1 归一化 s_norm = F.normalize(s_flat.sum(dim=-1), p=1, dim=-1) # BxC t_norm = F.normalize(t_flat.sum(dim=-1), p=1, dim=-1) # BxC # 应用温度缩放 s_soft = F.log_softmax(s_norm / temperature, dim=-1) t_soft = F.softmax(t_norm / temperature, dim=-1) # 非对称 KL 散度 loss = F.kl_div(s_soft, t_soft, reduction='batchmean') * (temperature**2) return loss ``` 上述代码实现了CWD的关键部分——即如何定义通道级别的蒸馏损失。它首先提取了教师和学生的特征图,随后对其进行必要的预处理(如归一化),最后使用非对称KL散度测量两者间的距离。 #### CWD的应用场景 根据已有研究显示,在多个计算机视觉任务中引入CWD均能取得显著效果。例如,在语义分割领域以及目标检测任务上,相比于其他传统的方法,CWD表现出更强的能力来捕获细粒度的空间结构信息[^3]。这使得即使是在模型压缩或者剪枝的情况下,仍然可以最大程度地保留原模型的表现力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BILLY BILLY

你的奖励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值