基于Pytorch 框架手动完成线性回归

简介: 基于Pytorch 框架手动完成线性回归

Pytorch完成线性回归


hello,各位朋友好久不见,最近在忙着期末考试,现在结束之后继续更新咱们的Pytorch框架学习笔记


目标


  1. 知道requires_grad的作用
  2. 知道如何使用backward
  3. 知道如何手动完成线性回归


1. 向前计算


对于pytorch中的一个tensor,如果设置它的属性 .requires_grad为True,那么它将会追踪对于该张量的所有操作。或者可以理解为,这个tensor是一个参数,后续会被计算梯度,更新该参数。


1.1 计算过程


假设有以下条件(1/4表示求均值,xi中有4个数),使用torch完成其向前计算的过程

KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ &o = \frac{1}{…

如果x为参数,需要对其进行梯度的计算和更新


那么,在最开始随机设置x的值的过程中,需要设置他的requires_grad属性为True,其默认值为False

import torch
x = torch.ones(2, 2, requires_grad=True)  #初始化参数x并设置requires_grad=True用来追踪其计算历史
print(x)
#tensor([[1., 1.],
#        [1., 1.]], requires_grad=True)
y = x+2
print(y)
#tensor([[3., 3.],
#        [3., 3.]], grad_fn=<AddBackward0>)
z = y*y*3  #平方x3
print(x)
#tensor([[27., 27.],
#        [27., 27.]], grad_fn=<MulBackward0>) 
out = z.mean() #求均值
print(out)
#tensor(27., grad_fn=<MeanBackward0>)


从上述代码可以看出:

  1. x的requires_grad属性为True
  2. 之后的每次计算都会修改其grad_fn属性,用来记录做过的操作
  1. 通过这个函数和grad_fn能够组成一个和前一小节类似的计算图


1.2 requires_grad和grad_fn


a = torch.randn(2, 2)
a = ((a * 3) / (a - 1))
print(a.requires_grad)  #False
a.requires_grad_(True)  #就地修改
print(a.requires_grad)  #True
b = (a * a).sum()
print(b.grad_fn) # <SumBackward0 object at 0x4e2b14345d21>
with torch.no_gard():
    c = (a * a).sum()  #tensor(151.6830),此时c没有gard_fn
print(c.requires_grad) #False


注意:


为了防止跟踪历史记录(和使用内存),可以将代码块包装在with torch.no_grad():中。在评估模型时特别有用,因为模型可能具有requires_grad = True的可训练的参数,但是我们不需要在此过程中对他们进行梯度计算。


2. 梯度计算


image.png

得到

tensor([[4.5000, 4.5000],
        [4.5000, 4.5000]])


因为:

image.png

在xi 等于1时其值为4.5


注意:在输出为一个标量的情况下,我们可以调用输出tensor的backword() 方法,但是在数据是一个向量的时候,调用backward()的时候还需要传入其他参数。


很多时候我们的损失函数都是一个标量,所以这里就不再介绍损失为向量的情况。


loss.backward()就是根据损失函数,对参数(requires_grad=True)的去计算他的梯度,并且把它累加保存到x.gard,此时还并未更新其梯度


注意点:


tensor.data:


在tensor的require_grad=False,tensor.data和tensor等价

require_grad=True时,tensor.data仅仅是获取tensor中的数据


tensor.numpy():


require_grad=True不能够直接转换,需要使用tensor.detach().numpy()


3. 线性回归实现


下面,我们使用一个自定义的数据,来使用torch实现一个简单的线性回归


假设我们的基础模型就是y = wx+b,其中w和b均为参数,我们使用y = 3x+0.8来构造数据x、y,所以最后通过模型应该能够得出w和b应该分别接近3和0.8


  1. 准备数据
  2. 计算预测值
  3. 计算损失,把参数的梯度置为0,进行反向传播
  4. 更新参数


import torch
import numpy as np
from matplotlib import pyplot as plt
#1. 准备数据 y = 3x+0.8,准备参数
x = torch.rand([50])
y = 3*x + 0.8
w = torch.rand(1,requires_grad=True)
b = torch.rand(1,requires_grad=True)
def loss_fn(y,y_predict):
    loss = (y_predict-y).pow(2).mean()
    for i in [w,b]:
    #每次反向传播前把梯度置为0
        if i.grad is not None:
            i.grad.data.zero_()
    # [i.grad.data.zero_() for i in [w,b] if i.grad is not None]
    loss.backward()
    return loss.data
def optimize(learning_rate):
    # print(w.grad.data,w.data,b.data)
    w.data -= learning_rate* w.grad.data
    b.data -= learning_rate* b.grad.data
for i in range(3000):
    #2. 计算预测值
    y_predict = x*w + b
    #3.计算损失,把参数的梯度置为0,进行反向传播 
    loss = loss_fn(y,y_predict)
    if i%500 == 0:
        print(i,loss)
    #4. 更新参数w和b
    optimize(0.01)
# 绘制图形,观察训练结束的预测值和真实值
predict =  x*w + b  #使用训练后的w和b计算预测值
plt.scatter(x.data.numpy(), y.data.numpy(),c = "r")
plt.plot(x.data.numpy(), predict.data.numpy())
plt.show()
print("w",w)
print("b",b)

图形效果如下:


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EPoO4Eha-1656763156468)(…/images/1.2/线性回归1.png)]


