- PyTorch计算机视觉实战:目标检测、图像处理与深度学习
- (印)V·基肖尔·阿耶德瓦拉等
- 930字
- 2024-06-06 18:06:14
2.2.2 张量运算
与NumPy类似,你可以在张量对象上执行各种基本运算。与神经网络运算类似的是输入数据与权重之间的矩阵乘法,添加偏置项,并在需要的时候重塑输入数据或权重值。下面给出这些运算和其他运算的实现代码。
下列代码可以从本书的GitHub存储库(https://tinyurl.com/mcvp-packt)Chapter02文件夹中的Operations_on_tensors.ipynb获得。
❍ 可以使用下列代码将x中所有元素乘以10:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/51_07.jpg?sign=1739515168-vSsEieBKXA1d9FptDuDhzOTbuykiVskR-0-421ff176a718f6bed60394b0eeb06e3d)
❍ 可以使用下列代码将10加到x中的元素,并将得到的张量存储到y中:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/51_08.jpg?sign=1739515168-wnJVLvTi71OVZOilTSoD8qixol96DDbP-0-2be0c8c43f4c204b6a45579868e69449)
❍ 可以使用下列代码重塑一个张量:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/52_01.jpg?sign=1739515168-IiGvvS6LuraClfHVFIbylAQPAnGGiDp9-0-490fefae5ee4739a44df9080742f5f89)
❍ 重塑张量的另一种方法是使用squeeze方法,提供我们想要移除的指标轴。注意,这只适用于要删除的轴在该维度中只有一个项的场合:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/52_02.jpg?sign=1739515168-d5vYWFr5XVZfSJUiXWKITlAoHLMU5V9u-0-43e58ddd60c554de4a4bfe736c5f1a9e)
❍ 与squeeze相反的是unsqueeze,这意味着给矩阵增加一个维度,可以使用下列代码实现:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/52_03.jpg?sign=1739515168-HBsWSL7j6yHXXyXSHk4HMpEbHL2m9QMi-0-6283d6ae4f900cc4fc41a40490c02dd3)
使用None进行索引是一种很别致的unsqueeze方式,本书经常使用这种方式创建虚拟的通道/批维度。
❍ 可以使用下列代码实现两个不同张量的矩阵乘法:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/52_05.jpg?sign=1739515168-zs6N6xdB0a2iyrbdSDUprGqbTlueBUao-0-9f575e5da9c47545b6d08805d522c97f)
❍ 或者,也可以使用@运算符实现矩阵乘法:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/53_01.jpg?sign=1739515168-i860lYRtyjCijiAigo048M4ZFDIEIjRg-0-98a8325268f934b6a5f471c3b6e6df07)
❍ 类似于NumPy中的concatenate,可以使用cat方法实现张量的连接:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/53_02.jpg?sign=1739515168-iOy9JYHkKnCCrKh9zk58PmFWbXfjSpCF-0-e60b186072f4a88f7dc2b430a4bb2e96)
❍ 可以使用下列代码提取张量中的最大值:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/53_03.jpg?sign=1739515168-NJHmviiwMeZz4ppmcxQC8B5KiCIcwpUt-0-5c5c0e20c4a19501715e95b2789411b9)
❍ 可以从存在最大值的行索引中提取最大值:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/53_04.jpg?sign=1739515168-SIyQDCjfEhKLwukkkmz9eGbDjAtRmABm-0-564e44b48ebd8f361dc81d872e39b5a4)
注意,在前面的输出中,获取的是第0号维度上的最大值,即张量在行上的最大值。因此,所有行上的最大值都是第4个索引中出现的值,所以indices的输出也都是4。此外,.max返回最大值和最大值的位置(argmax)。
类似地,跨列取最大值时的输出如下所示:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/53_05.jpg?sign=1739515168-FIk3RnR1TdsBY2qJ1gFtzcW8LrQDrS4H-0-8bb88ffcf57bfca2f0a62ac527de2ba7)
min运算与max运算完全相同,但在适合的情况下返回最小值和最小值的位置(arg-minimum)。
❍ 置换一个张量对象的维数:
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/53_06.jpg?sign=1739515168-x3mhn4RdDvWaYrKdLsebpwv2aXmOZjUG-0-7f98405a40a1230cf5051ffa325f46f0)
![](https://epubservercos.yuewen.com/37D997/29686491107405206/epubprivate/OEBPS/Images/54_01.jpg?sign=1739515168-nVqnIT6OtiYzz31cstpC0S2TlT2zkwNr-0-5dd82f551444446e7d8decec9c1c56e7)
注意当对原始张量进行排列时,张量的形状就会发生改变。
永远不要通过重塑(即使用tensor.view)一个张量来交换维数。虽然Torch不会抛出一条错误信息,但这是错误的,并将在训练期间产生不可预见的结果。如果需要交换维数,请始终使用permute。
因为本书很难涵盖所有可用的运算,所以重要的是要知道,你可以使用几乎与NumPy相同的语法在PyTorch中执行几乎所有的NumPy运算。标准的数学运算,如abs、add、argsort、ceil、floo、sin、cos、tan、sum、cumprod、diag、eig、exp、log、log2、log10、mean、median、mode、resize、round、sigmoid、softmax、square、sqrt、svd和transpose等,均可以直接在任何有轴或没有轴的张量上被调用。你总是可以运行dir(torch.Tensor)来查看所有可能的Torch张量方法,并通过help(torch.tensor.<method>)来查看关于该方法的官方帮助和相关文档。
接下来,我们将学习如何利用张量在数据上执行梯度计算,这是神经网络执行反向传播的一个关键点。