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. 『政善治』Postman工具 — 2、Postman主界面详细介绍

    目录 1.Postman菜单栏 (1)File 菜单 (2)Edit 菜单 (3)View 菜单 (4)Help 菜单 2.Postman工具栏 3.Postman工具栏中的系统设置 4.Postma ...

  2. Windows中的权限设置、文件压缩、文件加密、磁盘配额和卷影副本

      目录 权限设置 文件夹的NTFS权限 文件的NTFS权限 NTFS权限的应用规则 文件压缩 文件加密 磁盘配额 卷影副本 权限设置的应用 遇到的一个权限问题的小bug 权限问题的实际应用 权限设置 ...

  3. POJ 3228 二分最大流

    题意:       给你N个位置,每个位置都有金矿数量和仓库数量,然后位置和位置之间的距离给了出来,最后问你吧所有的金矿都放到库里面走的路径 最长的最短 是多少? 思路:      比较简单的一个题, ...

  4. C#-CMD

    private static string InvokeCmd(string cmdArgs) { string Tstr = ""; Process p = new Proces ...

  5. C++ 模板元编程简单小栗子

    最近看了看模板的元编程,感觉有点意思. 一些计算可以在编译过程就能够完成,榨干编译器的最后一点资源. stl中用的全是这些玩意. 当然,这增加了编译时长. 我记得貌似有"图灵完备" ...

  6. 批处理用WINRAR只压缩某类型的文件

    1:新建文件夹sql back 和 back,在sql back 文件夹内新建test1.dbb和test2.bak文件 2:新建批处理文件rar.bat,编辑文件: @echo off for %% ...

  7. Python内置函数(Built-in Function)

    直接查看编码以及示例: 1 """ 2 内置函数 Built-in Function 3 """ 4 5 # abs() 取绝对值 6 pr ...

  8. CentOS7 / CentOS8 设置终端屏幕分辨率

    Centos7 修改文件 /boot/grub2/grub.cfg 搜索 linux16 / /vmlinuz-3.10.0-123.el7.x86_64 root=UUID=881ac4e6-4a5 ...

  9. [DB] Spark Streaming

    概述 流式计算框架,类似Storm 严格来说不是真正的流式计算(实时计算),而是把连续的数据当做不连续的RDD处理,本质是离散计算 Flink:和 Spark Streaming 相反,把离散数据当成 ...

  10. [刷题] PTA 03-树2 List Leaves

    程序: 1 #include <stdio.h> 2 #include <queue> 3 #define MaxTree 20 4 #define Null -1 5 usi ...