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