![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=1738887509-wkAi2ugG8CYJT5N7psD01WDeALCf8uKJ-0-a343e20a5bf9959082faf37907c26d3e)
在上述代码中,requires_grad参数指定要为张量对象计算梯度。
2.接下来,定义计算输出的方式,在这个特定的例子中,输出是所有输入的平方和:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/54_05.jpg?sign=1738887509-6YjufFHHzjXbs4pIQpdIeBLpFETOOx3N-0-7cf3b74758b06bd07a31740beada94aa)
相应的代码如下:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/54_06.jpg?sign=1738887509-DTnfajVV8WYDQxVcvlKor0T2NSvl5wUx-0-7046475a66ce07e19a3cce9f7405681a)
我们知道前一个函数的梯度是2×x,下面使用PyTorch提供的内置函数来验证这一点。
3.可以通过对某个值调用backward()方法来计算该值的梯度。在这个例子中,计算梯度——对于x(输入)的一个小变化,out(输出)的变化——如下所示:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/55_01.jpg?sign=1738887509-8mRWm2ScLxpqThNEjYkE6M2h04SFDU8C-0-ec9898276c314d534c81419e1a801f64)
4.现在可以得到out关于x的梯度,如下所示:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/55_02.jpg?sign=1738887509-4cvmnOtrtjlgk7PifQ7xbfLaQ6iXHgfN-0-7796d5c1cd74b4ea623859e282f1fae7)
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/55_03.jpg?sign=1738887509-ycetefSofS906Jf5trNBD3dRb5Ht6ox9-0-6dae83c8923acc797fe24cd57b505b0e)
图2-5
结果如图2-5所示。
注意,上述梯度值与直观的梯度值(即x值的2倍)是匹配的。
作为练习,可以试着使用PyTorch重现第1章中chain rule.ipynb的场景。在一次前向传播之后计算梯度,并做出一次权重更新。然后,验证更新的权重与在notebook中计算的值匹配。
到目前为止,我们已经学习了在张量对象上的初始化、运算和梯度计算——它们共同构成了神经网络的基本构建模块。除了计算自动梯度,初始化和数据运算也可以使用NumPy数组完成。这就需要我们理解为什么在构建神经网络的时候,应该使用张量对象而不是使用NumPy数组,这将在下一节进行讨论。