python - 如果我们扩展或减少同一模型的层,我们仍然可以从 Pytorch 中的预训练模型进行训练吗?
问题描述
如果 Resnet101 等预训练模型是在 ImageNet 数据集上训练的,那么我会更改其中的一些层。我仍然可以在不同的 ABC 数据集上使用预训练模型吗?
它在 ImageNet 上进行了预训练并保存为ResNet.pt文件。
如果我更改了其中的一些层,可以说我通过在 conv4_x 中引入一些层使其更深(检查图像)
model = Resnet34() #I have changes some layers inside this ResNet34()
optimizer = optim.Adam(model.parameters(), lr=0.00005)
model.load_state_dict(torch.load('Resnet.pt')['state_dict']) #This is pretrained model of ResNet before some changes
optimizer.load_state_dict(torch.load('Resnet.pt')['optimizer'])
我可以这样做吗?还是有其他方法?
解决方案
你可以做任何你喜欢的事情——问题是:这会比从头开始训练更好吗?
以下是您可能会遇到的几个问题:
1. 保存ResNet.pt
的权重(原始 ResNet18 的训练权重)与state_dict
修改后的模型的权重不匹配。
您可能需要手动确保将旧权重正确分配给原始层,并且只有新层未初始化。
2. 初始化新层的权重。
由于您正在训练 resNet - 您可以利用残差连接并初始化新层的权重,这样它最初不会对预测值做出贡献,而只会通过残差链接将输入直接传递到输出。
推荐阅读
- html - 无法在登陆网页上打开下拉菜单、超链接和超链接按钮
- php - 期待 'STRING'、'NUMBER'、'NULL'、'TRUE'、'FALSE'、'{'、'[',得到 'undefined' (PHP)
- mysql - 使用别名到where子句查询mysql
- python - 处理日期时熊猫效率的问题
- three.js - 如何在使用 THREE.js 的客户片段着色器中将 RGB 用于 tDiffuse
- docker - Docker:./entrypoint.sh 未找到
- syntax - 在 Java 中打印一个模式
- c - 使用 const 指针或 const 数据有什么好处?
- php - 在laravel中将多个数据插入数据库
- python - 将数据框转换为列表和字典