tnblog
首页
视频
资源
登录

Pytorch 自动求导与简单的线性回归

4782人阅读 2023/12/14 16:40 总访问:3658250 评论:0 收藏:0 手机
分类: python

Pytorch 自动求导与简单的线性回归

环境安装


安装pytorch

  1. %pip install torch torchvision torchaudio

自动计算反向传播


导入相关包

  1. import torch
  2. import numpy as np


需要求导的可以通过requires_grad=True开启自动求导。

  1. x = torch.randn(3, 4, requires_grad=True)
  2. x

tensor([[-2.5528, 0.9500, 1.5432, 1.5304],
[ 0.4176, -0.5373, -0.5960, 0.4130],
[-0.7990, 0.5251, 0.0113, -0.4812]], requires_grad=True)

  1. # 或者
  2. x = torch.randn(3,4)
  3. x.requires_grad = True
  4. x


再举例一个简单的例子

  1. b = torch.randn(3, 4,requires_grad=True)
  2. # 第一个式子
  3. t = x + b
  4. # 第二个式子 t的一个求和
  5. y = t.sum()
  6. y

tensor(-2.3695, grad_fn=)

  1. # 进行反向传播
  2. y.backward()
  1. # 查看b的梯度
  2. b.grad

tensor([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])


虽然没有指定t的requires_grad但是需要用到它,也会默认开启。

  1. x.requires_grad,b.requires_grad,t.requires_grad

(True, True, True)

举个完整的例子


这幅图展示了一个简单的神经网络前向和反向传播的过程。
在前向传播部分(左侧):
有两个输入节点,分别是 WX,它们通过一个乘法操作(MUL)相乘得到 y
y 之后和另一个节点 b 进行加法操作(Add),得到最终的输出 z
在反向传播部分(右侧):
反向传播用于计算损失函数(在这个例子中,假设 z 就是损失函数)相对于每个参数的梯度。
z 开始,假设对 z 进行求导,其导数 \frac{dz}{dz} 自然是 1。
接下来计算 zb 的导数 \frac{dz}{db},因为 z = y + b,并且 y 是独立于 b 的,所以 \frac{dz}{db} = 1
然后计算 yW 的导数 \frac{dy}{dW}yX 的导数 \frac{dy}{dX},由于 y = W \times X,所以 \frac{dy}{dW} = X\frac{dy}{dX} = W
使用链式法则,计算 zW 的导数 \frac{dz}{dW} = \frac{dz}{dy} \cdot \frac{dy}{dW} = 1 \times W = W,同理 \frac{dz}{dX} = \frac{dz}{dy} \cdot \frac{dy}{dX} = 1 \times X = X

在这个过程中,我们看到乘法操作(mulBackward)和加法操作(addBackward)的反向传播规则。每个节点上的导数值告诉我们,如果我们调整这个节点的值,输出 z 会如何改变。这些导数值在机器学习中被用来通过梯度下降算法更新参数 Wb,以最小化损失函数 z

  1. # 计算流程
  2. x = torch.rand(1)
  3. w = torch.rand(1, requires_grad=True)
  4. b = torch.rand(1, requires_grad=True)
  5. # 前向传播
  6. y = x * w
  7. z = y + b
  1. x.requires_grad,w.requires_grad,b.requires_grad,y.requires_grad,z.requires_grad # 注意y也会进行自动求导

(False, True, True, True, True)

  1. # 判断是否是叶子,叶子节点
  2. x.is_leaf,w.is_leaf,b.is_leaf,y.is_leaf,z.is_leaf

(True, True, True, False, False)


反向传播计算

  1. z.backward(retain_graph=True) # retain_graph=True表示在反向传播后不要清理图,进行累计梯度
  2. w.grad

tensor([0.2982])

  1. b.grad

tensor([2.])

线性回归


线性回归是一种预测分析技术,用于研究两个连续变量之间的关系。它尝试通过最佳拟合直线来建模这种关系,这条直线是通过最小化实际数据点和预测数据点之间距离的平方和来确定的。这个过程被称为最小二乘法。线性回归可以是简单的(只有一个自变量)或多元的(多个自变量)。
构造一组输入数据x和其对应的标签y

  1. # 创建一个包含0到10的整数列表
  2. x_values = [i for i in range(11)]
  3. # 将列表转换为numpy数组,并指定元素类型为32位浮点数
  4. x_train = np.array(x_values, dtype=np.float32)
  5. # 重新塑形数组为二维,其中每个原始元素都变成一行,形状变为(11, 1)
  6. x_train = x_train.reshape(-1, 1)
  7. # 打印出当前数组的形状,预期输出为(11, 1),表示11行1列
  8. x_train.shape,x_train

