加入预训练模型,若是报类似以下的错误:
Unexpected key(s) in state_dict: "layer1.0.weight", "layer1.0.bias", "layer1.1.weight", "layer1.1.bias", "layer1.1._var", "layer2.0.weight", "layer2.0.bias", "layer2.1.weight", "layer2.1.bias", "layer2.1.running_mean", "layer2.1.running_v0.bias", "layer3.1.weight", "layer3.1.bias", "layer3.1.running_mean", "layer3.1.running_var", "layer4.0.weight", "layer4.0.4.1.bias", "layer4.1.running_mean", "layer4.1.running_var", "layer5.0.weight", "layer5.0.bias", "layer5.1.weight", "layer5., "layer5.1.running_var".
最直接的方法,放与代码网络匹配的预训练模型!!!
其他的比较好找,就不提供了。这里提供一个匹配Tularov Arbi复现的SiamRPN预训练模型,链接如下:
https://pan.baidu.com/s/1road7tNSIc65VRjtiDSTiw提取码:69nq
还是要推荐一下Tularov Arbi复现的SiamRPN代码。这个代码看着很舒服、很整洁。比较容易看懂。
下面解决的方法就比较复杂了!!!
出现上述错误,因为我们构建的网络模型和加入的预训练模型的key值不对应。说key值可能不太好理解。用下面例子简单说一下:
预训练模型构建的网络:
我们自己构建的网络:
如上所示,self.layer1就好比keys。 而我们的是self.featureExtractd,这两是没有办法对应上的。所以运行的时候就报出现意外的keys的错误。
我们按着预训练模型keys值的结构,重新构建我们的网络就可以了。还有一点这样重新构建可以解决上述问题。但是想运行通可能还需要改一些地方的代码,这就需要按着你的代码要求去修改了!
最后放一个查看模型key值的代码:
checkpoint = torch.load(config.pretrained_model, map_location='cpu')
for k,v in checkpoint.items():
print(k)
print("hcc-wyq")