来自云龙湖轮廓分明的月亮 发表于 2024-11-30 15:43:16

深入理解 PyTorch .pth 文件和 Python pickle 模块:功能、应用及实际示例

深入理解 PyTorch .pth 文件和 Python pickle 模块:功能、应用及实际示例
在深入理解Python的pickle模块和PyTorch的.pth文件,以及pickle在.pth文件中的应用前,我们首先需要掌握序列化和反序列化的根本概念。
序列化和反序列化

序列化是指将程序中的对象转换为一个字节序列的过程,这样就可以将其存储到磁盘上或通过网络传输到其他位置。反序列化是序列化的逆过程,即将字节序列规复为原始对象。这两个过程是数据持久化和远程计算通讯的底子。
Python的pickle模块

pickle是Python的尺度库之一,提供了一个简朴的方法用于序列化和反序列化Python对象结构。任何Python对象都可以通过pickle进行序列化,只要它们是pickle支持的范例。
核心功能:


[*]pickle.dump(obj, file):将对象obj序列化并写入到文件对象file中。
[*]pickle.load(file):从文件对象file中读取序列化的对象并反序列化。
[*]pickle.dumps(obj):将对象obj序列化为一个字节对象,不写入文件。
[*]pickle.loads(bytes_object):将字节对象bytes_object反序列化为一个Python对象。
pickle的序列化过程不光包罗对象当前的状态(例如,数字,字符串,或复杂对象的集合),也包罗对象的范例信息和结构。
PyTorch的.pth文件

在PyTorch中,.pth文件扩展通常用于保存模子的权重或整个模子。这些文件通过使用torch.save()函数创建,它内部使用pickle来序列化对象。.pth文件通常包罗模子的状态字典(state_dict),这是一个从每个层的参数名称映射到其张量值的字典。
核心用途:


[*]模子持久化:保存训练后的模子状态,以便将来可以重新加载和使用模子,不需要重新训练。
[*]模子迁移:将训练好的模子参数迁移到新的模子结构或平台上。
pickle在.pth文件中的应用

当使用torch.save()来保存一个PyTorch模子或张量时,pickle用于将对象和它的条理结构转换为一个字节流,然后这个字节流被写入到一个.pth文件中。在加载模子时,torch.load()使用pickle来反序列化这个字节流,重修模子或张量。
示例:
import torch
import torchvision.models as models

# 实例化一个预训练的ResNet模型
model = models.resnet18(pretrained=True)

# 保存模型状态字典
torch.save(model.state_dict(), 'model_weights.pth')

# 加载模型状态字典
loaded_state_dict = torch.load('model_weights.pth')
new_model = models.resnet18(pretrained=False)
new_model.load_state_dict(loaded_state_dict)

# 打印以验证加载
print(new_model)
在这个示例中,torch.save()内部使用pickle来序列化model.state_dict(),并将其保存为model_weights.pth。然后,我们使用torch.load()来加载这个.pth文件,此中pickle负责反序列化文件内容,并规复为Python对象(在这种环境下是模子的状态字典)。最后,状态字典被用于初始化一个新的模子实例。
通过这种方式,pickle在PyTorch的模子保存和加载过程中扮演了核心角色,使得模子的状态可以在不同的计算环境中被迁移和复用。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 深入理解 PyTorch .pth 文件和 Python pickle 模块:功能、应用及实际示例