Deep Learning with Pytorch - autograd

Deep Learning with Pytorch: A 60 Minute Blitz

Autograd: automatic differentiation

Autograd: 自动微分

在 Pytorch 中所有神经网络的中心就是 autograd
让我们首先短暂地了解一下,然后我们将训练我们第一个神经网络.

autograd 包提供了在 Tensors 上所有操作的自动微分. 这是一个运行时定义的框架, 即你的反向传播算法是由你的代码怎样运行定义的, 每一次迭代都将不同.

Variable

autograd.variable 是这个包的中心类. 它包装了一个 Tensor 并且支持几乎所有定义在 Tensor 上的操作.一旦你结束计算你可以调用 .backward()使你的所有梯度都自动计算

你可以通过 .data特性访问任何 raw Tensor, 关于(w.r.t.with respect to)这个变量的梯度可以被积累至.grad

h还有一个对autograd实现非常重要的类 Function
Variable 和 Function 相互联系共同构建了一个循环图, 图编码了计算的全部历史. 每个Variable都有一个.grad_fn特性, 指向创造Varaible的Function ( 除了Varaibles是被用户创建,这是grad_fn为None ).

如果你想计算导数,可以对Variable调用.backward().如果Variable是一个标量,并不需要对backward()指明任何参数,但是如果Variable有很多元素,就要指明一个梯度参数, 该参数是匹配形状的张量.

import torch 
from torch.autograd import Variable
x = Varaible(torch.ones(2, 2), requires_grad=True); # 创建一个Variable
print(x)

y = x + 2
print(y)
# 因为y作为一个操作的结果被创建,所以它有grad_fn
print(y.grad_dn)

z = y * y * 3
out = z.mean()
print(z, mean)

Gradient

让我们backprop, out.backward() 就是 out.backward(torch.Tensor([1, 0]))
# 这里相当给出了x的初始值,就是算出求导公式后带入x计算的x的值
out.backward();
print(x.grad)`
我们应该会得到一个所有元素都是4.5的矩阵,
我们称out为Variable”o”
O=14iZi O = 1 4 ∑ i Z i ;
Zi=3(xi+2)2 Z i = 3 ( x i + 2 ) 2 ;
Zi|xi=1=27 Z i | x i = 1 = 27 ;
dodx=32(xi+2) d o d x = 3 2 ( x i + 2 )
dodxi|xi=1=92=4.5 d o d x i | x i = 1 = 9 2 = 4.5

你可以用autograd做很多疯狂的事情

x = torch.randn(3)
x = Variable(x, requires_grad=True)

y = x * 2
while y.data.norm() < 1000:
    y = y * 2
print(y)

gradients = torch.FloatTensor([0.1, 1.0, 0.001])
y.backward(gradients)
# y 对 x 的求导结果就是1024
print(x.grad)
# result:
#  102.4000 
# 1024.0000
#    1.0240
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值