关于 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
tensor
对 tensor
的导数是直接不可调用的,所以需要将原来的 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 torchimport mathclass 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 torchimport torch.nn.functional as Fimport torch.nn.init as initfrom torch.nn.parameter import Parameterclass 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)
结果和之前是一样的