神经网络拟合函数

我努力过无数次了,但我明白,机会只存在于其中的一两次。

神经网络学习拟合函数

建立一个简单的神经网络模型,用于拟合方程 y = 3x + 2。通过迭代训练,模型逐渐学习拟合这个线性方程,最后进行预测。

代码运行需要的库

torch
matplotlib

代码

import torch
import torch.nn as nn
import torch.optim as optim
class EquationFittingModel(nn.Module):  # 定义一个简单的神经网络
    def __init__(self):
        super(EquationFittingModel, self).__init__()  # 调用父类(nn.Module)的构造函数,确保我们的神经网络模型继承了父类的属性和方法
        self.fc1 = nn.Linear(1, 64)  # 输入层到隐藏层的全连接层
        self.relu = nn.ReLU()  # 激活函数
        self.fc2 = nn.Linear(64, 1)  # 隐藏层到输出层的全连接层
    def forward(self, x):  # 神经网络向前传播
        x = self.fc1(x)  # 输入数据 x 经过第一个全连接层 (fc1),进行线性变换
        x = self.relu(x)  # 线性变换后的结果经过激活函数 ReLU,引入非线性
        x = self.fc2(x)  # 经过第二个全连接层 (fc2),进行另一次线性变换
        return x  # 模型预测结果
# 创建模型实例
equation_model = EquationFittingModel()  # 创建一个名为 equation_model 的神经网络模型的实例
criterion = nn.MSELoss()  # 定义均方误差损失函数
optimizer = optim.Adam(equation_model.parameters(), lr=0.001)  # 选择Adam优化器
# 模拟一些训练数据
x_train = torch.rand((100, 1))  # 形状为 (100, 1) 的在 [0, 1) 范围内均匀分布的张量(tensor)
y_train = 3 * x_train + 2 + 0.1 * torch.randn((100, 1))  # 模拟方程 y = 3x + 2 + 噪声
# 训练模型
num_epochs = 1000
for epoch in range(num_epochs):
    # 前向传播
    y_pred = equation_model(x_train)
    # 计算损失
    loss = criterion(y_pred, y_train)
    # 反向传播和优化
    optimizer.zero_grad()  # 清零梯度,防止梯度累积
    loss.backward()  # 反向传播,计算梯度
    optimizer.step()  # 更新模型参数
    if (epoch + 1) % 100 == 0:  # 每经过 100 次迭代时执行其中的代码块。在这里,代码块是用于打印当前迭代的损失值
        print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}')
# 使用训练好的模型进行预测
x_test = torch.rand((10, 1))
y_pred_test = equation_model(x_test)
print("Predictions:", y_pred_test.detach().numpy())

预测结果可视化

结果图

在这里插入图片描述

代码
import matplotlib.pyplot as plt
# ... (上面的模型定义和训练代码)
# 使用训练好的模型进行预测
x_test = torch.linspace(0, 1, 100).view(-1, 1)  # 在区间 [0, 1] 生成一些测试数据
y_pred_test = equation_model(x_test)
# 可视化训练数据和模型拟合结果
plt.scatter(x_train.numpy(), y_train.numpy(), label='训练数据', color='blue')
plt.plot(x_test.numpy(), y_pred_test.detach().numpy(), label='模型预测结果', color='red', linewidth=2)
plt.xlabel('x')
plt.ylabel('y')
plt.title('神经网络拟合方程')
plt.legend()
plt.show()

总结

上述代码实现了一个简单的神经网络模型(EquationFittingModel),并使用该模型拟合了一个线性方程。以下是对代码的总结:

  1. 定义神经网络模型:

    • EquationFittingModel 类继承自 nn.Module,表示一个神经网络模型。
    • __init__ 方法用于定义模型的结构,包括两个全连接层和一个 ReLU 激活函数。
    • forward 方法实现了神经网络的前向传播。
  2. 创建模型实例:

    • equation_model = EquationFittingModel() 创建了一个 EquationFittingModel 类的实例。
  3. 定义损失函数和优化器:

    • 使用均方误差损失函数 nn.MSELoss 衡量模型输出与实际标签之间的差距。
    • 使用 Adam 优化器 optim.Adam 进行参数优化,学习率为 0.001。
  4. 生成训练数据:

    • x_train 是一个在 [0, 1) 范围内均匀分布的随机张量,形状为 (100, 1)。
    • y_train 模拟了一个线性方程 y = 3x + 2,并添加了噪声。
  5. 训练模型:

    • 进行了 1000 次迭代,每次迭代包括前向传播、计算损失、反向传播和优化过程。
    • 通过 optimizer.zero_grad() 清零梯度,避免梯度累积。
    • loss.backward() 计算梯度,optimizer.step() 更新模型参数。
    • 每 100 次迭代打印一次损失值。
  6. 使用训练好的模型进行预测:

    • 生成一些测试数据 x_test,并通过模型进行预测得到 y_pred_test
  7. 可视化训练数据和模型拟合结果:

    • 使用 Matplotlib 对训练数据和模型拟合结果进行可视化。

总体而言,该代码演示了使用 PyTorch 创建、训练和使用一个简单的神经网络模型进行拟合任务,并通过可视化展示了模型对数据的拟合效果。

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于神经网络函数的优化,常见的方法包括以下几种: 1. 选择适的网络结构:神经网络的结构包括隐藏层的数量和神经元的数量。通过调整网络结构,可以使其更加适应函数的复杂性。一般来说,增加网络的宽度和深度可以提高能力,但也需要注意过的问题。 2. 选择适的激活函数:激活函数对于神经网络能力有很大影响。常见的激活函数包括Sigmoid、ReLU、tanh等。不同的激活函数适用于不同类型的问题,选择适的激活函数可以提高网络的表达能力。 3. 选择适的损失函数:损失函数用于衡量模型预测值与真实值之间的差异。对于回归问题,常见的损失函数包括均方误差(MSE)、平均绝对误差(MAE)等。对于分类问题,常见的损失函数包括交叉熵损失函数等。选择适的损失函数可以使优化过程更加准确。 4. 数据预处理:对数据进行预处理可以提高神经网络能力。包括数据标准化、归一化、特征选择等。预处理可以降低数据的噪声和冗余,提高模型的泛化能力。 5. 正则化技术:正则化技术可以帮助减少模型的过现象。常见的正则化技术包括L1正则化、L2正则化、Dropout等。这些技术可以通过对模型的参数进行约束或随机丢弃一定比例的神经元来减少过。 6. 选择适的优化算法:优化算法用于调整神经网络的参数,使得损失函数达到最小值。常见的优化算法包括梯度下降法(包括批量梯度下降法、随机梯度下降法、小批量梯度下降法)、Adam算法等。选择适的优化算法可以提高模型的收敛速度和性能。 以上是一些常见的方法,实际应用中还可以根据具体问题进行调整和改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值