((11, 1),
array([[ 0.],
[ 1.],
[ 2.],
[ 3.],
[ 4.],
[ 5.],
[ 6.],
[ 7.],
[ 8.],
[ 9.],
[10.]], dtype=float32))

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


导入相关包

  1. import torch
  2. import torch.nn as nn
  3. import numpy as np

线性回归模型


其实线性回归就是一个不加激活函数的全连接层。

  1. class LinearRegressionModel(nn.Module):
  2. def __init__(self, input_dim, output_dim):
  3. super(LinearRegressionModel, self).__init__()
  4. # 定义一个全连接层,指定使用到了哪些层
  5. self.linear = nn.Linear(input_dim, output_dim)
  6. # 前向传播
  7. def forward(self, x):
  8. out = self.linear(x)
  9. return out
  1. # 一个输入层
  2. input_dim = 1
  3. # 一个输出层
  4. output_dim = 1
  5. model = LinearRegressionModel(input_dim, output_dim)
  1. model

LinearRegressionModel(
(linear): Linear(in_features=1, out_features=1, bias=True)
)


指定好参数和损失函数

  1. # 设置训练次数
  2. epochs = 1000
  3. # 设置学习率
  4. learning_rate = 0.01
  5. # 设置优化器
  6. optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
  7. # 设置损失函数
  8. criterion = nn.MSELoss()


训练模型

  1. for epoch in range(epochs):
  2. epoch += 1
  3. # 注意转行成tensor
  4. inputs = torch.from_numpy(x_train)
  5. labels = torch.from_numpy(y_train)
  6. # 梯度要清零每一次迭代
  7. optimizer.zero_grad()
  8. # 前向传播
  9. outputs = model(inputs)
  10. # 计算损失
  11. loss = criterion(outputs, labels)
  12. # 反向传播
  13. loss.backward()
  14. # 更新参数权重
  15. optimizer.step()
  16. if epoch % 50 == 0:
  17. print('epoch {}, loss {}'.format(epoch, loss.item()))

epoch 50, loss 0.003172945464029908
epoch 100, loss 0.0018097275169566274
epoch 150, loss 0.0010321944719180465
epoch 200, loss 0.0005887215374968946
epoch 250, loss 0.00033578279544599354
epoch 300, loss 0.00019151577726006508
epoch 350, loss 0.00010923000081675127
epoch 400, loss 6.230236613191664e-05
epoch 450, loss 3.553432543412782e-05
epoch 500, loss 2.0268678781576455e-05
epoch 550, loss 1.1559625818335917e-05
epoch 600, loss 6.59192346574855e-06
epoch 650, loss 3.760904519367614e-06
epoch 700, loss 2.14508622775611e-06
epoch 750, loss 1.223156232299516e-06
epoch 800, loss 6.977222710702335e-07
epoch 850, loss 3.9789389916222717e-07
epoch 900, loss 2.2687767398110736e-07
epoch 950, loss 1.2930000536925945e-07
epoch 1000, loss 7.381613187362746e-08


测试模型预测结果

  1. predicted = model(torch.from_numpy(x_train)).detach().numpy()
  2. predicted

array([[ 1.0005051],
[ 3.0004325],
[ 5.0003595],
[ 7.0002866],
[ 9.000215 ],
[11.000142 ],
[13.000069 ],
[14.999996 ],
[16.999924 ],
[18.999851 ],
[20.999779 ]], dtype=float32)


模型的保存与读取

  1. # 保存
  2. torch.save(model.state_dict(), 'model.pkl')
  1. # 读取
  2. model.load_state_dict(torch.load('model.pkl'))

<All keys matched successfully>


