pytorch中自动求导比较简单,不需要用计算图。主要就是写公式,反向传播,求导。
#1.定义变量
x = torch.range(1,5)
x.requires_grad = True
#2.定义函数
y = 2*x
#3.反向传播
y.sum().backward()
#4.求导
x.grad
#5.清零
x.grad.zero_()
#6.另一个计算
y1 = x*x
#7.反向传播
y1.sum().backward()
#8.求导
x.grad
运行结果:
此处注意tensor需要是浮点数类型,在示例中使用torch.range()而不是torch.arange()就是这一原因。
通过.require_grad = True声明这是一个变量。
(2)定义函数 只需要按照公式打出就可以。
(3)反向传播
要求是一个标量,若直接使用y.backward()会报错:grad can be implicitly created only for scalar outputs。这一问题的解决方法就是先使用.sum()再反向传播。
(4)求导
对谁求导直接使用.grad。注意没有括号。
(5)清零
主要解决梯度累积的问题。为不影响后面的计算要对变量梯度清零。下图展示对变量不梯度清零则之前的梯度就会累积。