Deeplearning知识蒸馏
Deeplearning知識蒸餾
merge
paddleslim.dist.merge(teacher_program, student_program, data_name_map, place, scope=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 name到student_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_name, teacher_var2_name, student_var1_name, student_var2_name, program=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_name, student_var_name, program=fluid.default_main_program())[]
: 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_name, student_var_name, program=fluid.default_main_program(), teacher_temperature=1., student_temperature=1.)[]
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_func, program=fluid.default_main_program(), **kwargs) []
: 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命名沖突。這里建議兩種用法(兩種方法任選其一即可):
- 建議與student_program使用同一個命名空間,以避免一些未指定名稱的variables(例如tmp_0, tmp_1…)多次定義為同一名稱出現命名沖突
- 建議在添加蒸餾loss時指定一個命名空間前綴
總結
以上是生活随笔為你收集整理的Deeplearning知识蒸馏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: deeplearning量化
- 下一篇: 硬件delay评估表