说明:比如我们之前定义的一个模型model_1,训练之后保存了模型参数,命名为checkpoint_1;然后我们在model_1的基础上修改了模型,在内部添加了一些新的参数(或者更改了参数的名称),命名为model_2,训练之后保存了模型参数,命名为checkpoint_2。
一般而言,我们在测试时,使用的模型model,要加载相应的模型参数信息,即checkpoint。
1,如果我们使用的模型是model_1,而加载的模型参数是checkpoint_2,这时可能会出现Unexpected key(s) in state_dict: …这类错误。因为checkpoint_2内保存的模型参数是model_2的参数,而model_2是在model_1的基础上添加了一些参数,我们把模型参数checkpoint_2加载到模型model_1上,就会多出一些不能匹配的参数。
2,如果我们使用的模型是model_2,而加载的模型参数是checkpoint_1,这时可能会出现Missing key(s) in state_dict: …这类错误。因为checkpoint_1内保存的模型参数是model_1的参数,而model_1要比model_2内部少一些参数,我们把模型参数checkpoint_1加载到模型model_2上,就会出现缺少参数这类错误。
3,如果是更改了model中参数的名称,可能会同时出现上述两种错误。如上述代码中所显示错误!
我遇到的问题是:
RuntimeError: Error(s) in loading state_dict for BertModel:
Missing key(s) in state_dict: “embeddings.position_ids”.
解决方法:
self.bert.load_state_dict(ckpt[“bert-base”], False)