【发布时间】:2021-06-25 20:41:37
【问题描述】:
为什么在将 a state_dict 加载到相同模型架构的新实例后,序列化 pytorch state_dicts 获得的字节会发生变化?
看看:
import binascii
import torch.nn as nn
import pickle
lin1 = nn.Linear(1, 1, bias=False)
lin1s = pickle.dumps(lin1.state_dict())
print("--- original model ---")
print(f"hash of state dict: {hex(binascii.crc32(lin1s))}")
print(f"weight: {lin1.state_dict()['weight'].item()}")
lin2 = nn.Linear(1, 1, bias=False)
lin2.load_state_dict(pickle.loads(lin1s))
lin2s = pickle.dumps(lin2.state_dict())
print("\n--- model from deserialized state dict ---")
print(f"hash of state dict: {hex(binascii.crc32(lin2s))}")
print(f"weight: {lin2.state_dict()['weight'].item()}")
打印
--- original model ---
hash of state dict: 0x4806e6b6
weight: -0.30337071418762207
--- model from deserialized state dict ---
hash of state dict: 0xe2881422
weight: -0.30337071418762207
如您所见,state_dicts 的(泡菜)的哈希值不同,而权重被正确复制。我会假设新模型中的state_dict 在各个方面都等于旧模型。看起来,它没有,因此哈希值不同。
【问题讨论】:
-
这可能是因为 pickle 不会产生适合散列的 repr。 stackoverflow.com/questions/12727571/… 比较键可能是一个更好的主意,然后比较存储在 dict-keys 中的张量是否相等/接近。
-
@UmangGupta 这听起来很合理,我不知道。谢谢!我不知道你的答案(这仍然是一种假设)是否算作“真实”答案,但如果你这样发布,我会将其标记为解决方案。
-
我在答案中进一步阐述了我的回答。希望对您有所帮助。