python-3.x - RuntimeError:为 ResNet 加载 state_dict 时出错:
问题描述
我正在使用以下代码加载我的模型。
def load_model(checkpoint_path):
'''
Function that loads a checkpoint and rebuilds the model
'''
checkpoint = torch.load(checkpoint_path, map_location = 'cpu')
if checkpoint['architecture'] == 'resnet18':
model = models.resnet18(pretrained=True)
# Freezing the parameters
for param in model.parameters():
param.requires_grad = False
else:
print('Wrong Architecture!')
return None
model.class_to_idx = checkpoint['class_to_idx']
classifier = nn.Sequential(OrderedDict([
('fc1', nn.Linear(512, 1024)),
('relu1', nn.ReLU()),
('dropout', nn.Dropout(0.2)),
('fc2', nn.Linear(1024, 102))
]))
model.fc = classifier
model.load_state_dict(checkpoint['state_dict'])
return model
并且在运行时
# Load your model to this variable
model = load_model('checkpoint.pt')
我收到以下错误,
RuntimeError Traceback (most recent call last) in () 1 # 将模型加载到此变量 ----> 2 model = load_model('checkpoint.pt') 3 4 # 如果您使用的不是 224x224 裁剪图像,请设置这里的正确尺寸 5 image_size = 224
<ipython-input-11-81aef50793cb> in load_model(checkpoint_path) 30 model.fc = classifier 31 ---> 32 model.load_state_dict(checkpoint['state_dict']) 33 34 return model /opt/conda/lib/python3.6/site-packages/torch/nn/modules/module.py in load_state_dict(self, state_dict, strict) 719 if len(error_msgs) > 0: 720 raise RuntimeError('Error(s) in loading state_dict for {}:\n\t{}'.format( --> 721 self.__class__.__name__, "\n\t".join(error_msgs))) 722 723 def parameters(self): RuntimeError: Error(s) in loading state_dict for ResNet: Unexpected key(s) in state_dict: "bn1.num_batches_tracked", "layer1.0.bn1.num_batches_tracked", "layer1.0.bn2.num_batches_tracked", "layer1.1.bn1.num_batches_tracked", "layer1.1.bn2.num_batches_tracked", "layer2.0.bn1.num_batches_tracked", "layer2.0.bn2.num_batches_tracked", "layer2.0.downsample.1.num_batches_tracked", "layer2.1.bn1.num_batches_tracked", "layer2.1.bn2.num_batches_tracked", "layer3.0.bn1.num_batches_tracked", "layer3.0.bn2.num_batches_tracked", "layer3.0.downsample.1.num_batches_tracked", "layer3.1.bn1.num_batches_tracked", "layer3.1.bn2.num_batches_tracked", "layer4.0.bn1.num_batches_tracked", "layer4.0.bn2.num_batches_tracked", "layer4.0.downsample.1.num_batches_tracked", "layer4.1.bn1.num_batches_tracked", "layer4.1.bn2.num_batches_tracked".
解决方案
我使用的是 Pytorch 0.4.1,但我加载的 Jupyter Notebook 使用的是 0.4.0。所以我在load_state_dict()中添加了strict=False属性。
model.load_state_dict(checkpoint['state_dict'], strict=False)
推荐阅读
- python - PyYAML 使用前导问号作为键转储 dict 并在下一行打印值
- r - 如何在 ggplot2 中没有数据的 y 轴上添加额外标签
- python - 如何使用 COMPARISON_TYPE returnType 和布尔输入调用 cx_Oracle 中的函数?
- php - 如何让 jQuery 和 js 在 heroku 上工作
- c - 在 Windows 上使用 Visual Studio Code 调试 C
- java - 在 For 循环中添加一个特别选择的数字来计算总乘数 Java
- python - 如何检测 csv 文件中的断开链接
- c++ - 在 Mac 上的 Ubuntu VM 上使用 Mesa/OpenGL 4.5 进行软件渲染
- google-sheets - 如何突出显示不从“QA-”(区分大小写)开始的列(Google 电子表格)中的所有单元格?
- c - 在现有 C 项目中集成 Go 文件