在PyTorch中操作张量

PyTorch 是一个深度学习库。就像其他一些深度学习库一样,它对称为 **张量** 的数值数组进行操作。简单来说,张量就是多维数组。当我们处理张量时,有些操作被非常频繁地使用。在 PyTorch 中,有一些函数专门用于处理张量。

下面,我们将简要概述 PyTorch 在张量方面提供的功能以及我们如何使用它们。完成本教程后,您将了解:

  • 如何创建和操作 PyTorch 张量
  • PyTorch 的张量语法类似于 NumPy
  • 您可以使用 PyTorch 来操作张量的常用函数

通过我的《用PyTorch进行深度学习》一书来启动你的项目。它提供了包含可用代码自学教程


让我们开始吧。

在 PyTorch 中操作张量。图片由 Big Dodzy 提供。部分权利保留。

概述

本教程分为四个部分;它们是:

  • 创建张量
  • 检查张量
  • 操作张量
  • 张量函数

创建张量

如果您熟悉 NumPy,您应该会记得有多种创建数组的方法。在 PyTorch 中创建张量也是如此。创建特定常数矩阵的最简单方法如下所示:

$$
\begin{bmatrix}
1 & 2 & 3 \\
4 & 5 & 6
\end{bmatrix}
$$

是使用

输出结果为:

dtype 参数指定张量中值的数据类型。它是可选的。您也可以提供 NumPy 数组的值并将其转换为 PyTorch 张量。

通常,您会出于特定目的创建张量。例如,如果您想在 -1 和 1 之间得到十个均匀分布的值,您可以使用 linspace() 函数。

输出结果为:

但是,如果您想要一个随机值的张量(这在测试函数时非常有用),您可以如下创建:

它会打印,例如:

这个生成的张量是 $3\times 4$ 维的,每个值都在 0 和 1 之间均匀分布。如果您想让值呈正态分布,只需将函数更改为 randn()

如果您想让随机值为整数,例如在 3 到 10 之间,您可以使用 randint() 函数。

这会生成,例如:

值在 $3 \le x < 10$ 的范围内。默认情况下,下限为零,因此如果您想让值在 $0 \le x < 10$,您可以使用:

其他常用张量是零张量和所有值都相同的张量。要创建一个零张量(例如,维度为 $2\times 3\times 4$),您可以使用:

输出结果为:

而要创建一个所有值都为 5 的张量,您可以使用:

输出结果为:

但是,如果您希望所有值都为一,有一个更简单的函数:

最后,如果您想要一个单位矩阵,您可以使用 diag()eye() 来获取。

输出结果为:

想开始使用PyTorch进行深度学习吗?

