我目前正在使用fast.ai来训练图像分类器模型。
data = ImageDataBunch.single_from_classes(path,classes,ds_tfms = get_transforms(),size = 224).normalize(imagenet_stats)学习者= …
我的强烈猜测是 stage-2.pth 包含两个顶级项:模型本身(其权重)和用于训练它的优化器的最终状态。要仅加载模型,您只需要前者。假设事情是用惯用的PyTorch方式完成的,我会尝试
stage-2.pth
learner.model.load_state_dict( torch.load('stage-2.pth', map_location="cpu")['model'] )
更新:在应用我的第一轮建议之后,很明显你正在加载一个保存点创建,其模型与你加载它的模型不同(可能是不同的?)模型。正如您在pastebin中看到的那样,保存点包含一些额外图层的权重,而不是模型中存在的权重,例如 bn3 , downsample 等
bn3
downsample
“0.4.0.bn3.running_var”,“0.4.0.bn3.num_batches_tracked”,“0.4.0.downsample.0.weight”
同时一些其他的关键名称匹配,但张量具有不同的形状。
大小不匹配0.5.0.downsample.0.weight:从检查点复制形状为torch.Size([512,256,1,1])的参数,当前模型中的形状为torch.Size([128,64, 1,1]。
我看到一种模式,你一直试图加载一个形状参数 [2^(x+1), 2^x, 1, 1] 代替 [2^(x), 2^(x-1), 1, 1] 。也许您正在尝试加载不同深度的模型(例如,为vgg-11加载vgg-16权重?)。无论哪种方式,您都需要确定用于创建保存点的确切体系结构,然后在加载保存点之前重新创建它。
[2^(x+1), 2^x, 1, 1]
[2^(x), 2^(x-1), 1, 1]
PS。如果你不确定 - 保存点包含模型权重,以及它们的形状和(自动生成的)名称。他们是这样 不 包含架构本身的完整规范 - 您需要向自己保证,您正在呼叫 model.load_state_dict 同 model 与用于创建保存点的结构完全相同。否则,您的体重名称可能会不匹配。
model.load_state_dict
model