打印w和b,可有

w tensor([2.9280], requires_grad=True)
b tensor([0.8372], requires_grad=True)


可知,w和b已经非常接近原来的预设的3和0.8

图形效果如下:
[外链图片转存中...(img-EPoO4Eha-1656763156468)]
打印w和b,可有
```python
w tensor([2.9280], requires_grad=True)
b tensor([0.8372], requires_grad=True)


可知,w和b已经非常接近原来的预设的3和0.8


目录
相关文章
|
8月前
|
存储 人工智能 PyTorch
基于PyTorch/XLA的高效分布式训练框架
基于PyTorch/XLA的高效分布式训练框架
337 2
|
30天前
|
人工智能 安全 PyTorch
SPDL:Meta AI 推出的开源高性能AI模型数据加载解决方案,兼容主流 AI 框架 PyTorch
SPDL是Meta AI推出的开源高性能AI模型数据加载解决方案,基于多线程技术和异步事件循环,提供高吞吐量、低资源占用的数据加载功能,支持分布式系统和主流AI框架PyTorch。
57 10
SPDL:Meta AI 推出的开源高性能AI模型数据加载解决方案,兼容主流 AI 框架 PyTorch
|
2月前
|
机器学习/深度学习 监控 PyTorch
深度学习工程实践:PyTorch Lightning与Ignite框架的技术特性对比分析
在深度学习框架的选择上,PyTorch Lightning和Ignite代表了两种不同的技术路线。本文将从技术实现的角度,深入分析这两个框架在实际应用中的差异,为开发者提供客观的技术参考。
55 7
|
7月前
|
机器学习/深度学习 人工智能 PyTorch
|
5月前
|
机器学习/深度学习 人工智能 PyTorch
AI智能体研发之路-模型篇(五):pytorch vs tensorflow框架DNN网络结构源码级对比
AI智能体研发之路-模型篇(五):pytorch vs tensorflow框架DNN网络结构源码级对比
92 1
|
5月前
|
UED 开发者
哇塞!Uno Platform 数据绑定超全技巧大揭秘!从基础绑定到高级转换,优化性能让你的开发如虎添翼
【8月更文挑战第31天】在开发过程中,数据绑定是连接数据模型与用户界面的关键环节,可实现数据自动更新。Uno Platform 提供了简洁高效的数据绑定方式,使属性变化时 UI 自动同步更新。通过示例展示了基本绑定方法及使用 `Converter` 转换数据的高级技巧,如将年龄转换为格式化字符串。此外,还可利用 `BindingMode.OneTime` 提升性能。掌握这些技巧能显著提高开发效率并优化用户体验。
72 0
|
5月前
|
机器学习/深度学习 PyTorch TensorFlow
深度学习框架之争:全面解析TensorFlow与PyTorch在功能、易用性和适用场景上的比较,帮助你选择最适合项目的框架
【8月更文挑战第31天】在深度学习领域,选择合适的框架至关重要。本文通过开发图像识别系统的案例,对比了TensorFlow和PyTorch两大主流框架。TensorFlow由Google开发,功能强大,支持多种设备,适合大型项目和工业部署;PyTorch则由Facebook推出,强调灵活性和速度,尤其适用于研究和快速原型开发。通过具体示例代码展示各自特点,并分析其适用场景,帮助读者根据项目需求和个人偏好做出明智选择。
138 0
|
7月前
|
机器学习/深度学习 算法 PyTorch
Pytorch实现线性回归模型
在机器学习和深度学习领域,线性回归是一种基本且广泛应用的算法,它简单易懂但功能强大,常作为更复杂模型的基础。使用PyTorch实现线性回归,不仅帮助初学者理解模型概念,还为探索高级模型奠定了基础。代码示例中,`creat_data()` 函数生成线性回归数据,包括噪声,`linear_regression()` 定义了线性模型,`square_loss()` 计算损失,而 `sgd()` 实现了梯度下降优化。
|
6月前
|
机器学习/深度学习 PyTorch 算法框架/工具
C++多态崩溃问题之在PyTorch中,如何定义一个简单的线性回归模型
C++多态崩溃问题之在PyTorch中,如何定义一个简单的线性回归模型
|
7月前
|
PyTorch 算法框架/工具
5、使用PyTorch 实现线性回归
5、使用PyTorch 实现线性回归
566 0