mxnet:finetune 几层写法
程序员文章站
2022-05-27 09:42:10
...
深度学习中,常常会用到finetuning。
所谓的finetune也就是微调,在已有的训练好的模型基础上,将该模型参数部分转移到新模型上或者全部作为新模型的初始化方式。这样带来好处就是不同数据源不同任务之间的快速训练达到想要的效果。
这种学习方式也就是常说的迁移学习,当然,迁移学习的知识点很多,还是需要更多的去仔细研究和学习的。
这几天尝试了一下微调,发现mxnet里面的这部分还是可以记录一下的,以便以后用到。
(1)主要用到的api函数:
set_lr_mult(dict):输入时个dict。
该函数的目的是设置一个layer和其对应的lr的一个dict,以便优化器的调用。当我们finetune的时候,有时候需要固化某些层(基本是前几层,保持共性,微调后几层,找特性)。所以对于一个加载进来的模型,每一层对应的学习率是完全不一样的,这个时候就需要这个函数了。
比如说:
一个三层的网络,分别为conv_0,bn_0,fc_1。
如果希望不动前两层的参数,只调节最后一层的参数,那么对应的lr就应该是0,0,lr。写成dict的形式就是{'conv_0':0,'bn_0':0,‘fc_1’:lr}。
(2)步骤:
#step 1:set an optimizer
optimizer=mx.optimizer.Optimizer.create_optimizer('sgd',learning_rate=0.01)
#step 2:获取固定的层名
finetune_layer={'name1','name2'}#just an example
#step 3:设置不同的学习lv
finetune_lr=dict({k:0 for k in finetune_layers})
#step 4:optimizer
optimizer.set_lr_mult(finetune_lr)
-----------------------------------------------update-----------------------------------
需要设置rescale——grad,详情见下一篇博文。
修改代码:
#step 1:set an optimizer
optimizer=mx.optimizer.Optimizer.create_optimizer('sgd',learning_rate=0.01,rescale_grad=1/batch_size)