故障排除
从旧版本的PyKEEN加载模型
如果你的模型是在不同版本的PyKEEN上训练的,你可能在使用torch.load('trained_model.pkl')加载模型时会遇到困难。
这可能是由于以下一个或两个原因:
模型类结构可能已更改。
模型权重名称可能已更改。
请注意,PyKEEN目前不支持模型迁移。请尝试以下步骤来加载模型。
如果模型类结构已更改
你可能会看到类似这样的异常:ModuleNotFoundError:
No module named ...
在这种情况下,尝试直接实例化模型类,并仅从模型文件加载状态字典。
保存模型的
state_dict,使用用于训练的PyKEEN版本:import torch from pykeen.pipeline import pipeline result = pipeline(dataset="Nations", model="RotatE") torch.save(result.model.state_dict(), "v1.7.0/model.state_dict.pt")
使用您想要使用的PyKEEN版本加载模型。首先实例化模型,然后加载状态字典:
import torch from pykeen.datasets import get_dataset from pykeen.models import RotatE dataset = get_dataset(dataset="Nations") model = RotatE(triples_factory=dataset.training) state_dict = torch.load("v1.7.0/model.state_dict.pt") model.load_state_dict(state_dict)
如果模型权重名称已更改
你可能会看到类似这样的异常:
RuntimeError: Error(s) in loading state_dict for RotatE:
Missing key(s) in state_dict: "entity_representations.0._embeddings.weight", "relation_representations.0._embeddings.weight".
Unexpected key(s) in state_dict: "regularizer.weight", "regularizer.regularization_term", "entity_embeddings._embeddings.weight", "relation_embeddings._embeddings.weight".
在这种情况下,您需要检查不同版本中的state-dict字典,并尝试匹配键。然后在加载之前相应地修改state dict。例如:
import torch
from pykeen.datasets import get_dataset
from pykeen.models import RotatE
dataset = get_dataset(dataset="Nations")
model = RotatE(triples_factory=dataset.training)
state_dict = torch.load("v1.7.0/model.state_dict.pt")
# these are some example changes in weight names for RotatE between two different pykeen versions
for old_name, new_name in [
(
"entity_embeddings._embeddings.weight",
"entity_representations.0._embeddings.weight",
),
(
"relation_embeddings._embeddings.weight",
"relation_representations.0._embeddings.weight",
),
]:
state_dict[new_name] = state_dict.pop(old_name)
# in this example, the new model does not have a regularizer, so we need to delete corresponding data
for name in ["regularizer.weight", "regularizer.regularization_term"]:
state_dict.pop(name)
model.load_state_dict(state_dict)
警告
即使可以加载状态字典,仍然存在权重使用方式不同的风险。这可能导致模型行为的差异。为了确保模型仍然以相同的方式运行,您还应该检查一些模型预测并检查模型定义如何发生了变化。