Pytorch相关(第二篇)
Pytorch自动梯度法,实现自定义向前 向后传播方法
在 PyTorch 中,自定义自动求导的功能可以通过实现继承自 torch.autograd.Function
的类来实现。这允许您定义自己的前向传播(forward)和反向传播(backward)逻辑。下面是如何自定义实现向前和向后传播的详细步骤和示例代码。
自定义 autograd
制作步骤
- 创建继承自
torch.autograd.Function
的类。 - 实现
forward
方法:计算前向传播并保存任何需要在反向传播中使用的张量。 - 实现
backward
方法:计算反向传播,使用grad_output
计算每个输入的梯度。 - 使用自定义的 Function:在训练或评估中使用您的自定义操作。
示例代码:自定义平方函数
下面的示例自定义了一个平方操作的前向和反向传播:
import torch class MySquareFunction(torch.autograd.Function): @staticmethod def forward(ctx, input): """前向传播""" ctx.save_for_backward(input) # 保存输入张量以用于反向传播 return input ** 2 # 返回平方结果 @staticmethod def backward(ctx, grad_output): """反向传播""" input, = ctx.saved_tensors # 获取保存的输入张量 grad_input = 2 * input * grad_output # 计算关于输入的梯度 return grad_input # 返回梯度 # 使用自定义的 Function x = torch.tensor([2.0, 3.0, 4.0], requires_grad=True) # 创建输入张量 square = MySquareFunction.apply # 获取自定义函数的引用 # 前向传播 y = square(x) print("Output:", y) # 输出: tensor([4.0, 9.0, 16.0], grad_fn=<MySquareFunctionBackward>) # 计算损失并进行反向传播 loss = y.sum() loss.backward() # 计算梯度 # 打印输入的梯度 print("Gradient:", x.grad) # 输出: tensor([4.0, 6.0, 8.0])
代码解释
-
自定义类
MySquareFunction
:- 继承了
torch.autograd.Function
。 - 实现了两个静态方法
forward()
和backward()
。
- 继承了
-
前向传播:
- 在
forward
方法中,计算输入的平方并将输入张量保存到上下文中,以便在反向传播中使用。 - 使用
ctx.save_for_backward(input)
保存输入。
- 在
-
反向传播:
- 在
backward
方法中,从上下文中获取保存的输入张量。 - 计算关于输入的梯度公式 d(output)d(input)=2⋅inputd(input)d(output)=2⋅input。
- 注意,
grad_output
是由后续层传播来的梯度。
- 在
-
使用自定义的 Function:
- 创建一个需要计算梯度的张量
x
,调用自定义的square
函数进行前向传播。 - 计算损失并进行反向传播,调用
loss.backward()
计算输入的梯度。
- 创建一个需要计算梯度的张量
总结
通过以上示例,您可以看到如何在 PyTorch 中自定义前向和反向传播的逻辑。自定义 torch.autograd.Function
允许您实现复杂的操作和梯度计算,同时保留 PyTorch 的自动求导功能。这种方式在编写新的模型或需要特定行为的操作时尤为有用。您可以根据具体需求修改上述示例,实现自己的自定义操作。