一、requires_grad

requires_grad是tensor类的一个属性,默认是false。可以在初始化时用requires_grad参数来确定,也可以通过tensor.requires_grad_(bool)函数来改变既有tensor是否需要自动求导。

x=torch.ones(3,2)
print(x.requires_grad)
y=torch.ones(3,2,requires_grad=True)
print(y.requires_grad)

x.requires_grad_(True)
x

 

二、grad_fn 

tensor类的一个属性,如果是用户自己定义的tensor,则grad_fn=None,否则grad_fn记录了这个张量是如何获得的。

#grad_fn
x=torch.ones(3,2)
new=x+y
print(x.grad_fn)
print(new.grad_fn)

三、反向传播与梯度计算 

如果t是【一个数字组成的tensor】,可以用t.backward()

然后所有计算图中t之前的tensor的grad属性都会更新

#grad
x=torch.ones(2,3,requires_grad=True)
y=torch.ones(2,3,requires_grad=True)
print(x.grad)
z=(x+y*2).mean()
z.backward()
print(x.grad)
print(y.grad)

 四、tensor.detach()

可以通过.detach()获得一个新的Tensor, 拥有相同的内容但不需要自动求导.

#grad
x=torch.ones(2,3,requires_grad=True)
y=torch.ones(2,3,requires_grad=True)
x1=x.detach()
print(x.requires_grad)
print(x1.requires_grad)

z=(x1+y*3).mean()
z.backward()
print(y.grad)#更新
print(x1.grad)#none

 另外有:with torch.no_grad():采用代码块的方式也可以终止对计算图的回溯