Deeplearning知识蒸馏

merge

paddleslim.dist.merge(teacher_programstudent_programdata_name_mapplacescope=fluid.global_scope()name_prefix='teacher_')

merge将teacher_program融合到student_program中。在融合的program中,可以为其中合适的teacher特征图和student特征图添加蒸馏损失函数,从而达到用teacher模型的暗知识(Dark Knowledge)指导student模型学习的目的。

参数:

  • teacher_program (Program)-定义了teacher模型的 paddle program
  • student_program (Program)-定义了student模型的 paddle program
  • data_name_map (dict)-teacher输入接口名与student输入接口名的映射,其中dict的 key 为teacher的输入名,value 为student的输入名
  • place (fluid.CPUPlace()|fluid.CUDAPlace(N))-该参数表示程序运行在何种设备上,这里的N为GPU对应的ID
  • scope (Scope)-该参数表示程序使用的变量作用域,如果不指定将使用默认的全局作用域。默认值: fluid.global_scope()
  • name_prefix (str)-merge操作将统一为teacher的 Variables 添加的名称前缀name_prefix。默认值:’teacher_

返回: 无

注解

data_name_map 是 teacher_var namestudent_var name的映射 ,如果写反可能无法正确进行merge

使用示例:

import paddle.fluid as fluid

import paddleslim.dist as dist

student_program = fluid.Program()

with fluid.program_guard(student_program):

x = fluid.layers.data(name='x', shape=[1, 28, 28])

conv = fluid.layers.conv2d(x, 32, 1)

out = fluid.layers.conv2d(conv, 64, 3, padding=1)

teacher_program = fluid.Program()

with fluid.program_guard(teacher_program):

y = fluid.layers.data(name='y', shape=[1, 28, 28])

conv = fluid.layers.conv2d(y, 32, 1)

conv = fluid.layers.conv2d(conv, 32, 3, padding=1)

out = fluid.layers.conv2d(conv, 64, 3, padding=1)

data_name_map = {'y':'x'}

USE_GPU = False

place = fluid.CUDAPlace(0) if USE_GPU else fluid.CPUPlace()

dist.merge(teacher_program, student_program,

data_name_map, place)

fsp_loss

paddleslim.dist.fsp_loss(teacher_var1_nameteacher_var2_namestudent_var1_namestudent_var2_nameprogram=fluid.default_main_program())

fsp_loss为program内的teacher var和student var添加fsp loss,出自论文 A Gift from Knowledge Distillation: Fast Optimization, Network Minimization and Transfer Learning

参数:

  • teacher_var1_name (str): teacher_var1的名称. 对应的variable是一个形为`[batch_size, x_channel, height, width]`的4-D特征图Tensor,数据类型为float32或float64
  • teacher_var2_name (str): teacher_var2的名称. 对应的variable是一个形为`[batch_size, y_channel, height, width]`的4-D特征图Tensor,数据类型为float32或float64。只有y_channel可以与teacher_var1的x_channel不同,其他维度必须与teacher_var1相同
  • student_var1_name (str): student_var1的名称. 对应的variable需与teacher_var1尺寸保持一致,是一个形为`[batch_size, x_channel, height, width]`的4-D特征图Tensor,数据类型为float32或float64
  • student_var2_name (str): student_var2的名称. 对应的variable需与teacher_var2尺寸保持一致,是一个形为`[batch_size, y_channel, height, width]`的4-D特征图Tensor,数据类型为float32或float64。只有y_channel可以与student_var1的x_channel不同,其他维度必须与student_var1相同
  • program (Program): 用于蒸馏训练的fluid program。默认值: fluid.default_main_program()

返回: 由teacher_var1, teacher_var2, student_var1, student_var2组合得到的fsp_loss

使用示例:

l2_loss