立即参加我的免费电子邮件速成课程(附示例代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

检查张量

一旦您有了张量并想了解更多关于它的信息,您可以通过 print() 简单地将其打印到屏幕上。但如果张量太大,通过检查其形状来显示其维度会更容易。

输出结果为:

张量的形状可以通过 shape 属性或 size() 函数访问。如果您想查看有多少个维度(即,$2\times 3\times 4$ 是 3,而 $3\times 4$ 是 2),您可以读取 ndim 属性。

这将给出“3”。如果您使用 len() 来检查张量,它只会给出第一个维度的尺寸,例如:

输出结果为:

您想要了解的张量的另一个属性是其数据类型。通常,您在深度学习中使用浮点数,但有时张量应该是整数(例如,图像中的像素值)。要检查数据类型,您可以读取 dtype 属性。

输出结果为:

如果您想更改数据类型,您可以创建一个具有新类型的新张量。

上面的输出是:

操作张量

深度学习中张量的一个常见操作是更改张量形状。例如,您可能想将一个二维张量转换为一维,或者向张量添加一个虚拟维度。您可能还想从较大的张量中提取一个子张量。

例如,您可以创建如下张量:

如果您得到

它允许您使用与 NumPy 相同的语法进行切片。

这将是:

或者如果您使用:

它将是:

您还可以利用相同的切片语法 **添加** 一个新维度。例如:

你会看到:

这里您使用 None 在特定位置插入一个新维度。如果您需要将图像转换为仅包含一张图像的批次,这会很有用。如果您熟悉 NumPy,您可能记得有一个名为 expand_dims() 的函数用于此目的,但 PyTorch 不提供它。一个类似的函数是 unsqueeze(),如下所示:

输出如下:

NumPy 切片语法的强大之处在于布尔索引。这在 PyTorch 张量中也得到了支持。例如:

您可能会看到:

上面选择了所有元素都大于 -1 的列。您也可以通过选择特定列来操作张量。

这会产生:

要将二维张量转换为一维,您可以使用:

结果将是:

您也可以使用 reshape() 函数来实现相同的功能。

结果应该与 ravel() 相同。但通常,reshape() 函数用于更复杂的目标形状。

这将打印:

重塑张量的一个常见情况是进行矩阵转置。对于二维矩阵,它以与 NumPy 相同的方式轻松完成。

它会打印:

但 PyTorch 中的 transpose() 函数要求您明确指定要交换的轴。

结果与上面相同。如果您有多个张量,可以通过堆叠它们来组合它们(vstack() 用于垂直堆叠,hstack() 用于水平堆叠)。例如:

这可能会打印:

concatenate 函数类似:

您将得到相同的张量。

反向操作是分割,例如:

输出结果为:

此函数指定要分割成的张量数量,而不是每个张量的大小。后者在深度学习中确实更有用(例如,将大型数据集的张量分割成许多小批量张量)。等效函数是:

这应该给出与之前相同的结果。因此,split(c, 3, dim=0) 意味着在维度 0 上进行分割,使得每个生成的张量的大小为 3。

张量函数

PyTorch 张量可以被视为数组。因此,您通常可以像使用 NumPy 数组一样使用它们。例如,您可以使用常见的数学函数:

输出如下:

请注意,如果某个函数未定义(例如,负数的平方根),结果将是 nan,但不会引发异常。在 PyTorch 中,您有一个函数来检查张量的值是否为 nan

您将获得

确实,除了这些定义的函数之外,Python 的运算符也可以应用于张量。

您得到

在各种运算符中,矩阵乘法在深度学习中非常重要。您可以通过以下方式执行此操作:

输出如下:

这两者是相同的。事实上,Python 的 @ 运算符也可用于向量点积,例如:

输出结果为:

如果将张量中的值视为样本,您可能还想查找有关它的某些统计信息。PyTorch 中也提供了一些。

输出结果为:

但是,对于线性代数函数,您应该在 PyTorch 的 linalg 子模块中找到它们。例如:

你会看到:

对于卷积神经网络,填充张量是通过以下方式完成的:

输出如下:

此 `pad()` 函数的示例是为维度 0 创建 (1,1) 填充,为维度 1 创建 (0,2) 填充。换句话说,对于每个维度 0(行),我们在开头和结尾添加一个虚拟值 (0)。对于每个维度 1(列),我们在开头添加零个虚拟值,在结尾添加两个虚拟值。

最后,由于 PyTorch 张量可以被视为数组,您可以直接将它们与其他工具(如 matplotlib)一起使用。下面是使用 PyTorch 张量绘制曲面的示例。

meshgrid 生成的 `xx` 张量为:

创建的图为:

总结

在本教程中,您将了解如何操作 PyTorch 张量。具体来说,您将学习:

  • 什么是张量
  • 如何在 PyTorch 中创建各种张量
  • 如何在 PyTorch 中重塑、切片和操作张量
  • 可以应用于 PyTorch 张量的常用函数

开始使用PyTorch进行深度学习!

Deep Learning with PyTorch

学习如何构建深度学习模型

...使用新发布的PyTorch 2.0库

在我的新电子书中探索如何实现
使用 PyTorch进行深度学习

它提供了包含数百个可用代码自学教程,让你从新手变成专家。它将使你掌握:
张量操作训练评估超参数优化等等...

通过动手练习开启你的深度学习之旅


查看内容

操作 PyTorch 中的张量 的 5 条回复

  1. John William O'Meara June 17, 2023 at 5:41 am #

    该行
    “z = torch.sqrt(1 – xx**2 – (yy/2)**2)”
    返回一个包含 NaN 的张量。
    这个公式有误吗?

    • James Carmichael June 17, 2023 at 10:54 am #

      嗨 John…我们会对此进行研究,但如果您是手动输入代码还是复制粘贴的代码,那将会有所帮助。

  2. John William O'Meara June 17, 2023 at 9:11 pm #

    嗨 James,
    我手动输入的。我对此进行了一些尝试,因为对于 Z 的值,获取负数的平方根似乎是主要问题。
    我在 `torch.sqrt()` 中插入了 `abs()`,它生成了一个与图中所示大致相似的图,只是在角落处有一些层状峰值。

    • James Carmichael June 18, 2023 at 8:14 am #

      嗨 John…谢谢您的更新!这很可能会对其他人也有帮助。

  3. John William O'Meara June 20, 2023 at 3:11 am #

    你好,
    您能找到解决方案吗?

发表评论

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。