Traceback (most recent call last): File "D:\yaogan\Paraformer-main\Paraformer-main\train.py", line 53, in <module> net.load_from(weights=np.load(config_vit.pretrained_path)) File "D:\yaogan\Paraformer-main\Paraformer-main\networks\vit_seg_modeling.py", line 400, in load_from unit.load_from(weights, n_block=uname) File "D:\yaogan\Paraformer-main\Paraformer-main\networks\vit_seg_modeling.py", line 173, in load_from query_weight = np2th(weights[pjoin(ROOT, ATTENTION_Q, "kernel")]).view(self.hidden_size, self.hidden_size).t() ~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\xrl\.conda\envs\torch\Lib\site-packages\numpy\lib\npyio.py", line 263, in __getitem__ raise KeyError(f"{key} is not a file in the archive") KeyError: 'Transformer/encoderblock_0\\MultiHeadDotProductAttention_1/query\\kernel is not a file in the archive'
首先,检查文件路径是否正确。用户可能提供了错误的路径,导致npz文件没有正确加载。需要确认路径是否存在,是否有拼写错误,或者文件权限问题。
其次,检查npz文件内容。用户可能使用了错误的文件,或者文件在保存时键名与实际不一致。需要加载npz文件后打印所有键名,查看是否存在所需的键,或者键名是否有不同的命名规则,比如使用了不同的分隔符或大小写。
然后,考虑模型架构是否匹配。用户可能在加载权重时,模型的结构与预训练模型的结构不一致,比如层名或参数名不匹配。例如,用户代码中的层名是'MultiHeadDotProductAttention_1',而预训练模型可能使用了不同的命名方式,比如'MultiHeadAttention'或者层号不同。
接下来,检查文件格式是否正确。用户可能误用了文件格式,比如应该使用PyTorch的.pth文件却用了npz文件,或者npz文件在保存时有其他结构,比如嵌套的字典。
此外,还有可能是在加载过程中没有正确解压npz文件。需要确保使用np.load正确加载,并通过files属性查看所有可用键。
可能的解决方案包括:验证文件路径和内容,调整键名以匹配,转换模型格式,或修改模型架构的层名。如果用户使用的是PyTorch,可能需要通过state_dict来加载权重,而不是直接使用numpy。同时,如果预训练模型来自其他框架如TensorFlow,可能需要键名的转换。
用户可能需要逐步排查这些问题,比如打印npz文件的键列表,检查模型层的命名,或者使用PyTorch的加载方法,确保模型结构和预训练权重的一致性。此外,转换工具如HuggingFace的模型转换脚本可能有助于处理不同框架间的差异。在使用numpy加载预训练模型权重时遇到KeyError
,通常由以下原因导致。我们将分步骤分析并给出解决方案:
1. 检查文件路径和内容
首先验证.npz
文件是否完整且路径正确:
import numpy as np
# 加载文件并打印所有键名
data = np.load('pretrain_model.npz', allow_pickle=True)
print("Keys in npz file:", data.files) # 查看所有可用键[^1]
- 如果输出不包含报错中的键名
'Transformer/encoderblock_0/MultiHeadDotProductAttention_1/query/kernel'
,说明文件与模型架构不匹配 - 可能原因:预训练模型来自其他框架(如TensorFlow),键名格式与当前框架(如PyTorch)不兼容
2. 键名格式修正
若文件来自TensorFlow,键名可能包含冗余前缀(如Transformer/encoderblock_0/...
),需对齐PyTorch的层命名规则:
# 示例:修改键名映射
key_mapping = {
'Transformer/encoderblock_0/MultiHeadDotProductAttention_1/query/kernel': 'transformer.layers.0.attention.query.weight'
}
for tf_key, torch_key in key_mapping.items():
if tf_key in data:
model.state_dict()[torch_key].copy_(torch.from_numpy(data[tf_key]))
3. 使用PyTorch原生加载方式
对于PyTorch模型,推荐直接加载.pth
文件:
import torch
model = YourModelClass()
model.load_state_dict(torch.load('pretrain_model.pth'))
- 若需从
.npz
转换到.pth
,可遍历键值对并重命名
4. 检查模型架构一致性
确保自定义模型与预训练模型的层结构完全匹配:
# 打印模型结构对比
print("Model layers:", model.state_dict().keys())
print("Pretrained keys:", data.files)
- 若发现命名差异(如
MultiHeadDotProductAttention
vsMultiHeadAttention
),需修改模型定义或键名映射
5. 跨框架转换工具
使用HuggingFace的转换脚本处理TensorFlow与PyTorch的模型转换:
python convert_tf_checkpoint_to_pytorch.py --tf_checkpoint_path=model.ckpt --pytorch_dump_path=model.pth
相关推荐
















