《Channel-wise Knowledge Distillation for Dense Prediction》论文详解

2023-05-16

原文地址:《Channel-wise Knowledge Distillation for Dense Prediction》

代码地址: https://git.io/Distille(由原文提供,好像打不开了)

该文发表在ICCV2021上。文章针对密集性预测任务(dense prediction)提出一种简单而有效的蒸馏方式,之前的知识蒸馏方式之前对于密集预测任务的蒸馏方法都是通过在空间维度上对齐老师和学生网络的activation maps,文章认为直接在空间维度上蒸馏可能会将老师网络中的多余信息带入学生网络,所以文章采用通道维度上进行蒸馏。

这里在说明一下dense prediction任务,dense prediction是一种将输入图片映射为复杂输出的一类任务,例如语义分割、深度估计、物体检测等。(参考文献《Structured Knowledge Distillation for Dense Prediction》)

一、KL散度

在解释文章思想之前,想先介绍一下KL散度。

根据维基百科中的解释,KL散度是用来度量使用基于Q的分布来编码服从P的分布的样本所需的额外的平均比特数。通俗来说KL散度就是用来给出P分布和Q分布之间的差异值。

对于离散随机变量,P和Q两个分布的KL散度可以用下列公式表示:
D K L ( P ∣ ∣ Q ) = − ∑ i P ( i ) l n Q ( i ) P ( i ) D_{KL}(P||Q)=-\sum_iP(i)ln\frac{Q(i)}{P(i)} DKL(P∣∣Q)=iP(i)lnP(i)Q(i)
还要注意一点的是KL散度是不对称的,所以存在公式
D K L ( P ∣ ∣ Q ) ≠ D K L ( Q ∣ ∣ P ) D_{KL}(P||Q) \neq D_{KL}(Q||P) DKL(P∣∣Q)=DKL(Q∣∣P)

二、方法介绍

2.1 空间维度的蒸馏(spatial distillatioin)

在介绍本文的蒸馏方法前,先介绍一下空间维度的蒸馏方式。

空间维度的蒸馏方式可以用下式表示:
l ( y , y S ) + α ⋅ φ ( ϕ ( y T ) , ϕ ( y S ) ) l(y, y^S)+\alpha\cdot\varphi(\phi(y^T), \phi(y^S)) l(y,yS)+αφ(ϕ(yT),ϕ(yS))
上式中 l ( y , y S ) l(y, y^S) l(y,yS)表示预测值与gt之间的loss,那语义分割来说通常使用交叉熵loss。 y T y^T yT y S y^S yS表示logits输出或者网络中的激活层,T和S上角标分别表示老师模型和学生模型。 α \alpha α 为平衡loss的超参数。 φ \varphi φ表示loss计算函数, ϕ \phi ϕ表示对输入的预测 y T y^T yT或者 y S y^S yS进行变换,不同算法这两个符号计算方式不一样,具体如下表所示。

在这里插入图片描述

从上述公式和表中可以看出,该类方法是针对输出所有通道作为空间上的一点来计算的。

2.2 通道维度的蒸馏

如下图c所示,网络输出特征不同的通道关注的重点是不一样的。(a, b表示空间维度和通道维度的蒸馏方式)

在这里插入图片描述

为了更好的对网络输出的每个通道进行知识提取,在计算学生和老师网络之间差异之前,先在通道维度上,将输出的激活值转换成一个概率分布图,然后再去计算老师和学生之间的差异。

先进行一些符号的定义,老师网络用T表示,学生网络用S表示, y T y^T yT表示老师输出的特征, y S y^S yS表示学生输出的特征。

