使用 PyTorch 封装反向传播(Backpropagation)的简单神经网络类

首先

导入PyTorch库:首先,我们需要导入PyTorch库,这样我们才能使用其中的模块和函数。

import torch
import torch.nn as nn
import torch.optim as optim

当使用 PyTorch 封装反向传播算法时,通常需要以下步骤:

1. **定义神经网络模型类**:我们定义了一个名为 `NeuralNetwork` 的类,该类继承自 `nn.Module` 类。在 `__init__` 方法中,我们初始化了神经网络的结构,包括输入层、隐藏层和输出层,并使用 `nn.Linear` 定义了全连接层。在 `forward` 方法中,我们定义了数据的前向传播过程,通过激活函数(这里使用了 ReLU 函数)进行信息的传递。

class NeuralNetwork(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(NeuralNetwork, self).__init__()
        # 定义隐藏层和输出层的线性变换以及激活函数
        self.hidden = nn.Linear(input_size, hidden_size)
        self.out = nn.Linear(hidden_size, output_size)
        self.ReLU = nn.ReLU()

    def forward(self, x):
        # 前向传播计算
        hidden = self.ReLU(self.hidden(x))  # 隐藏层计算及激活
        output = self.ReLU(self.out(hidden))  # 输出层计算及激活
        return output

我们定义了一个名为NeuralNetwork的类,它有一个__init__方法用于初始化网络的结构,其中包括输入层、隐藏层和输出层;还有一个forward方法用于定义数据的前向传播过程。

2. **选择损失函数和优化器**:我们选择了均方误差损失函数 `nn.MSELoss()`,用于计算模型预测与真实标签之间的误差。

而优化器 `optim.SGD` 则采用随机梯度下降法来更新模型参数。

criterion = nn.MSELoss()  # 使用均方误差作为损失函数
optimizer = optim.SGD(net.parameters(), lr=0.01)  # 使用随机梯度下降优化器,并指定学习率

 我们选择了均方误差损失函数(MSE)作为我们的损失函数,并使用随机梯度下降(SGD)优化器来更新模型的参数。

3. **准备数据**:我们生成了随机的输入数据 `input_data` 和目标输出 `target_output`,这些随机生成的数据用于训练神经网络。

input_data = torch.randn(1, input_size)  # 随机生成输入数据
target_output = torch.randn(1, output_size)  # 随机生成目标输出数据

4. **前向传播和计算损失**:首先,我们将输入数据传入神经网络模型,得到模型的输出。然后,使用选择的损失函数计算模型输出与目标输出之间的误差。

output = net(input_data)  # 进行前向传播,得到模型的预测输出
loss = criterion(output, target_output)  # 计算模型预测输出与目标输出之间的损失值

5. **反向传播和更新权重**:通过调用 `optimizer.zero_grad()` 来清除之前的梯度信息,然后调用 `loss.backward()` 来计算梯度并执行反向传播。最后,调用 `optimizer.step()` 来根据梯度更新神经网络的权重参数。

optimizer.zero_grad()  # 梯度清零
loss.backward()  # 反向传播,计算梯度
optimizer.step()  # 更新模型参数

以上步骤构成了使用 PyTorch 封装反向传播的基本流程。通过这种方式,我们可以利用 PyTorch 提供的高效的张量运算和自动微分功能来搭建和训练神经网络模型。 

:MSE损失函数:MSE的意义是对预测值与真实值之间的差异进行平方处理,然后求平均值。这样做的好处是可以消除正负误差的影响,同时较大的误差会被放大,从而更加注重那些离散点。

MSE越小表示模型的预测结果与实际结果之间的差异越小,模型的拟合效果越好。在训练模型时,我们通常希望通过调整模型的参数,使得MSE最小化,从而获得更好的预测效果。

SGD(Stochastic Gradient Descent,随机梯度下降)是一种常用的优化算法,用于训练机器学习模型。它的公式如下:

1. 随机选择一个样本:从训练数据中随机选择一个样本。

2. 计算梯度:计算选择的样本对应的损失函数关于模型参数的梯度。

3. 更新参数:使用梯度信息来更新模型参数,以减小损失函数的值。

4. 重复以上步骤:重复执行上述步骤,直到达到指定的停止条件(如达到最大迭代次数或损失函数收敛)。

SGD的公式可以表示为:

θ = θ - α * ∇J(θ, xi, yi)

其中,θ表示模型参数,α表示学习率(控制参数更新的步长),∇J(θ, xi, yi)表示损失函数关于模型参数的梯度,xi和yi分别表示选择的样本的特征和标签。

完整代码如下

# -*- coding: utf-8 -*-
import torch
import torch.nn as nn
import torch.optim as optim


# 定义神经网络模型类
class NeuralNetwork(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(NeuralNetwork, self).__init__()
        # 定义隐藏层和输出层的线性变换以及激活函数
        self.hidden = nn.Linear(input_size, hidden_size)
        self.out = nn.Linear(hidden_size, output_size)
        self.ReLU = nn.ReLU()

    def forward(self, x):
        # 前向传播计算
        hidden = self.ReLU(self.hidden(x))  # 隐藏层计算及激活
        output = self.ReLU(self.out(hidden))  # 输出层计算及激活
        return output



# 设置输入、隐藏层和输出层的维度
input_size = 5
hidden_size = 3
output_size = 1

# 创建神经网络实例
net = NeuralNetwork(input_size, hidden_size, output_size)

# 选择损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.SGD(net.parameters(), lr=0.01)

# 准备数据
input_data = torch.randn(1, input_size)
target_output = torch.randn(1, output_size)

# 前向传播和计算损失
output = net(input_data)
loss = criterion(output, target_output)

print("模型输出值:", output)
print("损失值:", loss.item())

# 反向传播和更新权重
optimizer.zero_grad()
loss.backward()
optimizer.step()

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值