paddleslim.dist.l2_loss(teacher_var_namestudent_var_nameprogram=fluid.default_main_program())[[]](https://github.com/PaddlePaddle/PaddleSlim/blob/develop/paddleslim/dist/single_distiller.py#L118)

: l2_loss为program内的teacher var和student var添加l2 loss

参数:

  • teacher_var_name (str): teacher_var的名称.
  • student_var_name (str): student_var的名称.
  • program (Program): 用于蒸馏训练的fluid program。默认值: fluid.default_main_program()

返回: 由teacher_var, student_var组合得到的l2_loss

使用示例:

soft_label_loss

paddleslim.dist.soft_label_loss(teacher_var_namestudent_var_nameprogram=fluid.default_main_program()teacher_temperature=1.student_temperature=1.)[[]](https://github.com/PaddlePaddle/PaddleSlim/blob/develop/paddleslim/dist/single_distiller.py#L136)

soft_label_loss为program内的teacher var和student var添加soft label loss,出自论文 Distilling the Knowledge in a Neural Network

参数:

  • teacher_var_name (str): teacher_var的名称.
  • student_var_name (str): student_var的名称.
  • program (Program): 用于蒸馏训练的fluid program。默认值: fluid.default_main_program()
  • teacher_temperature (float): 对teacher_var进行soft操作的温度值,温度值越大得到的特征图越平滑
  • student_temperature (float): 对student_var进行soft操作的温度值,温度值越大得到的特征图越平滑

返回: 由teacher_var, student_var组合得到的soft_label_loss

使用示例:

loss

paddleslim.dist.loss(loss_funcprogram=fluid.default_main_program()**kwargs) [[]](https://github.com/PaddlePaddle/PaddleSlim/blob/develop/paddleslim/dist/single_distiller.py#L165)

: loss函数支持对任意多对teacher_var和student_var使用自定义损失函数

参数:

  • **loss_func**( python function): 自定义的损失函数,输入为teacher var和student var,输出为自定义的loss
  • program (Program): 用于蒸馏训练的fluid program。默认值: fluid.default_main_program()
  • **kwargs : loss_func输入名与对应variable名称

返回 :自定义的损失函数loss

使用示例:

注解

在添加蒸馏loss时会引入新的variable,需要注意新引入的variable不要与student variables命名冲突。这里建议两种用法(两种方法任选其一即可):

  1. 建议与student_program使用同一个命名空间,以避免一些未指定名称的variables(例如tmp_0, tmp_1...)多次定义为同一名称出现命名冲突
  2. 建议在添加蒸馏loss时指定一个命名空间前缀

Deeplearning知识蒸馏的更多相关文章

  1. 知识蒸馏(Distillation)

    蒸馏神经网络取名为蒸馏(Distill),其实是一个非常形象的过程. 我们把数据结构信息和数据本身当作一个混合物,分布信息通过概率分布被分离出来.首先,T值很大,相当于用很高的温度将关键的分布信息从原 ...

  2. 【论文考古】知识蒸馏 Distilling the Knowledge in a Neural Network

    论文内容 G. Hinton, O. Vinyals, and J. Dean, "Distilling the Knowledge in a Neural Network." 2 ...

  3. 【DKNN】Distilling the Knowledge in a Neural Network 第一次提出神经网络的知识蒸馏概念

    原文链接 小样本学习与智能前沿 . 在这个公众号后台回复"DKNN",即可获得课件电子资源. 文章已经表明,对于将知识从整体模型或高度正则化的大型模型转换为较小的蒸馏模型,蒸馏非常 ...

  4. 通过Python包来剪枝、蒸馏DNN

    用 Distiller 压缩 PyTorch 模型 作者: PyTorch 中文网发布: 2018年7月15日 5,101阅读 0评论 近日,Intel 开源了一个用于神经网络压缩的开源 Python ...

  5. ICCV2021 | 简单有效的长尾视觉识别新方案:蒸馏自监督(SSD)

    ​  前言  本文提出了一种概念上简单但特别有效的长尾视觉识别的多阶段训练方案,称为蒸馏自监督(Self Supervision to Distillation, SSD).在三个长尾识别基准:Ima ...

  6. Bert不完全手册1. 推理太慢?模型蒸馏

    模型蒸馏的目标主要用于模型的线上部署,解决Bert太大,推理太慢的问题.因此用一个小模型去逼近大模型的效果,实现的方式一般是Teacher-Stuent框架,先用大模型(Teacher)去对样本进行拟 ...

  7. DeiT:注意力也能蒸馏

    DeiT:注意力也能蒸馏 <Training data-efficient image transformers & distillation through attention> ...

  8. 知识图谱顶刊综述 - (2021年4月) A Survey on Knowledge Graphs: Representation, Acquisition, and Applications

    知识图谱综述(2021.4) 论文地址:A Survey on Knowledge Graphs: Representation, Acquisition, and Applications 目录 知 ...

  9. Bag of Tricks for Image Classification with Convolutional Neural Networks论文笔记

    一.高效的训练     1.Large-batch training 使用大的batch size可能会减小训练过程(收敛的慢?我之前训练的时候挺喜欢用较大的batch size),即在相同的迭代次数 ...

随机推荐

  1. hdu 4309 最大流 + DFS

    题意:      给以三种有向边     (1) 隧道,可以过无数人,也可以藏c个人.     (2) 路,只能过人(流量INF).     (3)古桥,如果不修理可以过1个人,修理可以过无数个人,但 ...

  2. CTFHub-技能树-信息泄露

    CTFHub-技能树-信息泄露 1.目录遍历 文件夹不多,直接手翻就行 2.PHPinfo 直接搜索ctfhub{就能找到 3.备份文件下载 3-1 网站源码 打开之后: 因为这里组合比较少可以手动测 ...

  3. pr2019快键键

    pr快捷键 平时用到就更新一下(持续更新),算是日积月累吧.虽然是pr2019,但是其他的版本估计差不多 视频剪辑的时候,快速预览--L(英文输入法).按一次,速度*2,如果想恢复原来速度,按空格键暂 ...

  4. 分享一个PHP登录小妙招

    待完善 思想参照fastadmin api 文件路径 /fastadmin/application/common/library/Auth.php->login().logout().isLog ...

  5. .NET之生成数据库全流程

    开篇语 本文主要是回顾下从项目创建到生成数据到数据库(代码优先)的全部过程.采用EFCore作为ORM框架. 本次示例环境:vs2019.net5.mysql 创建项目 本次事例代码是用过vs2019 ...

  6. Python中Socket编程(TCP、UDP)

    1. TCP协议下的如何解决粘包问题 TCP(transport control protocol 传输控制协议)  使用Nagle算法,将多次间隔较小且数据量小的数据,合并成大的数据块:接受端无法识 ...

  7. Java中如何保证线程顺序执行

    只要了解过多线程,我们就知道线程开始的顺序跟执行的顺序是不一样的.如果只是创建三个线程然后执行,最后的执行顺序是不可预期的.这是因为在创建完线程之后,线程执行的开始时间取决于CPU何时分配时间片,线程 ...

  8. mysql 连表不要用varchar和int这两种不相同的类型做比较

    他会默认你123abc等于123 说多了都是泪啊

  9. 在其他程序集访问internal类

    前言  本文将介绍如何在其他程序集访问internal类的方法 首先我们新建一个解决方案,其中同时新建两个类库FooALibray和FooALibray,如下: 其中FooA类代码如下: intern ...

  10. [Django框架 - 注意事项,安装,项目搭建,小白必会三板斧]

    [Django框架 - 注意事项,安装,项目搭建,小白必会三板斧] 想要正常运行django项目所需要知道的注意事项 1. 计算机名称不能有中文,不然bug在哪儿你都不知道! 2. 项目名和py文件名 ...