9 使用torch.autograd实现自动求导

在上一篇中,我们讨论了自动求导的基本概念,了解了什么是自动求导,以及它在深度学习中扮演的重要角色。本篇将深入探讨如何使用PyTorch中的torch.autograd模块实现自动求导,并通过实战案例来帮助大家更好地理解这一过程。

什么是torch.autograd?

torch.autograd是PyTorch中用于实现自动求导的核心包。它能够根据操作记录自动计算梯度,这使得我们可以轻松地进行反向传播(Backpropagation),进而优化模型。在此过程中,torch.autograd会构建一个计算图,图中的节点是张量,而边则表示它们之间的操作关系。

使用自动求导的基本步骤

在使用torch.autograd时,主要的步骤如下:

  1. 创建张量:我们需要先创建需要计算梯度的张量,并设置其属性requires_grad=True
  2. 构建计算图:对创建的张量进行各种操作以生成新张量。
  3. 反向传播:通过调用.backward()方法自动计算梯度。
  4. 访问梯度:可以通过.grad属性来访问计算得到的梯度。

案例:简单的线性回归

为了更好地理解torch.autograd的实现,我们通过一个简单的线性回归案例来演示自动求导过程。

数据准备

我们首先生成一些线性数据作为训练集。考虑一个简单的线性方程:

$$ y = 2x + 1 $$

我们在此基础上加入一些随机噪声来模拟实际数据。以下是数据准备的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import torch
import numpy as np
import matplotlib.pyplot as plt

# 设置随机种子
torch.manual_seed(42)

# 生成数据
x = torch.linspace(0, 1, 100).reshape(-1, 1) # 100个数据点
y = 2 * x + 1 + torch.randn(x.size()) * 0.1 # y = 2x + 1 + 噪声

# 可视化数据
plt.scatter(x.numpy(), y.numpy(), color='blue')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Generated Data')
plt.show()

构建模型

接下来,我们构建一个简单的线性回归模型。这里我们使用torch.nn.Linear来创建一个线性层。

1
2
3
4
import torch.nn as nn

# 定义线性模型
model = nn.Linear(1, 1) # 输入是1维,输出也是1维

定义损失函数和优化器

我们使用均方误差(MSE)作为损失函数,并使用随机梯度下降(SGD)作为优化器:

1
2
3
# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

训练模型

现在,我们将进行模型的训练。在每个训练周期中,我们需要执行以下步骤:

  1. 正向传播:计算预测值。
  2. 计算损失:使用损失函数计算损失。
  3. 反向传播:调用.backward()来计算梯度。
  4. 更新参数:使用优化器更新模型参数。

以下是训练过程的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 训练模型
num_epochs = 200

for epoch in range(num_epochs):
# 正向传播
outputs = model(x) # 计算预测
loss = criterion(outputs, y) # 计算损失

# 反向传播
optimizer.zero_grad() # 清零之前的梯度
loss.backward() # 计算梯度
optimizer.step() # 更新参数

if (epoch+1) % 20 == 0:
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')

可视化结果

训练完成后,我们可以可视化模型的预测结果:

1
2
3
4
5
6
7
8
9
10
11
# 可视化结果
with torch.no_grad(): # 在这个上下文中不需要计算梯度
predicted = model(x)

plt.scatter(x.numpy(), y.numpy(), color='blue')
plt.plot(x.numpy(), predicted.numpy(), color='red', linewidth=2)
plt.xlabel('x')
plt.ylabel('y')
plt.title('Linear Regression Result')
plt.legend(['Predicted', 'Original'])
plt.show()

总结

通过以上的案例,我们展示了如何使用torch.autograd实现自动求导,了解了它的基本使用流程和在训练神经网络中应用的重要性。在深度学习的实际应用中,自动求导是极为关键的工具,它简化了我们对模型梯度的计算,从而使得模型训练更加高效。

在下一篇中,我们将继续探讨神经网络基础,介绍神经网络的基本结构,为您进一步理解深度学习奠定基础。

9 使用torch.autograd实现自动求导

https://zglg.work/pytorch-zero/9/

作者

IT教程网(郭震)

发布于

2024-08-10

更新于

2024-08-10

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论