【Pytorch】学习记录分享3——PyTorch 自动微分与线性回归

news2024/11/15 17:17:41

【【Pytorch】学习记录分享3——PyTorch 自动微分与线性回归

      • 1. autograd 包,自动微分
      • 2. 线性模型回归演示
      • 3. GPU进行模型训练

小结:只需要将前向传播设置好,调用反向传播接口,即可实现反向传播的链式求导

1. autograd 包,自动微分

自动微分是机器学习工具包必备的工具,它可以自动计算整个计算图的微分。

PyTorch内建了一个叫做torch.autograd的自动微分引擎,该引擎支持的数据类型为:浮点数Tensor类型 ( half, float, double and bfloat16) 和复数Tensor 类型(cfloat, cdouble)

PyTorch中与自动微分相关的常用的Tensor属性和函数:

属性requires_grad:
默认值为False,表明该Tensor不会被自动微分引擎计算微分。设置为True,表明让自动微分引擎计算该Tensor的微分
属性grad:存储自动微分的计算结果,即调用backward()方法后的计算结果
方法backward(): 计算微分,一般不带参数,等效于:backward(torch.tensor(1.0))。若backward()方法在DAG的root上调用,它会依据链式法则自动计算DAG所有枝叶上的微分。
方法no_grad():禁用自动微分上下文管理, 一般用于模型评估或推理计算这些不需要执行自动微分计算的地方,以减少内存和算力的消耗。另外禁止在模型参数上自动计算微分,即不允许更新该参数,即所谓的冻结参数(frozen parameters)。
zero_grad()方法:PyTorch的微分是自动积累的,需要用zero_grad()方法手动清零

# 模型:z = x@w + b;激活函数:Softmax
x = torch.ones(5)  # 输入张量,shape=(5,)
labels = torch.zeros(3) # 标签值,shape=(3,)
w = torch.randn(5,3,requires_grad=True) # 模型参数,需要计算微分, shape=(5,3)
b = torch.randn(3, requires_grad=True)  # 模型参数,需要计算微分, shape=(3,)
z = x@w + b # 模型前向计算
outputs = torch.nn.functional.softmax(z) # 激活函数
print("z: ",z)
print("outputs: ",outputs)
loss = torch.nn.functional.binary_cross_entropy(outputs, labels)
# 查看loss函数的微分计算函数
print('Gradient function for loss =', loss.grad_fn)
# 调用loss函数的backward()方法计算模型参数的微分
loss.backward()
# 查看模型参数的微分值
print("w: ",w.grad)
print("b.grad: ",b.grad)

在这里插入图片描述

小姐:

方法描述
.requires_grad 设置为True会开始跟踪针对 tensor 的所有操作
.backward()张量的梯度将累积到 .grad 属性
import torch

x=torch.rand(1)
b=torch.rand(1,requires_grad=True)
w=torch.rand(1,requires_grad=True)
y = w * x
z = y + b

x.requires_grad, w.requires_grad,b.requires_grad,y.requires_grad,z.requires_grad

print("x: ",x, end="\n"),print("b: ",b ,end="\n"),print("w: ",w ,end="\n")
print("y: ",y, end="\n"),print("z: ",z, end="\n")

# 反向传播计算
z.backward(retain_graph=True) #注意:如果不清空,b每一次更新,都会自我累加起来,依次为1 2 3 4 。。。

w.grad
b.grad

运行结果:
在这里插入图片描述
反向传播求导原理:
在这里插入图片描述

2. 线性模型回归演示

import torch
import torch.nn as nn

## 线性回归模型: 本质上就是一个不加 激活函数的 全连接层
class LinearRegressionModel(nn.Module):
    def __init__(self, input_size, output_size):
        super(LinearRegressionModel, self).__init__()
        self.linear = nn.Linear(input_size, output_size)
        
    def forward(self, x):
        out = self.linear(x)
        return out
input_size = 1
output_size = 1

model = LinearRegressionModel(input_size, output_size)
model

# 指定号参数和损失函数
epochs = 500
learning_rate = 0.01
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
criterion = nn.MSELoss()

# train model
for epoch in range(epochs):
    epochs+=1
    #注意 将numpy格式的输入数据转换成 tensor
    inputs = torch.from_numpy(x_train)
    labels = torch.from_numpy(y_train)
    
    #每次迭代梯度清零
    optimizer.zero_grad()
    
    #前向传播
    outputs = model(inputs)
    
    #计算损失
    loss = criterion(outputs, labels)
    
    #反向传播
    loss.backward()
    
    #updates weight and parameters
    optimizer.step()
    if epoch % 50 == 0:
        print("Epoch: {}, Loss: {}".format(epoch, loss.item()))

