迁移学习 (Finetune) 中我们经常需要固定pretrained层的学习率,或者把其学习率设置比后面的网络小,这就需要我们对不同的层设置不同的学习率,这里总结一下实现设置每层学习率的方法。
使用net.collect_params(‘re’).setattr(‘lr_mult’,ratio)方法
net.collect_params()
将返回一个ParamterDict
类型的变量,其中包含了网络中所有参数。其函数原型如下:
def collect_params(self,select=None)
model.collect_params('conv1_weight|conv1_bias|fc_weight|fc_bias')
model.collect_params('.*weight|.*bias')
其中select
参数可以为一个正则表达式,从而collect_params
只会选择被该正则表达式匹配上的参数。我们首先把需要单独设置学习率的参数都用正则表达式匹配出来。比如说下面的ResNet50
,其所有参数如下(中间省略了一些层):
print(net.collect_params())
resnet50v1 (
Parameter resnet50v1batchnorm0_gamma (shape=(0,), dtype=<class 'numpy.float32'>)
Parameter resnet50v1batchnorm0_beta (shape=(0,), dtype=<class 'numpy.float32'>)
Parameter resnet50v1batchnorm0_running_mean (shape=(0,), dtype=<class 'numpy.float32'>)
Parameter resnet50v1batchnorm0_running_var (shape=(0,), dtype=<class 'numpy.float32'>)
Parameter resnet50v1conv0_weight (shape=(64, 0, 5, 5), dtype=<class 'numpy.float32'>)
Parameter resnet50v1layer1_batchnorm0_gamma (shape=(0,), dtype=<class 'numpy.float32'>)
Parameter resnet50v1layer1_batchnorm0_beta (shape=(0,), dtype=<class 'numpy.float32'>)
Parameter resnet50v1layer1_batchnorm0_running_mean (shape=(0,), dtype=<class 'numpy.float32'>)
Parameter resnet50v1layer1_batchnorm0_running_var (shape=(0,), dtype=<class 'numpy.float32'>)
Parameter resnet50v1layer1_conv0_weight (shape=(