通道维度的蒸馏loss也可以用通用的公式形式表示
φ ( ϕ ( y T ) , ϕ ( y S ) = φ ( ϕ ( y c T ) , ϕ ( y c S ) \varphi(\phi(y^T), \phi(y^S)=\varphi(\phi(y_c^T), \phi(y_c^S) φ(ϕ(yT),ϕ(yS)=φ(ϕ(ycT),ϕ(ycS)
在文中提出的方法, ϕ ( ⋅ ) \phi(\cdot) ϕ()表示将激活通道转换为概率分布:
ϕ ( y c ) = e x p ( y c , i τ ) ∑ i = 1 W ⋅ H e x p ( y c , i τ ) \phi(y_c)=\frac{exp(\frac{y_{c,i}}{\tau})}{\sum^{W\cdot H}_{i=1}exp(\frac{y_{c,i}}{\tau})} ϕ(yc)=i=1WHexp(τyc,i)exp(τyc,i)
其中 c = 1 , 2 , . . . , C c=1, 2, ..., C c=1,2,...,C表示通道的索引,i表示每个通道上的空间位置索引。 τ \tau τ表示超参,该值越大,表示概率越分散(softer),也即关注的空间位置越大。

当存在老师的输出通道数与学生输出通道数不一致的情况,这里使用 1 × 1 1\times 1 1×1的卷积对学生的输出进行处理,使其与老师的输出通道数一致。

上面 φ \varphi φ是用来判断老师的输出通道分布与学生的输出通道分布的差异,这里采用KL散度来计算
φ ( y T , y S ) = τ 2 C ∑ c = 1 C ∑ i = 1 W ⋅ H ϕ ( y c , i T ) ⋅ l o g [ ϕ ( y c , i T ) ϕ ( y c , i S ) ] \varphi(y^T, y^S)=\frac{\tau^2}{C}\sum^{C}_{c=1}\sum^{W\cdot H}_{i=1}\phi(y^T_{c,i})\cdot log\big[\frac{\phi(y^T_{c,i})}{\phi(y^S_{c,i})}\big] φ(yT,yS)=Cτ2c=1Ci=1WHϕ(yc,iT)log[ϕ(yc,iS)ϕ(yc,iT)]
文字基本原理就是这些,具体实验可以查看原文,但有一点说明的是,文章中在做feature的蒸馏,好像并没有说明用的是哪些层输出的feature

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《Channel-wise Knowledge Distillation for Dense Prediction》论文详解 的相关文章

  • 学习ROS-Academy-for-Beginners-noetic,修改记录

    一 编译安装ROS Academy for Beginners noetic 可以参考我之前的博客ROS Academy for Beginers noetic安装教程 之后可以看到里面提供了很多例程 xff0c 包括 软件包 内容 rob
  • Go中 channel的使用

    文章目录 背景 channel 简介 使用说明 声明 发送和接受数据 关闭channel 使用示例 背景 使用 sync 包和 context 包的工具可以实现多个协程之间互相协作 但是没有一种很好的方式解决多个协程之间通信的问题 gola
  • 【Java】【NIO】【01】NIO设计理念

    什么是NIO NIO中的N 既有New的含义 也有Non blocking的含义 它是Java1 4之后推出来的一套非阻塞式IO接口 用于解决高并发 提升IO性能 NIO的主要改变 NIO主要的改变在于以下几点 通过Channel取代Str
  • Netty入门-Channel

    目录 Channel详解 Channel的特点 Channel接口方法 ChannelOutboundInvoker接口 AttributeMap接口 ChannelHandler接口 ChannelInboundHandler接口 Cha
  • Python 的 map、列表推导、循环效率比较

    话不多说 直接上代码 1 准备数据 三个列表 import time x x1 x2 for i in range 1000000 x append i x1 append i x2 append i 2 开始表演 2 1 for循环 st
  • NIO:通道Channel讲解

    了解了缓冲区后 下来需要了解真正传输数据的通道Channel Channel是做什么用的 再来简单回顾一下 通道顾名思义就是传递的介质 Channel就类似于传统IO中的流 是直接对接操作系统的 当我们处理好缓冲区后 就可以通过缓冲区对通道
  • Java 控制结构练习题

    练习1 某人有100 000元 每经过一次路口 需要交费 规则如下 1 当现金 gt 50000时 每次交5 2 当现金 lt 50000时 每次交1000 编程计算该人可以经过多少次路口 要求 使用while break方式完成 publ
  • 教妹学Java(十五):for循环详解

    你好呀 我是沉默王二 一枚颜值与才华俱在的程序员 本篇教程通过我和三妹对话的形式来谈一谈 for while do while 循环之间的差别 以及重点介绍一下 for 循环 while do while 会在接下来的教程中单独介绍 教妹学
  • matlab for循环坑

    matlab 用 for 嵌套循环遍历数组时 可能有 bug matlab octave 环境 linux Matlab R2018a 1 windows GNU Octave version 5 2 0 以 for x vector 的形
  • Go并发和通道混乱

    我是 Go 新手 在理解并发和通道方面遇到问题 package main import fmt func display msg string c chan bool fmt Println display first message ms
  • 一次仅向一名用户(而非频道)实时推送更新。怎么做?

    我正在创建一个网络应用程序 网站 其中我的服务器将向客户端推送一些信息的实时更新 使用 Pusher api 因此 当服务器将更新推送到该 CHANNEL 时 订阅该 CHANNEL 的用户就可以收到更新 但是 由于我的应用程序的性质 一次
  • 将标准输入击键发送到通道,无需换行

    我想在每次击键发送到标准输入后 直接将用户的击键发送到通道 我尝试了下面的代码 但这并没有给出预期的结果 因为reader ReadByte 方法会阻塞 直到输入换行符 func chars lt chan byte ch make cha
  • 按名称将频道添加到类别

    var server message guild for var i 0 i lt server channels array length i server channels array i delete server createCha
  • 线程中断未结束输入流读取上的阻塞调用

    我正在使用 RXTX 从串行端口读取数据 读取是在按以下方式生成的线程中完成的 CommPortIdentifier portIdentifier CommPortIdentifier getPortIdentifier port Comm
  • 可以让通道保持开放状态吗?

    如果我从不检查 Go 通道的状态 是否可以永远保持 Go 通道打开 从不关闭通道 会导致内存泄漏吗 下面的代码可以吗 func requestCh chan lt Request GetResponse data RequestData R
  • 如何对线程使用静态生命周期?

    我目前正在为 Rust 1 0 的生命周期而苦苦挣扎 尤其是在通过通道传递结构时 我如何编译这个简单的例子 use std sync mpsc Receiver Sender use std sync mpsc use std thread
  • Golang通道,执行顺序

    我正在学习 Go 并且遇到了以下代码片段 package main import fmt func sum a int c chan int sum 0 for v range a sum v c lt sum send sum to c
  • Netty:关闭通道时出现 ClosedChannelException

    为什么当我尝试关闭通道时 会抛出 ChannelClosedException 使用 Channel close 关闭 异常的堆栈跟踪 java nio channels ClosedChannelException at org jbos
  • Spring Integration 通道统计指标

    不知怎的 我没有捕捉到 Spring Integration Metrics 内容 我想要的是关于每秒有多少消息通过消息通道 最小和最大吞吐量是多少的统计输出 如果我使用newTicketChannel getSendRate 然后我变成以
  • 在 Go 中将事物通道作为接口通道传递

    我的程序有一个管道结构 我刚刚实现了一个缓存过滤器 如果已处理的数据版本在缓存中 则该过滤器将直接将内容发送到输出 func Run in chan downloader ReadyDownload chan CCFile out make

随机推荐

  • C++ 中的char型变量

    最简单的字符数据类型是 char 数据类型 该类型的变量只能容纳一个字符 xff0c 而且在大多数系统上 xff0c 只使用一个字节的内存 以下示例即声明了一个名为 letter 的 char 变量 请注意 xff0c 这里的字符常数就是赋
  • linux下DISPLAY和xhost + 作用

    在Linux Unix类操作系统上 DISPLAY用来设置将图形显示到何处 直接登陆图形界面或者登陆命令行界面后使用startx启动图形 DISPLAY环境变量将自动设置为 0 0 此时可以打开终端 输出图形程序的名称 比如xclock 来
  • 配置 maven 编译的 JDK 版本

    两种方式 xff1a 一 可以修改 MAVEN 的 setting xml 文件 xff0c 统一修改 lt profiles gt lt profile gt lt id gt jdk 1 6 lt id gt lt activation
  • 利用redis的setIfAbsent()方法实现分布式锁

    再集群环境中 xff0c 存在定时任务多次执行 xff0c 浪费资源 xff0c 那么如何避免这种情况呢 xff0c 下面就说明一下如何利用一个注解解决问题 xff0c 利用切面配合redis可以简单实现分布式锁 xff0c 解决定时任务重
  • Virtualbox主机和虚拟机之间文件夹共享及双向拷贝(win7——centos7)

    一 双向拷贝 xff1a 然后 xff0c 还需要通过virtualbox上安装一个增强的工具 此时 xff0c 会在centos上安装一些工具 xff1a 鼠标自动在宿主机 虚拟机之间移出 同时 xff0c 在centos上会出现一个安装
  • Record something about DL

    这篇文章算是DL实践杂谈吧 xff0c 主要是想把自己模型调优和复现算法遇到的一些坑总结一下 xff08 里面的一行字可能是我当时花费了一周甚至更长时间得到的总结 xff09 xff0c 希望能对读者有所帮助 一 熟悉数据 模型是数据的浓缩
  • Image captioning任务常用的评价指标计算

    BLEU ACL 2002Meteor AMTA 2004ROUGE L ACL 2004CIDEr CVPR 2015SPICE ECCV 2016
  • Image captioning评价方法之BLEU (bilingual evaluation understudy)

    文章地址 xff1a BLEU a Method for Automatic Evaluation of Machine Translation 代码地址 非官方 xff1a https github com tylin coco capt
  • Image captioning评价方法之Meteor

    项目地址 xff1a http www cs cmu edu alavie METEOR 代码地址 xff08 非官方实现 xff0c 实现的是项目地址中的1 5版本 xff09 xff1a https github com tylin c
  • Image captioning评价方法之ROUGE-L

    文章地址 xff1a ROUGE A Package for Automatic Evaluation of Summaries 代码地址 非官方 xff1a https github com tylin coco caption 文章由U
  • Image captioning评价方法之CIDEr

    文章地址 xff1a CIDEr Consensus based Image Description Evaluation 代码地址 xff08 非官方 xff0c 且代码实现的是CIDEr D xff09 xff1a https gith
  • Image captioning评价方法之SPICE

    项目地址 xff1a https panderson me spice 上述的项目地址包含了论文地址和代码地址 该方法是由The Australian National University和Macquarie University联合发表
  • R3DS Wrap基本使用方法

    中文的R3DS Wrap软件的教程较少 xff0c 最近刚好实操了一遍 xff0c 特此记录下来 为了描述方便 xff0c 下面将R3DS Wrap简称Wrap 软件官网 xff1a https www russian3dscanner c
  • docker使用入门简介

    一 什么是docker xff1f https www docker com resources what container 使用docker时有两个重要概念 xff0c 一个是镜像 xff08 images xff09 xff0c 一个
  • SpringBoot整合Quartz 实现分布式定时任务调度

    一 Quartz 集群架构 Quartz 是 Java 领域最著名的开源任务调度工具 在上篇文章中 xff0c 我们详细的介绍了 Quartz 的单体应用实践 xff0c 如果只在单体环境中应用 xff0c Quartz 未必是最好的选择
  • 《Attention Is All You Need》算法详解

    该篇文章右谷歌大脑团队在17年提出 xff0c 目的是解决对于NLP中使用RNN不能并行计算 xff08 详情参考 译 理解LSTM xff08 通俗易懂版 xff09 xff09 xff0c 从而导致算法效率低的问题 该篇文章中的模型就是
  • 主流的视频动作类算法任务介绍

    动作识别 action recognition xff1a 是对每个输入视频进行分类 xff0c 识别出视频中人物做出的动作 即输入视频序列 xff0c 得到视频对应的类别 时序动作检测 temporal action detection
  • 视频时序动作识别(video action recognition)介绍

    一 视频时序动作识别算法分类 根据网络的工作方式 xff0c 可以将视频时序动作识别算法大致分为四大类 xff1a 采用2D卷积的方法采用3D卷积的方法双流法引入VLAD的方法 1 1 采用2D卷积的方法 TSM Temporal Shif
  • 视频时序动作检测(temporal action detection)介绍

    一 视频时序动作检测算法 本文中动作检测算法也包含了时序动作提名 xff08 Temporal Action Proposal Generation xff09 时序动作提名与检测的类别不一样的地方是 xff0c 检测一般指定位出动作的边界
  • 《Channel-wise Knowledge Distillation for Dense Prediction》论文详解

    原文地址 xff1a Channel wise Knowledge Distillation for Dense Prediction 代码地址 xff1a https git io Distille xff08 由原文提供 xff0c 好