# predict model test,预测结果并且奖结果转换成np格式
predicted =model(torch.from_numpy(x_train).requires_grad_()).data.numpy()
predicted

#model save
torch.save(model.state_dict(),'model.pkl')

#model 读取
model.load_state_dict(torch.load('model.pkl'))

在这里插入图片描述

3. GPU进行模型训练

只需要 将模型和数据传入到“cuda”中运行即可,详细实现见截图

import torch
import torch.nn as nn
import numpy as np

# #构建一个回归方程 y = 2*x+1

#构建输如数据,将输入numpy格式转成tensor格式
x_values = [i for i in range(11)]
x_train = np.array(x_values,dtype=np.float32)
x_train = x_train.reshape(-1,1)

y_values = [2*i + 1 for i in x_values]
y_train = np.array(y_values, dtype=np.float32)
y_train = y_train.reshape(-1,1)

## 线性回归模型: 本质上就是一个不加 激活函数的 全连接层
class LinearRegressionModel(nn.Module):
    def __init__(self, input_size, output_size):
        super(LinearRegressionModel, self).__init__()
        self.linear = nn.Linear(input_size, output_size)
        
    def forward(self, x):
        out = self.linear(x)
        return out
    
input_size = 1
output_size = 1

model = LinearRegressionModel(input_size, output_size)

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)

# 指定号参数和损失函数
epochs = 500
learning_rate = 0.01
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
criterion = nn.MSELoss()

# train model
for epoch in range(epochs):
    epochs+=1
    #注意 将numpy格式的输入数据转换成 tensor
    inputs = torch.from_numpy(x_train)
    labels = torch.from_numpy(y_train)
    
    #每次迭代梯度清零
    optimizer.zero_grad()
    
    #前向传播
    outputs = model(inputs)
    
    #计算损失
    loss = criterion(outputs, labels)
    
    #反向传播
    loss.backward()
    
    #updates weight and parameters
    optimizer.step()
    if epoch % 50 == 0:
        print("Epoch: {}, Loss: {}".format(epoch, loss.item()))

# predict model test,预测结果并且奖结果转换成np格式
predicted = model(torch.from_numpy(x_train).requires_grad_()).data.numpy()
predicted

#model save
torch.save(model.state_dict(),'model.pkl')

在这里插入图片描述

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

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

相关文章

c语言快速排序(霍尔法、挖坑法、双指针法)图文详解

快速排序介绍: 快速排序是一种非常常用的排序方法,它在1962由C. A. R. Hoare(霍尔)提的一种二叉树结构的交换排序方法,故因此它又被称为霍尔划分,它基于分治的思想,所以整体思路是递归进行的。 …

vscode 同步插件

vscode 扩展商店链接 https://marketplace.visualstudio.com/vscode settings sync 插件

DHCP—动态主机配置协议

动态主机配置协议DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是RFC 1541(已被RFC 2131取代)定义的标准协议,该协议允许服务器向客户端动态分配IP地址和配置信息。 DHCP协议支持C/S&#x…

如何在Ubuntu的Linux系统上搭建nacos集群

官方给出的集群部署架构图 集群部署说明 (nacos.io)3个或3个以上nacos节点才能构成集群当前示例中包含3个nacos节点,同时一个负载均衡器代理3个nacos,本示例中负载均衡器可使用的是nginx 准备并安装好正常运行的nginx,本示例略准备并安装好正…

自己动手写数据库: select 查询语句对应查询树的构造和执行

首先我们需要给原来代码打个补丁,在SelectScan 结构体初始化时需要传入 UpdateScan 接口对象,但很多时候我们需要传入的是 Scan 对象,因此我们需要做一个转换,也就是当初始化 SelectScan 时,如果传入的是 Scan 对象&am…

浅谈故障注入的主要功能是什么?

随着现代软件系统的复杂性不断增加,保障系统的可靠性变得愈发重要。在这一背景下,故障注入技术崭露头角,成为优化系统稳定性和鲁棒性的关键手段。本文将探讨故障注入的主要功能以及在提高系统可靠性方面的作用。 1. 故障模拟与验证 故障注入技…

项目管理系统在律师案件管理中的应用与策略

