pytorch中backward的几个要点
torch.backward()
·
pytorch中backward的2个要点
1. requires_grad
用pytorch定义一个网络层,如果数据中加入requires_grad=True,那么对于这个变量而言,就有了属于自己的导数(grad),如果这个数据是矩阵,那么他的grad是同样大小的一个矩阵。我们将requires_grad视为该变量的一个属性,我们知道,我们在现实生活中,或者说在神经网络中,大部分的函数都是一阶连续可微的,也就是说,他的梯度具有唯一性。requires_grad的存在非常合理。
2. scale才能有backward
scale是标量的意思。
首先我们可用用如下语句查看等式中某个自变量的梯度。
print(x.grad, y.grad)
但是有个前提,我们必须要先对他的结果使用.backward()才能去查看,不然的话,他的梯度会显示为none。
非常需要注意的一点是,能够使用.backward()的必须是标量(scale),不然程序会报错。
结合实际的情况,我们看任何一个网络,使用backward的地方几乎只有一个,那就是loss.backward()。
首先loss肯定是一个标量,无论是MSE还是交叉熵,也无论是否加上了正则项,那都是求和之后的结果,也就是一个数值。这一点非常重要。
以下是我随意写的一个网络层,可以感受一下
import torch
import torch.nn as nn
class Linear(nn.Module):
def __init__(self, inc, mult):
super(Linear, self).__init__()
self.intc = inc
self.mult = mult
def forward(self, input0):
return torch.sum(torch.abs(input0*self.mult+self.intc))
def main():
x = torch.tensor(1.0, requires_grad=True)
y = torch.tensor(2.0,requires_grad=True)
z = x**2+y
p = z*2+x
p.backward()
print(z, x.grad, y.grad)
A = torch.ones([3,3],requires_grad=True)
print(A.requires_grad)
f = Linear(1, -2)
b = f(A)
print(b)
b.backward()
print(A.grad)
if __name__ == '__main__':
main()
更多推荐
所有评论(0)