PyTorch Autograd 与 变量

在任何深度学习库中,都需要一种机制来计算误差梯度,并通过计算图进行反向传播。这种机制在PyTorch中称为autograd,变量类是autograd系统的主要组件。

变量类封装了一个张量及梯度属性,当调用.backward()函数时,会自动计算张量的梯度,并存储在梯度属性中。变量和张量之间的区别是变量中包含梯度,变量也可以进行数学运算。

让我们从一个简单的张量中创建一个变量:

# 从pytorch autograd库中导入变量
from torch.autograd import Variable

# 定义变量
x = Variable(torch.ones(2, 2) * 2, requires_grad=True)
x

输出

tensor([[2., 2.],
        [2., 2.]], requires_grad=True)

在上面的变量声明中,传入了一个张量,同时指明这个变量需要一个梯度,这意味着这个变量是可以训练的。如果requires_grad标志设置为False,则不会对变量进行训练。

对于这个简单的例子,我们没有进行任何训练,接下来,让我们看另外一个例子。

  • 假设方程是 y = x^2
  • 定义变量 x =[2,4]
  • 经过计算,得到 y = [4,16]
  • 假设损失函数为:o = (1/2)sum(y) = (1/2)sum(x²)
  • 计算梯度,即o对于x的导数: do/dx = x,所以梯度是[2,4]
# 从pytorch autograd库中导入变量
from torch.autograd import Variable

# 让我们进行基本的反向传播
# 方程是y = x^2
array = [2,4]
tensor = torch.Tensor(array)
x = Variable(tensor, requires_grad = True)
y = x**2
print(" y =  ",y)

# 损失函数为:o = (1/2)sum(y) = (1/2)sum(x²)
o = (1/2)*sum(y)
print(" o =  ",o)

# 反向传播
o.backward() # 计算梯度

# 变量的梯度保存在.grad属性中,查看x的梯度: x.grad
print("gradients: ",x.grad)

输出

y =   tensor([ 4., 16.], grad_fn=<PowBackward0>)

o =   tensor(10., grad_fn=<MulBackward0>)

gradients:  tensor([2., 4.])

可以看出,梯度属性也是一个张量。



浙ICP备17015664号 浙公网安备 33011002012336号 联系我们 网站地图  
@2019 qikegu.com 版权所有,禁止转载