PyTorch使用------模型的定义和保存方法(带你讯速掌握构建线性回归,保存模型的方法!!!)

news2024/9/27 23:25:59

🐻 PyTorch使用合集:

PyTorch使用------张量的创建和数值计算-CSDN博客

PyTorch使用------张量的类型转换,拼接操作,索引操作,形状操作-CSDN博客

目录

🍔 模型定义方法

💘 使用PyTorch构建线性回归

🍔 模型的保存方法

💘 直接序列化模型对象

💘 存储模型的网络参数

💘 小节


🍔 模型定义方法

学习目标

🍀 掌握PyTorch构建线性回归相关api


💘 使用PyTorch构建线性回归

前面我们使用手动的方式来构建了一个简单的线性回归模型,如果碰到一些较大的网络设计,手动构建过于繁琐。所以,我们需要学会使用 PyTorch 的各个组件来搭建网络。

接下来,我们使用 PyTorch 提供的接口来定义线性回归:

🍭 使用 PyTorch 的 nn.MSELoss() 代替自定义的平方损失函数

🍭 使用 PyTorch 的 data.DataLoader 代替自定义的数据加载器

🍭 使用 PyTorch 的 optim.SGD 代替自定义的优化器

🍭 使用 PyTorch 的 nn.Linear 代替自定义的假设函数

使用 PyTorch 来构建线性回归,直接上代码演示💯 :

import torch
from torch.utils.data import TensorDataset
from torch.utils.data import DataLoader
import torch.nn as nn
import torch.optim as optim
from sklearn.datasets import make_regression
import matplotlib.pyplot as plt


# 构建数据集
def create_dataset():

    x, y, coef = make_regression(n_samples=100,
                                 n_features=1,
                                 noise=10,
                                 coef=True,
                                 bias=14.5,
                                 random_state=0)

    # 将构建数据转换为张量类型
    x = torch.tensor(x)
    y = torch.tensor(y)

    return x, y, coef


def train():

    # 构建数据集
    x, y, coef = create_dataset()
    # 构建数据集对象
    dataset = TensorDataset(x, y)
    # 构建数据加载器
    dataloader = DataLoader(dataset, batch_size=16, shuffle=True)
    # 构建模型
    model = nn.Linear(in_features=1, out_features=1)
    # 构建损失函数
    criterion = nn.MSELoss()
    # 优化方法
    optimizer = optim.SGD(model.parameters(), lr=1e-2)
    # 初始化训练参数
    epochs = 100

    for _ in range(epochs):

        for train_x, train_y in dataloader:

            # 将一个batch的训练数据送入模型
            y_pred = model(train_x.type(torch.float32))
            # 计算损失值
            loss = criterion(y_pred, train_y.reshape(-1, 1).type(torch.float32))
            # 梯度清零
            optimizer.zero_grad()
            # 自动微分(反向传播)
            loss.backward()
            # 更新参数
            optimizer.step()


    # 绘制拟合直线
    plt.scatter(x, y)
    x = torch.linspace(x.min(), x.max(), 1000)
    y1 = torch.tensor([v * model.weight + model.bias for v in x])
    y2 = torch.tensor([v * coef + 14.5 for v in x])

    plt.plot(x, y1, label='训练')
    plt.plot(x, y1, label='真实')
    plt.grid()
    plt.legend()
    plt.show()


if __name__ == '__main__':
    train()

程序运行结果:

从程序运行结果来看,我们绘制一条拟合的直线,和原始数据的直线基本吻合,说明我们训练的还不错。

🍔 模型的保存方法

学习目标

🍀 掌握PyTorch保存模型的方法

神经网络的训练有时需要几天、几周、甚至几个月,为了在每次使用模型时避免高代价的重复训练,我们就需要将模型序列化到磁盘中,使用的时候反序列化到内存中。

PyTorch 提供了两种保存模型的方法:

🐼 直接序列化模型对象

🐼 存储模型的网络参数

💘 直接序列化模型对象

import torch
import torch.nn as nn
import pickle


class Model(nn.Module):

    def __init__(self, input_size, output_size):

        super(Model, self).__init__()
        self.linear1 = nn.Linear(input_size, input_size * 2)
        self.linear2 = nn.Linear(input_size * 2, output_size)

    def forward(self, inputs):

        inputs = self.linear1(inputs)
        output = self.linear2(inputs)
        return output


def test01():

    model = Model(128, 10)

    # 第一个参数: 存储的模型
    # 第二个参数: 存储的路径
    # 第三个参数: 使用的模块
    # 第四个参数: 存储的协议
    torch.save(model, 'model/test_model_save.pth', pickle_module=pickle, pickle_protocol=2)


