我正在尝试加载 Pytorch 模型的权重,但出现此错误:
_pickle.UnpicklingError: invalid load key, '\x1f'.
这是权重加载代码:
import os
import torch
import numpy as np
# from data_loader import VideoDataset
import timm
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print('Device being used:', device)
mname = os.path.join('./CDF2_0.pth')
checkpoints = torch.load(mname, map_location=device)
print("Checkpoint loaded successfully.")
model = timm.create_model('legacy_xception', pretrained=True, num_classes=2).to(device)
model.load_state_dict(checkpoints['state_dict'])
model.eval()
我尝试过不同的 Pytorch 版本。我尝试通过将扩展名更改为 .zip 并使用存档管理器打开来检查权重,但无法解决问题。这是我正在尝试加载的权重 .pth 文件的公共链接。非常感谢任何帮助!
当尝试打开 gzip 文件(就像是 pickle 或 pytorch 文件一样)时,该错误很常见,因为 gzip 以
1f
字节开头。但这不是一个有效的 gzip:它看起来像一个损坏的 pytorch 文件。
确实,看看
hexdump -C file.pt | head
(如下所示),它的大部分看起来像一个pytorch文件(应该是一个ZIP存档,而不是gzip,包含一个名为data.pkl的python pickle文件)。但前几个字节是错误的:它不是像 ZIP 文件那样开始(字节 50 4B
或 ASCII PK
),而是像 gzip
文件(1f 8b 08 08
)一样开始。所以就好像前 21-31 字节被替换为(有效,空?)gzip 文件头。
您的文件:
00000000 1f 8b 08 08 ff 35 29 67 02 ff 43 44 46 32 5f 30 |.....5)g..CDF2_0|
00000010 2e 70 74 68 00 03 00 00 00 00 00 00 00 00 00 44 |.pth...........D|
00000020 46 32 5f 30 2f 64 61 74 61 2e 70 6b 6c 46 42 0f |F2_0/data.pklFB.|
00000030 00 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a |.ZZZZZZZZZZZZZZZ|
00000040 80 02 7d 71 00 28 58 08 00 00 00 62 65 73 74 5f |..}q.(X....best_|
00000050 61 63 63 71 01 63 6e 75 6d 70 79 2e 63 6f 72 65 |accq.cnumpy.core|
torch.save 生成的有效 pickle:
00000000 50 4b 03 04 00 00 08 08 00 00 00 00 00 00 00 00 |PK..............|
00000010 00 00 00 00 00 00 00 00 00 00 0c 00 16 00 74 6d |..............tm|
00000020 70 2f 64 61 74 61 2e 70 6b 6c 46 42 12 00 5a 5a |p/data.pklFB..ZZ|
00000030 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a |ZZZZZZZZZZZZZZZZ|
00000040 80 02 63 74 6f 72 63 68 2e 5f 75 74 69 6c 73 0a |..ctorch._utils.|
00000050 5f 72 65 62 75 69 6c 64 5f 74 65 6e 73 6f 72 5f |_rebuild_tensor_|