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