autograd自动求导机制

本文是对http://pytorch.org/tutorials/beginner/blitz/autograd_tutorial.html的部分翻译以及自己理解的部分,如有错误,欢迎指正。

对于pytorch中的所有神经网络(nn)而言最重要的是autograd包。对tensor的所有运算autograd包提供了自动求导机制。它遵循了按定义运行的框架,即你的代码如何运行定义了你的反向传播。下面是具体例子:

张量(tensor)

torch.Tensor是包里重要的类。如果你将这个类的属性.requires_grad赋为True,它就会跟踪该张量上的所有操作。当你完成了运算可以调用.backward()来自动计算所有的梯度(gradient)。该张量的梯度会累积记录于.grad属性中。

为了停止一个张量跟踪历史,可以调用.detach()从而切断跟踪历史的操作,这样未来的运算就不会被跟踪了。

为了防止跟踪历史(占用内存),可以将代码包裹在with torch.no_grad():的代码块里。这种做法在评估模型时非常有用,因为此时模型包含可训练的参数其requires_grad=True,但是我们不需要梯度。

还有一个重要的类是Function

每个变量都有一个.grad_fn属性。如果你想计算导数,可以调用tensor的.backward()。如果tensor是一个标量,不用为backward()指定参数。如果tensor有多个元素,需要指定gradient的变量。

创建一个张量,并设置requires_grad=True 去跟踪运算


对张量运算:


y是一个运算的结果。所以它有grad_fn属性。


接下来对y进行更多的运算:


.requires_grad_(...)可以原址修改已存在张量的requires_grad标志。该函数的参数默认是True


梯度

接下来演示反向传播,因为上面例子中out包含一个标量,所以out.backward()out.backward(torch.tensor(1))等价。

打印梯度d(out)/dx


得到了元素为4.5的2*2的矩阵。将out张量记为o。我们有

,并且.因此, ,且

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




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值