![PyTorch计算机视觉实战:目标检测、图像处理与深度学习](https://wfqqreader-1252317822.image.myqcloud.com/cover/947/50417947/b_50417947.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
2.2.3 张量对象的自动梯度
微分和计算梯度在更新神经网络的权重中起着关键的作用。PyTorch的张量对象自带了计算梯度的内置功能。
在本节中,我们将了解如何使用PyTorch计算张量对象的梯度。
下列代码可以从本书的GitHub存储库(https://tinyurl.com/mcvp-packt)Chapter02文件夹中的Auto_gradient_of_tensors.ipynb获得。
1.定义一个张量对象,并指定要为张量对象计算梯度:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/54_04.jpg?sign=1739049683-Gsbv1kAUe5ksdkodP7NHVc1869WJRIAg-0-b608d6275d15273bdb3068e76613f207)
在上述代码中,requires_grad参数指定要为张量对象计算梯度。
2.接下来,定义计算输出的方式,在这个特定的例子中,输出是所有输入的平方和:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/54_05.jpg?sign=1739049683-JkIguappDDZnnglk4V4Du8ExNrPyzuCv-0-f13cc245796d1fe189f54a432ffbc0e3)
相应的代码如下:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/54_06.jpg?sign=1739049683-i9RQpTEKrHcmrRbLgVosAfOcYZJE0Hgs-0-e2da3da7631356c3edbb684e1b761893)
我们知道前一个函数的梯度是2×x,下面使用PyTorch提供的内置函数来验证这一点。
3.可以通过对某个值调用backward()方法来计算该值的梯度。在这个例子中,计算梯度——对于x(输入)的一个小变化,out(输出)的变化——如下所示:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/55_01.jpg?sign=1739049683-PSkwnIHmGywnRKpNfpbVBTh41IpKYqXw-0-29df636ff6c2538a6378d533e5424034)
4.现在可以得到out关于x的梯度,如下所示:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/55_02.jpg?sign=1739049683-gfu8kiarzyewEsC9ZxIFgZ2S87sgLF3R-0-dcc563e5644340e6f1c885fac489954e)
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/55_03.jpg?sign=1739049683-jRIMtHcUJUjwBGXJHc5WC9V7kCzuqdsY-0-bb6c44a6d33c499a11e78e0467985894)
图2-5
结果如图2-5所示。
注意,上述梯度值与直观的梯度值(即x值的2倍)是匹配的。
作为练习,可以试着使用PyTorch重现第1章中chain rule.ipynb的场景。在一次前向传播之后计算梯度,并做出一次权重更新。然后,验证更新的权重与在notebook中计算的值匹配。
到目前为止,我们已经学习了在张量对象上的初始化、运算和梯度计算——它们共同构成了神经网络的基本构建模块。除了计算自动梯度,初始化和数据运算也可以使用NumPy数组完成。这就需要我们理解为什么在构建神经网络的时候,应该使用张量对象而不是使用NumPy数组,这将在下一节进行讨论。