使用gpu进行训练

  1. import torch
  2. import torch.nn as nn
  3. import numpy as np
  4. class LinearRegressionModel(nn.Module):
  5. def __init__(self, input_dim, output_dim):
  6. super(LinearRegressionModel, self).__init__()
  7. self.linear = nn.Linear(input_dim, output_dim)
  8. def forward(self, x):
  9. out = self.linear(x)
  10. return out
  11. input_dim = 1
  12. output_dim = 1
  13. model = LinearRegressionModel(input_dim, output_dim)
  14. # 判断是否有gpu如果有就带入
  15. device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
  16. model.to(device)
  17. epochs = 1000
  18. learning_rate = 0.01
  19. optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
  20. criterion = nn.MSELoss()
  21. for epoch in range(epochs):
  22. epoch += 1
  23. # 使用gpu设备进行带入
  24. inputs = torch.from_numpy(x_train).to(device)
  25. labels = torch.from_numpy(y_train).to(device)
  26. optimizer.zero_grad()
  27. outputs = model(inputs)
  28. loss = criterion(outputs, labels)
  29. loss.backward()
  30. optimizer.step()
  31. if epoch % 50 == 0:
  32. print('epoch {}, loss {}'.format(epoch, loss.item()))

欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

Pytorch 初探

Pytorch 初探[TOC] Pytorch简介PyTorch由 Facebook 的 AI 研究团队开发的一个开源的机器学习库,它提供了张量(tensor)计...

Pytorch Tensor 常见的形式

Pytorch Tensor 常见的形式[TOC] 值 描述 scalar 0维张量 vector 1维张量 matrix 2维张量 ...

Pytorch 气温预测

Pytorch 气温预测[TOC] 准备数据集下载temps.csv数据集。# 下载包 !wget https://raw.githubusercontent.com/AiDaShi/lea...

Pytorch Mnist分类任务

Pytorch Mnist分类任务[TOC] Mnist分类任务了解目标——网络基本构建与训练方法,常用函数解析——torch.nn.functional...

Pytorch 卷积神经网络效果

Pytorch 卷积神经网络效果[TOC] 数据与在线实践数据链接: https://pan.baidu.com/s/1VkrHDZGukkF900zLncMn5g 密码: 3lom...

Pytorch 基于经典网络架构训练图像分类模型

Pytorch 基于经典网络架构训练图像分类模型[TOC] 数据预处理部分:数据增强:torchvision中transforms模块自带功能,比较...

Pytorch 卷积神经网络效果

Pytorch 卷积神经网络效果[TOC] 数据集Dataloader制作如何自定义数据集:1.数据和标签的目录结构先搞定(得知道到哪读数据)...

Pytorch 新闻分类任务(学习笔记)

Pytorch 新闻分类任务(学习笔记)[TOC] 目录结构 models文件夹该文件夹显示搭建的网络结构。里面有TextCNN.py和TextRNN....

Pytorch Flask服务部署图片识别(学习笔记)

Pytorch Flask服务部署图片识别(学习笔记)[TOC] Flask 简介Flask是一个用Python编写的轻量级Web应用框架。它简单易用,...

Pytorch 预测产量(易化学习笔记一)

Pytorch 预测产量(易化学习笔记一)[TOC] 实验目的(二维)通过温度进行产量预测。 实验代码导入数据集import torch im...

Pytorch 曲线拟合(易化学习笔记二)

Pytorch 曲线拟合(易化学习笔记二)[TOC] 感染与天数预测import matplotlib.pyplot as plt import torch import torch....

Pytorch 识别手写数字(易化学习笔记三)

Pytorch 识别手写数字(易化学习笔记三)[TOC] 识别手写数字LeNet-5手写数字识别的非常高效的卷积神经网络。高效原因:1....

Pytorch cifar10识别普适物体(易化学习笔记四)

Pytorch cifar10识别普适物体(易化学习笔记四)[TOC] CIFAR-10简介CIFAR-10(Canadian Institute For Advanced Research...

Pytorch loguru日志收集(易化学习笔记五)

Pytorch loguru日志收集(易化学习笔记五)[TOC] loguru日志简介Loguru 是一个 Python 日志库,旨在简化日志记录的设置和...

Pytorch TensorBoard运用(易化学习笔记六)

Pytorch TensorBoard运用(易化学习笔记六)[TOC] TensorBoard简介TensorBoard是TensorFlow的可视化工具包,旨在帮助研究...
这一世以无限游戏为使命!
排名
2
文章
657
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术