法律案件管理软件可以帮助律师事务所自动化其日常工作流程,例如查看任务、跟踪计费时间和日历。这有助于公司提高效率并最大化收入,从而发展业务。 使用Zoho Projects项目管理系统进行律师案件管理可以帮助您更好地组织和跟踪案件进程、提高团队协作效率…

【论文精读ICCV_2023】BlendFace: Re-designing Identity Encoders for Face-Swapping

【论文精读ICCV_2023】BlendFace: Re-designing Identity Encoders for Face-Swapping 一、前言Abstract1. Introduction2. Related Work3. Attribute Bias in Face Recognition Models3.1. Identity Distance Loss3.2. Analysis of Identity Similarity 4. BlendFace4.1. Pre-…

中低压MOS 适用于电子烟等产品—— 较小的开关损耗 过流能力好

工作原理: 当用户在吸嘴处抽吸时,气流经过进气孔,穿 过电路板上方的咪头,咪头即产生电信号,驱 动芯片板,让电池供电给雾化芯,雾化芯中的 发热丝将电能转化成热能,当温度达到雾化液…

Zibll子比主题最新学习版

Zibll子比主题5.7.1是一款为WordPress平台设计的优秀主题。它具有独特而富有吸引力的设计风格,同时提供了丰富的功能和卓越的性能,使您的网站在众多网站中脱颖而出。以下是对Zibll子比主题5.7.1的详细介绍。 (这是我在“布谷鸟网址导航”上看…

C++ - 哈希

在顺序结构以及平衡树中,由于元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较;比如顺序表中需要从表头开始依次往后比对寻找,查找时间复杂度为 O(N),平衡树中需…

通俗理解什么是 LSTM 神经网络

大家好啊,我是董董灿。 刚开始做程序开发时,在公司提交代码前,都需要让大佬们 review(评审),大佬们看完,总会在评论区打出一串"LGTM"。 当时作为小白的我,天真地以为大佬觉得我提交的代码还不错…

浮动的魅力与挑战:如何在前端设计中巧妙运用浮动(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

【UE5.1 MetaHuman】使用mixamo_converter把Mixamo的动画重定向给MetaHuman使用

目录 前言 效果 步骤 一、下载mixamo_converter软件 二、Mixamo动画重定向 三、导入UE 四、动画重定向 五、使用重定向后的动画 前言 上一篇(【UE5】初识MetaHuman 创建虚拟角色)中我们已经制作了一个MetaHuman,本篇博文将介绍如何…

Unity 关于Rigidbody刚体组件的理解

一、基本了解 刚体Rigidbody因具体物理相关的属性,使得实际应用中更有真实感。应用也多: Rigidbody它可以受到重力、碰撞或者力的作用,所以我们可以用它模拟物体的真实物理行为,如受到重力的作用、与其他刚体对象进行碰撞&#…

【infiniband】ibdump抓包

ibdump用于捕获和转储InfiniBand网络的流量。 这种工具通常用于调试和分析InfiniBand网络问题,包括性能瓶颈和配置错误。ibdump工具在Mellanox InfiniBand环境中较为常用,现由NVIDIA提供支持。 使用ibdump的基本步骤 请注意,您需要在安装了…

11.关注、取消关注 + 关注列表、粉丝列表

目录 1.关注、取消关注 1.1 把数据存到 Redis 中,构造 key 1.2 开发业务层 1.3 开发表现层 1.4 显示正确的关注数据 2.关注列表、粉丝列表 2.1 业务层 2.2 表现层 1.关注、取消关注 需求:开发关注、取消关注功能;统计用户的关注数…

飞天使-docker知识点5-资源限制与容器的不同状态

文章目录 cpu和内存的限制内存限制的部分参数容器的不同状态docker images 的分层docker registry制作镜像 cpu和内存的限制 默认情况下,容器没有资源限制,可以使用主机内核调度程序允许的尽可能多的 给定资源,Docker 提供了控制容器可以限制…

wordpress 修改社交图标

要去掉标记的图标,死活找不到在那里配置。后来找到了,下图(wordpress 小白,特此记录)

【开源软件】最好的开源软件-2023-第17名 Gravite

自我介绍 做一个简单介绍,酒架年近48 ,有20多年IT工作经历,目前在一家500强做企业架构.因为工作需要,另外也因为兴趣涉猎比较广,为了自己学习建立了三个博客,分别是【全球IT瞭望】,【…