微调

https://zh-v2.d2l.ai/chapter_computer-vision/fine-tuning.html

书中翻译错误指正。

Torch版459页,“我们使⽤的热狗数据集来源于⽹络。该数据集包含 1400 张包含热狗的正⾯类图像以及包含其他⻝物的尽可能多的负⾯级图像。两个 课程 的 1000 张图⽚⽤于训练,其余的则⽤于测试。”
应该是 类别 ,我猜英文版可能是class,翻译错了

1 Like

你好!请教一下,demo上采用的resnet18模型是torchvision.models库里的,采用pretrained=True进行。
pretrained_net = torchvision.models.resnet18(pretrained=True)
如果不采用torchvision.models库里的模型,而是从外部提供的模型进行fine tuning,需要怎么操作?谢谢

首先你要构建一个和你所说的外部模型一样结构的模型(你想要载入的那部分要一致,无需载入的部分如最后的输出层倒无所谓),然后加载那个模型预训练的state_dict,要注意的是你构建的模型与预训练的模型各层的命名要一致,否则load_state_dict会报错。load_state_dict中参数设置strict=False,仅加载一致部分(如下代码)

# 构建模型
# Build your model

# 加载预训练的state_dict
pretrained_state_dict = torch.load(pretrained_path)
# 检验参数数量,确保能匹配
matched_state_dict = {k: v for k, v in pretrained_state_dict.items()
                      if model.state_dict()[k].numel() == v.numel()}
# 不严格载入,加载模型中一致的部分
model.load_state_dict(matched_state_dict, strict=False)

# 后续微调
# To be implemented
1 Like

感谢 @brian-zZZ! 已发PR. 欢迎以后contribute到本书!

冻结分类层之前的参数,跟微调哪个效果会更好?

微调就是冻结分类层前面的层的参数,我猜你想问的是微调和全部不冻结训练二者哪个更好?一般后者会更佳,但是相应地要更新的参数也更多,训练所需时间也更多,需要权衡一下

T3 与 T4 实验
原迁移学习本地结果:

loss 0.287, train acc 0.901, test acc 0.927
1501.1 examples/sec on [device(type=‘cuda’, index=0), device(type=‘cuda’, index=1), device(type=‘cuda’, index=2), device(type=‘cuda’, index=3)]

冻结预训练参数结果:

loss 0.362, train acc 0.884, test acc 0.922
2197.8 examples/sec on [device(type=‘cuda’, index=0), device(type=‘cuda’, index=1), device(type=‘cuda’, index=2), device(type=‘cuda’, index=3)]

利用原hotdog类参数做初始化结果:

loss 0.210, train acc 0.923, test acc 0.938
1022.9 examples/sec on [device(type=‘cuda’, index=0), device(type=‘cuda’, index=1), device(type=‘cuda’, index=2), device(type=‘cuda’, index=3)]