[Pytorch] 前向传播和反向传播示例

目录

简介

神经网络训练基本步骤

1. 计算图

2. 前向传播 Forward

3. 计算损失Loss 【损失函数】

4. 反向传播 Backward

5. 使用学习率更新权重【优化器】

样例代码

样例结果

样例图解


简介

PyTorch是一个基于Torch的Python开源机器学习库,用于自然语言处理等应用程序。Pytorch提供了两个高级功能:

  1. 具有强大的GPU加速的张量计算(Numpy的替代品)
  2. 包含自动求导系统的深度神经网络

神经网络训练基本步骤

1. 计算图

组成:由节点和边组成,节点分为Tensor和Function(运算)

  • Tensor分为叶子节点和非叶节点
  • Pytorch计算图是动态图

2. 前向传播 Forward

操作:根据输入数据进行推测。创建Fucntion后可以立即执行,不需要等到计算图定义好之后再执行。

3. 计算损失Loss 【损失函数】

操作:计算前向推测结果与真实值之间的误差

4. 反向传播 Backward

操作:将Loss向输入侧进行反向传播,对所有需要进行梯度计算的所有变量 leaf node Tensor x(requires_grad=True),计算梯度 dLoss/dx,并将其积累到梯度x.grad中备用, 即:x.grad = x.grad + dLoss/dx

5. 使用学习率更新权重【优化器】

操作:使用优化器对x的值进行更新。优化器会根据用户设置的学习率以及x.grad来更新x。

如:随机梯度下降SGD,x = x - learning_rate * x.grad

样例代码

def test_training_pipeline():    
    # ============================================================================ 1.创建计算图
    # ============================================================================ 2.前向传播(即时计算)
    input_data = [[4, 4, 4, 4],
                  [9, 9, 9, 9]]  # 2x4
    input = torch.tensor(input_data, dtype=torch.float32, requires_grad=True)
    output = torch.sqrt(input)
    print("\n### 前向传播推测结果:\n", output)

    # ============================================================================ 3.计算Loss
    target_data = [1, 2, 3, 4]
    target = torch.tensor(target_data, dtype=torch.float32)
    
    loss_fn = torch.nn.MSELoss()
    loss = loss_fn(input=output, target=target)
    print("\n### loss:\n", loss)
       
    # ============================================================================ 4.反向传播
    loss.backward()
    print("\n### input_grad:\n", input.grad)
    
    # ============================================================================ 5.更新input
    optim = torch.optim.SGD([input], lr=0.001)
    print("\n### input before optim.step():\n", input)
    optim.step()
    print("\n### input after optim.step():\n", input)

样例结果

样例图解

图解和手动计算前向传播和反向传播。

ps: 此图不包含更新权重的步骤(即optimizer.step())

参考

理解Pytorch的loss.backward()和optimizer.step() - 知乎

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch中的卷积神经网络(CNN)的反向传播是通过计算梯度来更新网络参数的过程。在PyTorch中,可以使用自动求导机制来自动计算梯度。下面是一个简单的示例代码,展示了如何在PyTorch中实现CNN的反向传播: ```python import torch import torch.nn as nn # 定义一个简单的卷积神经网络 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(1, 16, kernel_size=3, stride=1, padding=1) self.relu = nn.ReLU() self.pool = nn.MaxPool2d(kernel_size=2, stride=2) self.fc = nn.Linear(16 * 14 * 14, 10) def forward(self, x): x = self.conv1(x) x = self.relu(x) x = self.pool(x) x = torch.flatten(x, 1) x = self.fc(x) return x # 创建网络实例 net = Net() # 定义损失函数 criterion = nn.CrossEntropyLoss() # 定义优化器 optimizer = torch.optim.SGD(net.parameters(), lr=0.001) # 传播反向传播 inputs = torch.randn(1, 1, 28, 28) # 输入数据 labels = torch.tensor([0]) # 标签 # 清零梯度 optimizer.zero_grad() # 传播 outputs = net(inputs) # 计算损失 loss = criterion(outputs, labels) # 反向传播 loss.backward() # 更新参数 optimizer.step() ``` 在上述代码中,我们首先定义了一个简单的卷积神经网络`Net`,然后创建了网络实例`net`。然后我们定义了损失函数和优化器(这里使用了交叉熵损失和随机梯度下降优化器)。接下来,我们通过传播计算网络输出,并计算损失。然后,我们调用`backward()`方法执行反向传播,自动计算网络参数的梯度。最后,我们调用`optimizer.step()`方法来更新网络参数。 这就是PyTorch中卷积神经网络的反向传播过程。希望对你有帮助!如果有任何问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值