动手学深度学习(pytorch)学习记录21-读写文件(模型与参数)[学习记录]

2024-08-30 07:28

本文主要是介绍动手学深度学习(pytorch)学习记录21-读写文件(模型与参数)[学习记录],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 加载和保存张量
  • 加载和保存模型参数

保存模型的好处众多,涵盖了从开发到部署的整个机器学习生命周期。

  • 节省资源:训练模型可能需要大量的时间和计算资源。保存模型可以避免重复训练,从而节省时间和计算资源。
  • 快速部署:一旦模型被训练并保存,它可以迅速部署到生产环境中,加速产品上市时间。
  • 版本控制:保存不同版本的模型有助于跟踪模型的迭代过程,便于比较和回滚到之前的版本。
  • 离线使用:保存的模型可以在没有网络连接的情况下使用,这对于需要在本地设备上运行模型的应用程序非常有用。
  • 模型共享:研究人员和开发者可以共享他们的模型,促进合作和知识传播。
  • 模型评估:保存的模型可以在不同的数据集上进行评估,帮助验证模型的泛化能力和性能。
  • 实验复现:保存模型的状态使得其他研究者可以复现实验结果,增加研究的可验证性。
  • 业务连续性:在系统升级或迁移过程中,保存的模型可以确保业务的连续性,减少停机时间。
  • 法律合规:在某些行业,如医疗和金融,保存模型可能是必须的,以满足法律和合规要求。
  • 模型优化:保存的模型可以用于进一步的优化,如模型压缩、加速等,以适应不同的部署环境。
  • 模型监控:在模型部署后,保存的模型可以用于监控和比较,以检测模型性能随时间的变化。
  • 用户信任:提供透明的模型保存信息可以增加用户对模型决策的信任。
  • 教育和研究:保存的模型可以作为教育材料,帮助学生和研究人员学习模型的工作原理。
  • 灾难恢复:在发生系统故障时,保存的模型可以作为备份,快速恢复服务。
  • 长期维护:随着时间的推移,保存的模型可以用于维护和更新,以适应新的数据和需求。

加载和保存张量

# 保存张量
import torch
from torch import nn
from torch.nn import functional as Fx = torch.arange(4)
torch.save(x, 'x-file')

将存储在文件中的数据读回内存。

x2 = torch.load('x-file')
x2
tensor([0, 1, 2, 3])

存储一个张量列表,然后把它们读回内存。

y = torch.zeros(4)
torch.save([x, y],'x-files')
x2, y2 = torch.load('x-files')
(x2, y2)
(tensor([0, 1, 2, 3]), tensor([0., 0., 0., 0.]))

可以写入或读取从字符串映射到张量的字典。 当我们要读取或写入模型中的所有权重时,这很方便。

mydict = {'x': x, 'y': y}
torch.save(mydict, 'mydict')
mydict2 = torch.load('mydict')
mydict2
{'x': tensor([0, 1, 2, 3]), 'y': tensor([0., 0., 0., 0.])}

加载和保存模型参数

class MLP(nn.Module):def __init__(self):super().__init__()self.hidden = nn.Linear(20, 256)self.output = nn.Linear(256, 10)def forward(self, x):return self.output(F.relu(self.hidden(x)))net = MLP()
X = torch.randn(size=(2, 20))
Y = net(X)

将模型的参数存储在一个叫做“mlp.params”的文件中

torch.save(net.state_dict(), 'mlp.params')

为恢复模型,需实例化原始多层感知机模型的一个备份, 直接读取文件中存储的参数作为初始参数。

clone = MLP()
clone.load_state_dict(torch.load('mlp.params'))
clone.eval()
MLP((hidden): Linear(in_features=20, out_features=256, bias=True)(output): Linear(in_features=256, out_features=10, bias=True)
)

由于两个实例具有相同的模型参数,在输入相同的X时, 两个实例的计算结果应该相同。

Y_clone = clone(X)
Y_clone == Y
tensor([[True, True, True, True, True, True, True, True, True, True],[True, True, True, True, True, True, True, True, True, True]])

保存整个模型

torch.save(net, 'net.pt')
net1 = torch.load('net.pt')
net1.eval()
MLP((hidden): Linear(in_features=20, out_features=256, bias=True)(output): Linear(in_features=256, out_features=10, bias=True)
)

原模型和新加载的模型参数应该是相同的。

net.state_dict()['hidden.weight'].data == net1.state_dict()['hidden.weight'].data
tensor([[True, True, True,  ..., True, True, True],[True, True, True,  ..., True, True, True],[True, True, True,  ..., True, True, True],...,[True, True, True,  ..., True, True, True],[True, True, True,  ..., True, True, True],[True, True, True,  ..., True, True, True]])

封面图片来源

欢迎点击我的主页查看更多文章。
本人学习地址https://zh-v2.d2l.ai/
恳请大佬批评指正。

这篇关于动手学深度学习(pytorch)学习记录21-读写文件(模型与参数)[学习记录]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1120168

相关文章

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程