pytorch如何给预训练模型添加新的层
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pytorch如何给预训练模型添加新的层相关的知识,希望对你有一定的参考价值。
参考技术A 在使用pytorch预训练模型的时候发现预训练模型的输出层没有激活函数,为了提高模型的训练效果需要自己添加。以ResNet50为例:输出的模型为:
可以看到最后的输出层是没有激活函数的,因此我们需要队fc层进行修改:
网络模型的fc层就变成了
如果我们扩展或减少同一模型的层,我们仍然可以从 Pytorch 中的预训练模型进行训练吗?
【中文标题】如果我们扩展或减少同一模型的层,我们仍然可以从 Pytorch 中的预训练模型进行训练吗?【英文标题】:If we expand or reduce the layer of the same model, can we still be able to train from pretrained model in Pytorch? 【发布时间】:2021-11-24 17:15:36 【问题描述】:如果 Resnet101 等预训练模型是在 ImageNet 数据集上训练的,那么我会更改其中的一些层。我还能在不同的 ABC 数据集上使用预训练模型吗?
假设这是 ResNet34 模型,
在 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'])
我可以这样做吗?还是有其他方法?
【问题讨论】:
“如果我改变了其中的一些层,可以说我通过在 conv4_x 中引入一些层来使其更深(检查图像)”你是怎么做到的? 【参考方案1】:你可以做任何你想做的事——问题是:这会比从头开始训练更好吗?
以下是您可能会遇到的一些问题:
1. ResNet.pt
(原始 ResNet18 的训练权重)中保存的权重与修改后模型的 state_dict
中保存的权重不匹配。
您可能需要手动确保将旧权重正确分配给原始层,并且只有新层未初始化。
2。初始化新层的权重。 由于您正在训练 resNet - 您可以利用残差连接并初始化新层的权重,这样它最初不会对预测值做出任何贡献,而只会通过残差链接将输入直接传递给输出。
【讨论】:
是的,权重会不匹配。假设我更改了单层,该层产生 [64,3,3,3] 的输出,并且在预训练模型中将没有这样的层,这个 [64,3,3,3] 不会与它不匹配。为了匹配该层,我必须创建具有 [64,3,3,3] 随机权重的数组,并使其不计入初始层中的预测贡献,这就是你想要我做的吗?那么接下来的反向传播会根据之前的操作进行训练吗?以上是关于pytorch如何给预训练模型添加新的层的主要内容,如果未能解决你的问题,请参考以下文章
迁移学习(Transfer learning)重用预训练图层预训练模型库