python - 在 pytorch 模型中获取权重和偏差并将其复制到另一个模型中的类似层的正确方法是什么?
问题描述
我正在尝试将权重从预训练模型逐层复制到另一个结构完全相同的模型中。原始模型在二值图像分类问题上的准确率为 94%,但目标模型无法预测,导致整个测试集只能预测一个类别。
例如,我使用这段代码手动将权重从预训练模型的茎复制到目标的茎:
modelmix.stem[0].weight = modelSep.stem[0].weight
modelmix.stem[1].weight = modelSep.stem[1].weight
modelmix.stem[1].bias = modelSep.stem[1].bias
其中 modelmix 是目标,modelSep 是预训练模型。对所有其他层使用了类似的片段。即使我可以看到所有层的权重都相似,目标模型也不起作用。我正在使用 pytorch 1.1。谢谢
解决方案
您可以创建另一个参数名称相同的模型,例如:
import torch.nn as nn
model1 = nn.Sequential()
model1.add_module('layer1', nn.Linear(10, 20))
model1.add_module('layer2', nn.Linear(20, 10))
model2 = nn.Sequential()
model2.add_module('layer1', nn.Linear(10, 20))
model2.add_module('layer2', nn.Linear(20, 10))
model2.add_module('layer3', nn.Linear(10, 5))
然后您可以将 model1 state_dict 加载到 model2,反之亦然 kwargs strict=False
。
model2.load_state_dict(model1.state_dict(), strict=False)
如果你想要更定制的东西,你应该按照你说的去。
推荐阅读
- tensorflow - 在 tensorflow.js 中对张量进行分区或屏蔽或过滤
- node.js - 续集如何在 Model.update 中引用实例
- html - 引导程序、HTML 和 CSS
- c# - ParallelEnumerable.WithDegreeOfParallelism() 不限制任务?
- sed - Issue assigning a SED to a variable
- eclipse-pdt - Eclipse PDT/PHP Getting XXX 无法解析为类型
- java - 如何获取智能手机上安装的杀毒软件信息?
- apache-spark - 如何获取 DataFrame 的字符串表示形式(与 Dataset.show 一样)?
- spring-mvc - Apache Camel - 多部分文件上传
- css - 博主“动态视图”标题 css