关于使用paddle进行图像分类模型finetune训练的坑
Created by: lgone2000
在使用图像分类训练时,有一个参数是指定预训练模型。 https://github.com/PaddlePaddle/models/blob/53ea0f3186504a9c619651ce862fa576a9144424/PaddleCV/image_classification/train.py#L291
if pretrained_model:
def if_exist(var):
return os.path.exists(os.path.join(pretrained_model, var.name))
fluid.io.load_vars(
exe, pretrained_model, main_program=train_prog, predicate=if_exist)
这段代码如果载入了之前训练的模型,有可能也同时载入了一个
@LR_DECAY_COUNTER@
的变量 (参考文档) , 会导致learningratedecay策略使用预训练模型里面保存的计数器,而不是从0开始,这个和通常训练预期不符合。经过咨询paddle同学,可以改成如下形式,通过限制载入条件,避免加载这个变量。 if pretrained_model:
def check_var(var):
exists = os.path.exists(os.path.join(pretrained_model, var.name))
if var.persistable:
if var.name == '@LR_DECAY_COUNTER@':
return False
else:
if not exists:
print('missing variable', var.name)
return False
return True
return exists
fluid.io.load_vars(
exe, pretrained_model, main_program=train_prog, predicate=check_var)
另外需要注意的是,分类模型如果需要finetune,需要把最后分类层改一个名字,避免加载错误的参数。经过验证上述改动可用,其他预训练模型使用程序也可能遇到类似问题,供大家参考。
建议paddle同学把这个内容加到文档中明确标明,也同时修改一下models/paddlecv相关代码。