pytorch 反向传播

关于 torch 反向传播

普通的 grad

1
2
3
4
5
6
7
import torch


x = torch.tensor([1,2,3],dtype=torch.float,requires_grad=True)
z = torch.mean(x+x ** 2)
z.backward()
print(x.grad)

tensor 对 tensor 的 grad

tensortensor 的导数是直接不可调用的,所以需要将原来的 tensor转换成标量

1
2
3
4
5
6
7
x = torch.tensor([1.0,2.0,3.0],requires_grad=True)
y = (x + 2)**2
z = 4*y

z.backward(torch.tensor([1,1,1]))
x.grad

自定义函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import torch
import math

class LegendrePolynomial3(torch.autograd.Function):
"""
通过继承 autograd.Function 可以定制函数
"""

@staticmethod
def forward(ctx, input):
"""
ctx 是用来存储上下文的,就是将这里的 input 存入上下文,可以把第一行当作标准操作
"""
ctx.save_for_backward(input)
return 0.5 * (5 * input ** 3 - 3 * input)

@staticmethod
def backward(ctx, grad_output):
"""
从 ctx 中读取 input 在 计算梯度的时候可能会用到
"""
input, = ctx.saved_tensors
return grad_output * 1.5 * (5 * input ** 2 - 1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import torch
import torch.nn.functional as F
import torch.nn.init as init
from torch.nn.parameter import Parameter

class whateveriwantclass(torch.autograd.Function):
    @staticmethod
    def forward(ctx,my_imput):
        ctx.save_for_backward(my_imput)
        return my_imput**2
    @staticmethod
    def backward(ctx,my_grad_input):
        my_input, = ctx.saved_tensors
        return my_grad_input*2*my_input

whateveriwantfun = whateveriwantclass.apply
x = torch.tensor([1,2,3],dtype=torch.float,requires_grad=True)
z = torch.mean(x+whateveriwantfun(x))
z.backward()

print(x.grad)

结果和之前是一样的


pytorch 反向传播
http://home.ustc.edu.cn/~ustcxwy0271/2022/05/05/pytorch-backward/
作者
Xu Weiye
发布于
2022年5月5日
许可协议