def test02():

    # 第一个参数: 加载的路径
    # 第二个参数: 模型加载的设备
    # 第三个参数: 加载的模块
    model = torch.load('model/test_model_save.pth', map_location='cpu', pickle_module=pickle)


if __name__ == '__main__':
    test01()
    test02()

Python 的 Pickle 序列化协议有多种,详细可查看官网: Welcome to Python.org

注意: 当我们训练的模型在 GPU 中时,torch.save 函数将其存储到磁盘中。当再次加载该模型时,会将该模型从磁盘先加载到 CPU 中,再移动到指定的 GPU 中,例如: cuda:0、cuda:1。但是,当重新加载的机器不存在 GPU 时,模型加载可能会出错,这时,可通过 map_localtion=’CPU’ 将其加载到 CPU 中。

💘 存储模型的网络参数

import torch
import torch.nn as nn
import torch.optim as optim


class Model(nn.Module):

    def __init__(self, input_size, output_size):

        super(Model, self).__init__()
        self.linear1 = nn.Linear(input_size, input_size * 2)
        self.linear2 = nn.Linear(input_size * 2, output_size)

    def forward(self, inputs):

        inputs = self.linear1(inputs)
        output = self.linear2(inputs)
        return output



def test01():

    model = Model(128, 10)
    optimizer = optim.Adam(model.parameters(), lr=1e-3)

    # 定义存储参数
    save_params = {
        'init_params': {
            'input_size': 128,
            'output_size': 10
        },
        'acc_score': 0.98,
        'avg_loss': 0.86,
        'iter_numbers': 100,
        'optim_params': optimizer.state_dict(),
        'model_params': model.state_dict()
    }

    # 存储模型参数
    torch.save(save_params, 'model/model_params.pth')


def test02():

    # 加载模型参数
    model_params = torch.load('model/model_params.pth')
    # 初始化模型
    model = Model(model_params['init_params']['input_size'], model_params['init_params']['output_size'])
    # 初始化优化器
    optimizer = optim.Adam(model.parameters())
    optimizer.load_state_dict(model_params['optim_params'])
    # 显示其他参数
    print('迭代次数:', model_params['iter_numbers'])
    print('准确率:', model_params['acc_score'])
    print('平均损失:', model_params['avg_loss'])


if __name__ == '__main__':
    test01()
    test02()

在上面代码中,我们把模型的一些初始化参数、模型的权重参数、训练的迭代次数、以及优化器的参数等都进行了存储。

💘 小节

本小节主要学习了如何定义和保存网络模型。我们可以直接存储模型对象,但是该方法依赖于 PyTorch 的实现,而存储模型参数与 PyTorch 的实现关系较弱,建议使用第二种方法来存储模型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2067105.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RISC-V vector(1) --- vector的引入与register说明

Vector相较于SIMD的优势 这两种实现方案,都是为了实现数据级并行性(存在大量的数据可供程序同时计算); SIMD(Single Instruction Multiple Data) SIMD是将数据宽度和操作类型,都放在了指令中&a…

网络初识部分

1.网络 单机时代-局域网时代-广域网时代-移动互联网时代 局域网时代:通过路由器把几个电脑连接起来。 广域网时代:把更多的局域网连接到一起,构成的网络更庞大,可能已经覆盖了一个城市/国家/全世界。 2.什么是路由器&#xff…

关于武汉芯景科技有限公司的多协议收发芯片XJ526(第二篇RS422模式)开发指南(兼容SP526)

一、设置芯片为RS422模式 SP526 包含高度集成的串行收发器。SP526 提供 RS-232 (V.28)、RS-423 (V.10)、RS-422 (V.11) 和 RS-485 的硬件接口模式。接口模式选择通过两个控制引脚D0、D1完成。 我们将D0接…

【简历】25届青岛某一本JAVA简历:中厂不要强调算法,面试官听不懂

注:为保证用户信息安全,姓名和学校等信息已经进行同层次变更,内容部分细节也进行了部分隐藏 简历说明 今天我们要看的是一位来自25届青岛某一本硕士同学的Java简历。 依旧是先判断自己要投什么层次的厂,也就是我们校招第一法则…

Netty04-优化与源码

四. 优化与源码 1. 优化 1.1 扩展序列化算法 序列化,反序列化主要用在消息正文的转换上 序列化时,需要将 Java 对象变为要传输的数据(可以是 byte[],或 json 等,最终都需要变成 byte[])反序列化时&…

SQL进阶技巧:如何按任意时段分析时间区间问题? | 区间重叠问题应用

目录 0 场景描述 1 数据准备 2 问题分析 方法1:分情况讨论,找出重叠区间 方法2:暴力美学法。按区间展开成日期明细表 3 小结 0 场景描述 现有用户还款计划表 user_repayment ,该表内的一条数据,表示用户在指定日期区间内 [date_start, date_end] ,每天还款 repay…

