【知识蒸馏】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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/647768.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一款颜值颇高的虚拟列表!差点就被埋没了,终于还是被我挖出来了

大家好,我是晓衡! 今天,推荐一款颇有颜值的虚拟列表组件,不然真的被埋没就可惜了! 我们先来看下效果: 感觉怎么样?还不错吧! 为什么说这个资源差点被埋没呢?因为个朋友找…

Java面向对象知识总结+思维导图

🔖面向对象 📖 Java作为面向对象的编程语言,我们首先必须要了解类和对象的概念,本章的所有内容和知识都是围绕类和对象展开的! ▐ 思维导图1 ▐ 类和对象的概念 • 简单来说,类就是对具有相同特征的一类事…

【全开源】多功能投票小程序(ThinkPHP+FastAdmin+Uniapp)

打造高效、便捷的投票体验 一、引言 在数字化快速发展的今天,投票作为一种常见的决策方式,其便捷性和效率性显得尤为重要。为了满足不同场景下的投票需求,我们推出了这款多功能投票小程序系统源码。该系统源码设计灵活、功能丰富&#xff0…

《AI学习笔记》大模型-微调/训练区别以及流程

阿丹: 之前一直对于大模型的微调和训练这两个名词不是很清晰,所有找了一个时间来弄明白到底有什么区别以及到底要怎么去使用去做。并且上手实践一下。 大模型业务全流程: 大模型为啥要微调?有哪些微调方式? 模型参数…

Jeecg | 如何解决 ERR Client sent AUTH, but no password is set 问题

最近在尝试Jeecg低代码开发,但是碰到了超级多的问题,不过总归是成功运行起来了。 下面说说碰到的最后一个配置问题:连接redis失败 Error starting ApplicationContext. To display the conditions report re-run your application with deb…

基于STC12C5A60S2系列1T 8051单片机的TM1638键盘数码管模块的数码管显示与单片机连接的按键的按键值的功能

基于STC12C5A60S2系列1T 8051单片机的TM1638键盘数码管模块的数码管显示与单片机连接的按键的按键值应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍TM1638键盘数码…

【设计模式】JAVA Design Patterns——Static Content Hosting(静态内容托管模式)

🔍目的 将静态内容部署到基于云的存储服务,该服务可以将它们直接交付给客户端。 这可以减少对昂贵计算实例的需求。 🔍解释 真实世界例子 全球性的营销网站(静态内容)需要快速的部署以开始吸引潜在的客户。为了将托管…

【STL】C++ vector基本使用

目录 一 vector常见构造 1 空容器构造函数(默认构造函数) 2 Fill 构造函数 3 Range 构造函数 4 拷贝构造函数 5 C11构造 二 vector迭代器 1 begin && end 2 rbegin && rend 3 补充排序 三 vector 容量操作 1 size 2 resize …

Gin框架学习笔记(六)——gin中的日志使用

gin内置日志组件的使用 前言 在之前我们要使用Gin框架定义路由的时候我们一般会使用Default方法来实现,我们来看一下他的实现: func Default(opts ...OptionFunc) *Engine {debugPrintWARNINGDefault()engine : New()engine.Use(Logger(), Recovery())…

探秘SpringBoot默认线程池:了解其运行原理与工作方式(@Async和ThreadPoolTaskExecutor)

文章目录 文章导图Spring封装的几种线程池SpringBoot默认线程池TaskExecutionAutoConfiguration(SpringBoot 2.1后)主要作用优势使用场景如果没有它 2.1版本以后如何查看参数方式一:通过Async注解--采用ThreadPoolTaskExecutordetermineAsync…

LiveGBS流媒体平台GB/T28181用户手册-基础配置:信令服务配置、流媒体服务配置、白名单、黑名单、更多配置

LiveGBS流媒体平台GB/T28181用户手册-基础配置:信令服务配置、流媒体服务配置、白名单、黑名单、更多配置 1、基础配置1.1、信令服务配置1.2、白名单1.3、黑名单1.4、流媒体服务配置 2、搭建GB28181视频直播平台 1、基础配置 LiveGBS相关信令服务配置和流媒体服务配置都在这里…

React 中Redux结合React-Redux使用类组件版本(一)

一、Redux是什么? 1.Redux是一个专门用于状态管理的js库 2.它可以用在React、Angular、Vue的项目中,但基本与React配合使用。 3.作用:集中式管理React应用中多个组件共享的状态。 二、Redux 工作流程 三、Redux的三个核心概念 1.action 动…

在AndroidStudio创建虚拟手机DUB-AI20

1.DUB-AI20介绍 DUB-AL20是华为畅享9全网通机型。 华为畅享9采用基于Android 8.1定制的EMUI 8.2系统,最大的亮点是配置了1300万AI双摄、4000mAh大电池以及AI人脸识别功能,支持熄屏快拍、笑脸抓拍、声控拍照、手势拍照等特色的拍照功能,支持移…

搭建属于自己的 Git 仓库:GitLab

搭建属于自己的 Git 仓库:使用 GitLab 文章目录 搭建属于自己的 Git 仓库:使用 GitLab什么是 GitLab?准备工作安装 Docker使用Docker Compose 快速构建GitLab1、从docker compose快速搭建GitLab2、部署到服务器并访问3、浏览器访问 在现代软件…

Ant Design pro 6.0.0 搭建使用以及相关配置

一、背景 在选择一款比较合适的中台的情况下,挑选了有arco design、ant design pro、soybean、vue-pure-admin等中台系统,经过筛选就选择了ant design pro。之前使用过arco design 搭建通过组件库拼装过后台管理界面,官方文档也比较全&#…

数据库SQL语言实战(十)(最后一篇)

目录 前言 练习题 实验八 实验九 题目一 题目二 总结 前言 本篇练习题的重点有两个: 一、测试提交commit和回滚rollback的作用,了解锁等待、授权等知识。 二、学会复制表结构、学会插入数据,特别是学会如何避免重复插入,也就是如何避…

I2C SPI UART TCP/UDP AD/DA PWM大总结

I2C SPI UART TCP/UDP AD/DA PWM大总结 1. I2C总线描述1.1 基础协议内容1.1.1 通信时序1.1.2 一般通讯时序1.1.3 Burst模式 2. SPI总线2.1 基础协议内容 3. UART4. TCP/UDP5. AD/DA5.1 AD的原理5.2 DA的原理 6. PWM 1. I2C总线描述 I2C的特点:半双工,同步…

起保停电路工作原理

一、电路组成 起保停电路由电源保护设备(空气开关)、交流接触器、启动按钮、停止按钮和用电设备组成。 起保停电路的组成部分通常可分为四个部分: 保护部分:(空气开关)在电流或电压超出一定范围时自动切断…

计网期末复习指南:物理层(物理层的任务、香农公式、常用信道复用技术)

前言:本系列文章旨在通过TCP/IP协议簇自下而上的梳理大致的知识点,从计算机网络体系结构出发到应用层,每一个协议层通过一篇文章进行总结,本系列正在持续更新中... 计网期末复习指南(一):计算机…

SpringBoot学习小结之RocketMQ

文章目录 前言一、架构设计1.1 架构图1.2 消息1.3 工作流程 二、部署2.1 单机2.2 集群 三、Springboot Producter3.1 准备3.2 pom依赖、yml 配置3.3 普通消息3.4 顺序、批量、延迟消息3.5 事务消息 四、Springboot Consumer4.1 配置4.2 普通Push消费4.3 回复4.4 集群和广播4.5 …