← 返回首页
回归任务
发表时间:2025-03-14 15:58:19
回归任务

回归任务是机器学习中的一种常见任务,它的目标是预测一个连续的数值。简单来说,就是根据已知的一些数据点,找到它们背后的规律,然后用这个规律去预测新的、未知的数值。

1.搭建神经网络的基本步骤

  1. 数据准备
  2. 收集数据:根据任务需求收集相关的数据集。
  3. 数据预处理:
  4. 数据清洗:去除异常值、处理缺失值等。
  5. 数据归一化或标准化:将数据缩放到合适的范围。
  6. 数据分割:将数据集分为训练集、验证集和测试集。
  7. 数据增强(可选):对于一些任务,可以通过数据增强来扩充训练数据,提高模型的泛化能力。

  8. 定义模型

  9. 选择网络架构:根据任务需求选择合适的神经网络类型(如全连接网络、卷积网络等)。

  10. 定义层结构:确定网络的层数、每层的神经元数量以及激活函数等。
  11. 初始化参数:对网络的权重和偏置进行初始化。

  12. 定义损失函数和优化器

  13. 选择损失函数:根据任务类型选择合适的损失函数(如均方误差、交叉熵损失等)。

  14. 选择优化器:选择优化算法(如SGD、Adam等),并设置学习率等超参数。

  15. 训练模型

  16. 前向传播:将输入数据通过网络进行前向计算,得到输出。

  17. 计算损失:根据输出和真实标签计算损失值。
  18. 反向传播:通过反向传播计算梯度。
  19. 更新参数:使用优化器更新网络参数,以最小化损失函数。
  20. 重复训练:循环进行前向传播、损失计算、反向传播和参数更新,直到模型收敛。

  21. 评估模型

  22. 验证集评估:在验证集上评估模型的性能,调整超参数。

  23. 测试集评估:在测试集上评估模型的最终性能,确保模型的泛化能力。

  24. 使用模型进行预测

  25. 加载训练好的模型:加载保存的模型权重。

  26. 进行预测:使用训练好的模型对新的数据进行预测。

  27. 保存模型(可选) 保存模型结构和权重:将训练好的模型结构和权重保存下来,以便后续使用。

以上是搭建一个神经网络的基本步骤,具体实现会根据使用的框架(如TensorFlow、PyTorch等)有所不同,但整体流程是相似的。

2.Pytorch实现抛物线回归拟合

下面是一个使用 PyTorch 实现的简单深度学习神经网络,用于抛物线回归拟合的例子,包含两个隐藏层。

import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt

# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置字体为SimHei显示中文
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

# 生成抛物线数据
np.random.seed(0)
X = np.linspace(-5, 5, 200)[:, np.newaxis]
y = 2 * X**2 + 3 * X + 1 + np.random.normal(0, 1, X.shape)

# 转换为 PyTorch 张量
X_tensor = torch.from_numpy(X).float()
y_tensor = torch.from_numpy(y).float()

# 定义神经网络模型
class RegressionNet(nn.Module):
    def __init__(self):
        super(RegressionNet, self).__init__()
        self.layer1 = nn.Linear(1, 64)
        self.layer2 = nn.Linear(64, 32)
        self.output = nn.Linear(32, 1)
        self.relu = nn.ReLU()

    def forward(self, x):
        x = self.relu(self.layer1(x))
        x = self.relu(self.layer2(x))
        x = self.output(x)
        return x

# 初始化模型、损失函数和优化器
model = RegressionNet()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)

# 训练模型
epochs = 1000
losses = []

for epoch in range(epochs):
    # 前向传播
    outputs = model(X_tensor)
    loss = criterion(outputs, y_tensor)

    # 反向传播和优化
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    losses.append(loss.item())

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

# 预测
model.eval()
with torch.no_grad():
    y_pred = model(X_tensor).numpy()

# 绘制结果
plt.figure(figsize=(10, 6))
plt.scatter(X, y, color='blue', label='真实数据')
plt.plot(X, y_pred, color='red', label='拟合曲线')
plt.legend()
plt.title('PyTorch 神经网络抛物线回归拟合')
plt.show()

# 绘制损失曲线
plt.figure(figsize=(10, 4))
plt.plot(losses)
plt.title('训练损失曲线')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.show()

代码说明

数据生成: 生成了一个抛物线数据集,公式为,并添加了少量噪声。

模型定义: - 定义了一个名为 RegressionNet 的神经网络类,继承自 nn.Module - 包含两个隐藏层(64 和 32 个神经元),使用 ReLU 激活函数 - 输出层有 1 个神经元(回归任务) - 损失函数和优化器: - 使用均方误差(MSE)作为损失函数 - 使用 Adam 优化器

训练过程: - 进行 1000 个周期的训练 - 每 100 个周期打印一次损失值

结果可视化: - 绘制真实数据点和拟合曲线 - 绘制训练损失曲线

运行这段代码后,你会看到神经网络如何拟合生成的抛物线,以及训练过程中损失值的变化情况。