一,autograd
PS. 由于在pytorch中每次backward以后计算图会自动清楚,所以可通过把retain_graph设置为True,以保存计算图,以便于多次进行Backward
举个关于creat_graph的例子:
flag = True
if flag:
x = torch.tensor([3.],requires_grad=True)
y = torch.pow(x,2)
grad_1 = torch.autograd.grad(y,x,create_graph=True) #创建导数的计算图来求高阶导数
print(grad_1)
grad_2 = torch.autograd.grad(grad_1[0],x) #二阶导
print(grad_2)
结果:
autograd注意点:
1,梯度不自动清零
2,依赖于叶子结点的结点,requires_grad默认为True
3,叶子结点不可执行in-place
简单介绍下什么是in-place操作:
in-place操作就是在原内存中改变数据,举两个例子:
flag = True
if flag:
a = torch.ones((1,))
print(id(a),a)
a = a + torch.ones((1,))
print(id(a),a)
这个的输出结果为:
我们发现,两个的地址不一样了,所以上面代码块的操作就不是in-place操作。
然而
flag = True
if flag:
a = torch.ones((1,))
print(id(a),a)
a += torch.ones((1,))
print(id(a),a)
得出来的结果:
我们发现内存地址没有变化,所以这个操作可以成为in-place操作。