PyTorch 神经网络回归(Regression)任务:关系拟合与优化过程

PyTorch 神经网络回归(Regression)任务:关系拟合与优化过程

本教程介绍了如何使用 PyTorch 构建一个简单的神经网络来实现关系拟合,具体演示了从数据准备到模型训练和可视化的完整过程。首先,利用一维线性空间生成带噪声的数据集,接着定义了一个包含隐藏层和输出层的神经网络。通过使用均方误差损失函数和随机梯度下降优化器,逐步训练神经网络来拟合数据。为了便于理解和监控训练过程,我们使用 matplotlib 实现了动态更新的图形,展示了每次迭代后的预测结果与真实数据的对比。该教程不仅帮助读者理解神经网络的基本架构和训练流程,还展示了如何通过可视化手段更直观地观察模型的优化过程,提升了对模型调优的理解与应用能力。

文章目录

  • [PyTorch 神经网络回归(Regression)任务:关系拟合与优化过程](#PyTorch 神经网络回归(Regression)任务:关系拟合与优化过程)
      • [一 导入第三方库](#一 导入第三方库)
      • [二 设置数据集](#二 设置数据集)
      • [三 编写神经网络](#三 编写神经网络)
      • [四 训练神经网络](#四 训练神经网络)
      • [五 完整代码示例](#五 完整代码示例)
      • [六 源码地址](#六 源码地址)
      • [七 参考](#七 参考)

预备课PyTorch 激活函数详解:从原理到最佳实践

一 导入第三方库

python 复制代码
import torch
import matplotlib.pyplot as plt
import torch.nn.functional as F
import os

二 设置数据集

python 复制代码
# 生成一维的线性空间数据,并增加一维使其形状为 (100, 1)
x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1)
y = x.pow(2) + 0.2 * torch.rand(x.size())  # 生成对应的 y 数据,加上噪声模拟真实情况

三 编写神经网络

python 复制代码
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_hidden
        self.predict = torch.nn.Linear(n_hidden, n_output)  # 定义输出层,输入维度为 n_hidden,输出维度为 n_output

    def 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 个神经元为例的网络结构,以帮助理解。

:如果对上述代码感到困惑,可以暂时将其视为固定写法,专注于理解其基本框架。

四 训练神经网络

python 复制代码
# 初始化神经网络
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 实现训练过程的可视化,帮助直观地跟踪模型的学习进展。

五 完整代码示例

python 复制代码
import torch
import matplotlib.pyplot as plt
import torch.nn.functional as F
import os


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_hidden
        self.predict = torch.nn.Linear(n_hidden, n_output)  # 定义输出层,输入维度为 n_hidden,输出维度为 n_output

    def forward(self, x):
        x = F.relu(self.hidden(x))  # 使用 ReLU 激活函数处理隐藏层的输出
        x = self.predict(x)  # 计算最终输出
        return x


def 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.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()  # 显示最终图像


if __name__ == '__main__':
    print_hi('关系拟合')

复制粘贴并覆盖到你的 main.py 中运行,运行结果如下。

lua 复制代码
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 官方文档](https://pytorch.org/docs/stable/index.html) \[2\] [莫烦 Python](https://mofanpy.com/tutorials/machine-learning/torch/regression) \[3\] [可视化神经网络 TensorFlow Playground](https://playground.tensorflow.org/)

相关推荐
qh0526wy37 分钟前
金融接口基方法Python
windows·python·金融
wei_shuo41 分钟前
GpuGeek 实操指南:So-VITS-SVC 语音合成与 Stable Diffusion 文生图双模型搭建,融合即梦 AI 的深度实践
人工智能·stable diffusion·gpu算力·gpuseek
史迪仔011242 分钟前
Python生成器:高效处理大数据的秘密武器
前端·数据库·python
x-cmd43 分钟前
[250516] OpenAI 升级 ChatGPT:GPT-4.1 及 Mini 版上线!
人工智能·chatgpt·openai·gpt-4.1
2201_754918412 小时前
OpenCV 背景建模详解:从原理到实战
人工智能·opencv·计算机视觉
CopyLower2 小时前
苹果计划将AI搜索集成至Safari:谷歌搜索下降引发的市场变革
前端·人工智能·safari
wd2099882 小时前
2025年Ai写PPT工具推荐,这5款Ai工具可以一键生成专业PPT
人工智能
张飞飞飞飞飞2 小时前
语音识别——声纹识别
人工智能·语音识别
archko3 小时前
语音识别-3,添加ai问答
android·人工智能
Bowen_CV5 小时前
AI 赋能防艾宣传:从创意到实践,我的 IP 形象设计之旅
人工智能·3d建模·豆包·造好物·腾讯混元 3d