问题
原以为MMdetection针对模型backbone处进行参数冻结训练网上会有大量的教程,刚刚网上查了一下没找到,于是自己动手去发现解决
以YOLOX模型为例,调用CSPDarknet时,定义了_freeze_stage方法,并在train方法中调用。self.frozen_stages默认为-1,即不会对模型进行参数冻结,
1、可以在定义CspDarknet类时,构造函数__init__中frozen_stages=如0,1,2,3(注意不要超过stages数量)
2、也可以在配置文件中backbone的字典里添加frozen_stages,如:ackbone=dict(type=‘CSPDarknet’, deepen_factor=0.33, widen_factor=0.5,frozen_stages=2)
可能存在问题
假使定义的runner属于epoch_based_runner,在下图的epoch_based_runner中可以查看到,epoch_based_runner中定义的train函数中调用了model的train方法,但是model的train方法一直是冻结网络参数,因此可以再定义一个train_unfrozen方法,设置结构的required_grad=True。
并且在epoch_based_runner中的train方法中根据self.epoch传入epoch_runner中,选择调用model.train()还是model.train_unfrozen()。
总结
如果有疑问或者意见可以评论留言,谢谢