成为顶尖1%前端开发者的10项必备技能

从你可能已经熟悉的前端基础开始;然后进入关键技能,如使用浏览器开发工具和利用AI快速编码。包括99%的开发者忽视的宝贵通用技能。 从你可能已经熟悉的前端基础开始;然后进入关键技能,如使用浏览器开发工具和利用AI快速编码。 包…

【youcans论文精读】KAN 2.0:面向科学的KAN网络

欢迎关注『youcans论文精读』系列 本专栏内容和资源同步到 GitHub/youcans 【youcans论文精读】KAN 2.0:面向科学的KAN网络 1. KAN2.0 简介1.1 KAN 2.0 论文发布1.2 KAN2.0 的新特点:1.3 KAN 回顾 2. MultiKAN:用乘法增强 KAN 网络的表达能力…

足底筋膜炎专用药

足底筋膜炎专用药“古顺*敷堂筋膜*贴”通过其独特的药效和用法,能够针对足底筋膜炎进行有效治疗,缓解患者疼痛和不适感,促进炎症消退和肌肉恢复。长时间站立、行走或进行高强度的跑步、跳跃等活动,会使足底筋膜受到持续的牵拉和压…

MEMS 传感器 4GDTU 说明书

本系统经过精心设计,可无缝对接三石峰的振动管理系统平台。通过该平台,用户可直观查看传感器数据、分析振动趋势、预警潜在故障,并依据分析结果制定针对性的维护策略,从而有效提升设备运行的可靠性与安全性。 本产品广泛应用于工…

日常开发规范

日常开发规范 一.git提交规范 开发代码之前,需有管理员通过系统新建功能分支,如feature/one, 此时开发人员方可拉取feature/one到本地进行开发, 开发人员在本地环境测试稳定后,方可由管理员通过系统发布到开发环境…

宠物空气净化器不是智商税!希喂、352宠物空气净化器真实测评

前端时间我出差了,把小猫寄养在朋友家里,回来后去接它们,结果到朋友家差点没认出来...碰上换毛季猫咪疯狂脱毛,朋友没有及时清理,就全堆在身上了,简直是胖若两猫。到家后,我连忙用梳子把它身上的…

Wi-Fi发射功率简介

目录 一、概念 1.1 射频发射与组合功率 1.2 天线增益 1.3 信道影响 二、常用单位及转换 2.1 dB 与 dBm 2.2 dBi 与 dBd 三、发射功率 3.1 发射功率调节 3.1.1 TPC 3.2 国家码与信道功率 一、概念 ① 和 ⑦ 表示射频发送端处的功率,单位是 dBm。其中 ① 表示AP端的…

《通义千问AI落地—下》:WebSocket详解

一、前言 文本源自 微博客 且已获授权,请尊重版权。 《通义千问AI落地——下篇》如约而至。Websocket在这一类引用中,起到前后端通信的作用。因此,本文将介绍websocket在这类应用场景下的配置、使用、注意事项以及ws连接升级为wss连接等;如下图,本站已经使用了wss连接…

ssrf,csrf漏洞复现

印象深刻的csrf利用: 在phpwind下:漏洞点(但是都是在后台的漏洞) 代码追: task到unserialize,然后重写PwDelayRun的构造函数,给callback和args赋值,然后当程序执行结束&#xff0c…

请问lammps怎么做两种金属连接的原子浓度分布图??

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

未知单播泛洪原因

未知单播:交换机是收到数据包后,读取数据包的目的MAC,并查找自已的MAC表,查找目的MAC对应的端口,从而判断从哪个口端口转发出此数据包,若MAC表里没有此目的MAC,那对于此交换机来说就是未知单播&…

Day46 | 101孤岛的总面积 102沉没孤岛 103水流问题 104建造最大岛屿

语言 Java 101.孤岛的总面积 101. 孤岛的总面积 题目 题目描述 给定一个由 1(陆地)和 0(水)组成的矩阵,岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域,且完全被水域单元格包围。孤岛是那些…

植物大战僵尸杂交版v2.3.7最新版本(附下载链接)

新版本更新啦! B站游戏作者潜艇伟伟迷于8月19日更新了植物大战僵尸杂交版2.3.7版本!!! v2.3.7版本更新内容: 游戏分辨率扩充,UI界面翻新,卡槽数量提升至16个,修复大量BUG&#xff0c…

网络协议与IO模型

1、说一说网络模型(OSI、TCP/IP模型) OSI采用了分层的结构化技术,共分七层, 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 。 Open System Interconnect 简称OSI,是国际标准化组织(ISO)和国际电报电…