为什么要用到迁移学习:模型参数过多,数据量过小,直接训练容易导致过拟合。
如何使用迁移学习:1:在大数据集上进行训练,在小数据集上进行finetune。2:根据情况选择是否冻结其中的layer。
背景:在CItyscape上进行训练,cityscape有2975张图片用于训练,然后为了在KITTI semantic segmentation上得到一个结果:
看了其他论文有两个方案,1:直接训练使用十折交叉验证。2:使用在Cityscape数据集上训练的权重微调KITTI。
对于方案一:直接训练,结果还是过拟合,在KITTI的测试集可以达到70的mIoU,但是递交到网站上去测试没见过的图,结果只有45.
对于方案二:微调也分冻结encoder参数微调decoder,和加载预训练权重作为初始化参数,重新训练。
首先第一种:
checkpoint = torch.load(args.finetune)
model.load_state_dict(checkpoint['state_dict'])
print(f'Loaded weights for finetuning: {args.finetune}')
for name, param in model.named_parameters():
f 'encoder_rgb' in name or 'encoder_depth' in name :
param.requires_grad = False
第二种:直接加载将上面的param.requires_grad = False注释掉,也就是重新训练。微调的讲解在最后五分钟
需要注意的是:对Cityscape数据集的预处理要和KITTI的统一,如果不统一的话,收敛的速度特别慢,且结果比较差。