【Pytorch】3. 对Pytorch中梯度的理解

在反向求导是,Pytorch将Variable的梯度放在Variable对象中,随时可以使用Variable.grad得到对应Variable的grad。刚创建Variable的时候,它的grad属性初始化为0.0。

1、Variable.grad梯度是累加的

Variable.grad = Variable.grad + new_grad

import torch
from torch.autograd import Variable

w1 = Variable(torch.Tensor([1.0,2.0,3.0]),requires_grad=True)  #需要求导的话,requires_grad=True属性是必须的
w2 = Variable(torch.Tensor([1.0,2.0,3.0]),requires_grad=True)
print(w1.grad)
print(w2.grad)
d = torch.mean(w1)
d.backward()
w1.grad

在这里插入图片描述

2、梯度清零

w1.grad.data.zero_()
w1.grad

在这里插入图片描述

3、Backward过程中排除子图

Pytorch的反向求导过程是由loss.backward()函数决定的。可以看到backward()函数里并没有传要求谁的梯度,那么在BP算法过程中,Pytorch可能将所有影响loss的Tensor都求一次梯度。这样由耗时又占空间。并且我们可能也不需要所有的Tensor的梯度。Tensor中的一个参数requires_grad。变量的requires_grad标记的运算就相当于or。

import torch
x = torch.randn(5,5)
y = torch.randn(5,5)
z = torch.randn(5,5,requires_grad=True)
a = x + y  #x,y的requires_grad的标记都为false,所以输出的变量requires_grad也为false;如果有一个是True则输出也为True 
print(a.requires_grad)
b = a + z
print(b.requires_grad)

在这里插入图片描述

参考文献:《深度学习之Pytorch》读书笔记

你可能感兴趣的:(Pytorch)