PyTorch 神经网络回归(Regression)任务:关系拟合与优化过程
本教程介绍了如何使用 PyTorch 构建一个简单的神经网络来实现关系拟合,具体演示了从数据准备到模型训练和可视化的完整过程。首先,利用一维线性空间生成带噪声的数据集,接着定义了一个包含隐藏层和输出层的神经网络。通过使用均方误差损失函数和随机梯度下降优化器,逐步训练神经网络来拟合数据。为了便于理解和监控训练过程,我们使用 matplotlib
实现了动态更新的图形,展示了每次迭代后的预测结果与真实数据的对比。该教程不仅帮助读者理解神经网络的基本架构和训练流程,还展示了如何通过可视化手段更直观地观察模型的优化过程,提升了对模型调优的理解与应用能力。
文章目录
- PyTorch 神经网络回归(Regression)任务:关系拟合与优化过程
- 一 导入第三方库
- 二 设置数据集
- 三 编写神经网络
- 四 训练神经网络
- 可视化训练过程
- 五 完整代码示例
- 六 源码地址
- 七 参考
预备课:PyTorch 激活函数详解:从原理到最佳实践
一 导入第三方库
import torch
import matplotlib.pyplot as plt
import torch.nn.functional as F
import os
二 设置数据集
# 生成一维的线性空间数据,并增加一维使其形状为 (100, 1)
x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1)
y = x.pow(2) + 0.2 * torch.rand(x.size()) # 生成对应的 y 数据,加上噪声模拟真实情况
三 编写神经网络
class Net(torch.nn.Module):def __init__(self, n_feature, n_hidden, n_output):super(Net, self).__init__()self.hidden = torch.nn.Linear(n_feature, n_hidden) # 定义隐藏层,输入维度为 n_feature,输出维度为 n_hiddenself.predict = torch.nn.Linear(n_hidden, n_output) # 定义输出层,输入维度为 n_hidden,输出维度为 n_outputdef forward(self, x):x = F.relu(self.hidden(x)) # 使用 ReLU 激活函数处理隐藏层的输出x = self.predict(x) # 计算最终输出return x
在此定义了神经网络的结构,其中隐藏层的输入维度为 n_feature
,输出维度为 n_hidden
,而输出层的输入维度为 n_hidden
,输出维度为 n_output
。下图展示了以 3 个神经元为例的网络结构,以帮助理解。
注:如果对上述代码感到困惑,可以暂时将其视为固定写法,专注于理解其基本框架。
四 训练神经网络
# 初始化神经网络
net = Net(n_feature=1, n_hidden=10, n_output=1) # 定义网络,输入输出各为 1,隐藏层有 10 个神经元
print(net) # 打印网络结构# 定义优化器和损失函数
optimizer = torch.optim.SGD(net.parameters(), lr=0.2) # 使用随机梯度下降法优化网络参数,学习率为 0.2
loss_func = torch.nn.MSELoss() # 定义均方误差损失函数plt.ion() # 开启交互模式,允许动态更新图像for epoch in range(200):prediction = net(x) # 前向传播,使用当前网络计算预测值loss = loss_func(prediction, y) # 计算预测值与真实值之间的误差optimizer.zero_grad() # 清空上一步的梯度信息loss.backward() # 反向传播,计算梯度optimizer.step() # 根据梯度更新网络参数if epoch % 5 == 0: # 每 5 个周期更新一次图像plt.cla() # 清除当前图像内容plt.scatter(x.data.numpy(), y.data.numpy(), label='True Data')plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=2, label='Prediction')plt.text(0.5, 0, f'Loss={loss.item():.4f}', fontdict={'size': 20, 'color': 'red'})plt.legend() # 添加图例# 保存当前图像# file_path = os.path.join(target_directory, f'epoch_{epoch}.png')# plt.savefig(file_path)# print(f"图像已保存: {file_path}")plt.pause(0.1) # 暂停以更新图像plt.ioff() # 关闭交互模式
plt.show() # 显示最终图像
可视化训练过程
可视化神经网络训练(关系拟合)
注:通过引入 matplotlib
实现训练过程的可视化,帮助直观地跟踪模型的学习进展。
五 完整代码示例
import torch
import matplotlib.pyplot as plt
import torch.nn.functional as F
import osclass Net(torch.nn.Module):def __init__(self, n_feature, n_hidden, n_output):super(Net, self).__init__()self.hidden = torch.nn.Linear(n_feature, n_hidden) # 定义隐藏层,输入维度为 n_feature,输出维度为 n_hiddenself.predict = torch.nn.Linear(n_hidden, n_output) # 定义输出层,输入维度为 n_hidden,输出维度为 n_outputdef forward(self, x):x = F.relu(self.hidden(x)) # 使用 ReLU 激活函数处理隐藏层的输出x = self.predict(x) # 计算最终输出return xdef print_hi(name):print(f'Hi, {name}')# 创建保存图片的目录# target_directory = "/Users/your/Desktop/001"# if not os.path.exists(target_directory):# os.makedirs(target_directory)# 创建数据集# 生成一维的线性空间数据,并增加一维使其形状为 (100, 1)x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1)y = x.pow(2) + 0.2 * torch.rand(x.size()) # 生成对应的 y 数据,加上噪声模拟真实情况# 初始化神经网络net = Net(n_feature=1, n_hidden=10, n_output=1) # 定义网络,输入输出各为 1,隐藏层有 10 个神经元print(net) # 打印网络结构# 定义优化器和损失函数optimizer = torch.optim.SGD(net.parameters(), lr=0.2) # 使用随机梯度下降法优化网络参数,学习率为 0.2loss_func = torch.nn.MSELoss() # 定义均方误差损失函数plt.ion() # 开启交互模式,允许动态更新图像for epoch in range(200):prediction = net(x) # 前向传播,使用当前网络计算预测值loss = loss_func(prediction, y) # 计算预测值与真实值之间的误差optimizer.zero_grad() # 清空上一步的梯度信息loss.backward() # 反向传播,计算梯度optimizer.step() # 根据梯度更新网络参数if epoch % 5 == 0: # 每 5 个周期更新一次图像plt.cla() # 清除当前图像内容plt.scatter(x.data.numpy(), y.data.numpy(), label='True Data')plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=2, label='Prediction')plt.text(0.5, 0, f'Loss={loss.item():.4f}', fontdict={'size': 20, 'color': 'red'})plt.legend() # 添加图例# 保存当前图像# file_path = os.path.join(target_directory, f'epoch_{epoch}.png')# plt.savefig(file_path)# print(f"图像已保存: {file_path}")plt.pause(0.1) # 暂停以更新图像plt.ioff() # 关闭交互模式plt.show() # 显示最终图像if __name__ == '__main__':print_hi('关系拟合')
复制粘贴并覆盖到你的 main.py 中运行,运行结果如下。
Hi, 关系拟合
Net((hidden): Linear(in_features=1, out_features=10, bias=True)(predict): Linear(in_features=10, out_features=1, bias=True)
)
六 源码地址
代码地址,GitHub 之 关系拟合 。
七 参考
[1] PyTorch 官方文档
[2] 莫烦 Python
[3] 可视化神经网络 TensorFlow Playground