state_dict 中的意外键:"model"、"opt"
Unexpected key(s) in state_dict: "model", "opt"
我目前正在使用 fast.ai 来训练图像分类器模型。
data = ImageDataBunch.single_from_classes(path, classes, ds_tfms=get_transforms(), size=224).normalize(imagenet_stats)
learner = cnn_learner(data, models.resnet34)
learner.model.load_state_dict(
torch.load('stage-2.pth', map_location="cpu")
)
结果是:
torch.load('stage-2.pth', map_location="cpu") File
"/usr/local/lib/python3.6/site-packages/torch/nn/modules/module.py",
line 769, in load_state_dict
self.class.name, "\n\t".join(error_msgs))) RuntimeError: Error(s) in loading state_dict for Sequential:
...
Unexpected key(s) in state_dict: "model", "opt".
我查看了 SO 并尝试使用以下解决方案:
# original saved file with DataParallel
state_dict = torch.load('stage-2.pth', map_location="cpu")
# create new OrderedDict that does not contain `module.`
from collections import OrderedDict
new_state_dict = OrderedDict()
for k, v in state_dict.items():
name = k[7:] # remove `module.`
new_state_dict[name] = v
# load params
learner.model.load_state_dict(new_state_dict)
结果是:
RuntimeError: Error(s) in loading state_dict for Sequential:
Unexpected key(s) in state_dict: "".
我正在使用 Google Colab 来训练我的模型,然后将经过训练的模型移植到 docker 并尝试在本地服务器中托管。
可能是什么问题?会不会是pytorch版本不同导致模型不匹配?
在我的 docker 配置中:
# Install pytorch and fastai
RUN pip install torch_nightly -f https://download.pytorch.org/whl/nightly/cpu/torch_nightly.html
RUN pip install fastai
当我的 Colab 使用以下内容时:
!curl -s https://course.fast.ai/setup/colab | bash
我强烈猜测 stage-2.pth
包含两个顶级项目:模型本身(其权重)和用于训练它的优化器的最终状态。要仅加载模型,您只需要前者。假设事情是以惯用的 PyTorch 方式完成的,我会尝试
learner.model.load_state_dict(
torch.load('stage-2.pth', map_location="cpu")['model']
)
更新:在应用了我的第一轮建议后,很明显您正在加载一个保存点,该保存点创建的模型与您正在加载它的模型不同(可能配置不同?)。正如您在 pastebin 中看到的那样,保存点包含一些额外层的权重,这些层不存在于您的模型中,例如 bn3
、downsample
等。
"0.4.0.bn3.running_var", "0.4.0.bn3.num_batches_tracked", "0.4.0.downsample.0.weight"
同时一些其他键名匹配,但张量形状不同。
size mismatch for 0.5.0.downsample.0.weight: copying a param with shape torch.Size([512, 256, 1, 1]) from checkpoint, the shape in current model is torch.Size([128, 64, 1, 1]).
我看到一个模式,您一直尝试加载形状为 [2^(x+1), 2^x, 1, 1]
的参数来代替 [2^(x), 2^(x-1), 1, 1]
。也许您正在尝试加载不同深度的模型(例如,为 vgg-11 加载 vgg-16 权重?)。无论哪种方式,您都需要找出用于创建保存点的确切体系结构,然后在加载保存点之前重新创建它。
PS。如果您不确定 - 保存点包含模型权重,以及它们的形状和(自动生成的)名称。它们 不 包含体系结构本身的完整规范 - 你需要向自己保证,你正在调用 model.load_state_dict
和 model
是完全相同的体系结构用于创建保存点。否则你的权重名称可能会不匹配。
我目前正在使用 fast.ai 来训练图像分类器模型。
data = ImageDataBunch.single_from_classes(path, classes, ds_tfms=get_transforms(), size=224).normalize(imagenet_stats)
learner = cnn_learner(data, models.resnet34)
learner.model.load_state_dict(
torch.load('stage-2.pth', map_location="cpu")
)
结果是:
torch.load('stage-2.pth', map_location="cpu") File "/usr/local/lib/python3.6/site-packages/torch/nn/modules/module.py", line 769, in load_state_dict self.class.name, "\n\t".join(error_msgs))) RuntimeError: Error(s) in loading state_dict for Sequential:
...
Unexpected key(s) in state_dict: "model", "opt".
我查看了 SO 并尝试使用以下解决方案:
# original saved file with DataParallel
state_dict = torch.load('stage-2.pth', map_location="cpu")
# create new OrderedDict that does not contain `module.`
from collections import OrderedDict
new_state_dict = OrderedDict()
for k, v in state_dict.items():
name = k[7:] # remove `module.`
new_state_dict[name] = v
# load params
learner.model.load_state_dict(new_state_dict)
结果是:
RuntimeError: Error(s) in loading state_dict for Sequential:
Unexpected key(s) in state_dict: "".
我正在使用 Google Colab 来训练我的模型,然后将经过训练的模型移植到 docker 并尝试在本地服务器中托管。
可能是什么问题?会不会是pytorch版本不同导致模型不匹配?
在我的 docker 配置中:
# Install pytorch and fastai
RUN pip install torch_nightly -f https://download.pytorch.org/whl/nightly/cpu/torch_nightly.html
RUN pip install fastai
当我的 Colab 使用以下内容时:
!curl -s https://course.fast.ai/setup/colab | bash
我强烈猜测 stage-2.pth
包含两个顶级项目:模型本身(其权重)和用于训练它的优化器的最终状态。要仅加载模型,您只需要前者。假设事情是以惯用的 PyTorch 方式完成的,我会尝试
learner.model.load_state_dict(
torch.load('stage-2.pth', map_location="cpu")['model']
)
更新:在应用了我的第一轮建议后,很明显您正在加载一个保存点,该保存点创建的模型与您正在加载它的模型不同(可能配置不同?)。正如您在 pastebin 中看到的那样,保存点包含一些额外层的权重,这些层不存在于您的模型中,例如 bn3
、downsample
等。
"0.4.0.bn3.running_var", "0.4.0.bn3.num_batches_tracked", "0.4.0.downsample.0.weight"
同时一些其他键名匹配,但张量形状不同。
size mismatch for 0.5.0.downsample.0.weight: copying a param with shape torch.Size([512, 256, 1, 1]) from checkpoint, the shape in current model is torch.Size([128, 64, 1, 1]).
我看到一个模式,您一直尝试加载形状为 [2^(x+1), 2^x, 1, 1]
的参数来代替 [2^(x), 2^(x-1), 1, 1]
。也许您正在尝试加载不同深度的模型(例如,为 vgg-11 加载 vgg-16 权重?)。无论哪种方式,您都需要找出用于创建保存点的确切体系结构,然后在加载保存点之前重新创建它。
PS。如果您不确定 - 保存点包含模型权重,以及它们的形状和(自动生成的)名称。它们 不 包含体系结构本身的完整规范 - 你需要向自己保证,你正在调用 model.load_state_dict
和 model
是完全相同的体系结构用于创建保存点。否则你的权重名称可能会不匹配。