前言
PyTorch 是一个深度学习库。与其他一些深度学习库一样,它对称为张量的数值数组进行操作。简单来说,张量就是多维数组。在处理张量时,一些操作非常常见。在 PyTorch 中,有一些专门用于处理张量的函数。接下来,我们将简要概述 PyTorch 在张量方面提供的功能以及如何使用它们。完成本章后,你将了解:
- 如何创建和操作 PyTorch 张量
- PyTorch 的张量语法与 NumPy 类似
- PyTorch 中常用的函数,可以用来操作张量
一、创建张量
如果你熟悉 NumPy,你应该记得有多种方式来创建数组。在 PyTorch 中,创建张量的方式也是如此。创建一个特定常量矩阵的最简单方法,如下所示:
是使用以下方法:
清单 3.1:在 PyTorch 中创建张量
import torch
a = torch.tensor([[1,2,3], [4,5,6]], dtype=torch.int32)
print(a)
输出:
输出 3.1:PyTorch 张量
tensor([[1, 2, 3],
[4, 5, 6]], dtype=torch.int32)
dtype 参数指定张量中值的数据类型,它是可选的。你也可以提供来自 NumPy 数组的值,并将其转换为 PyTorch 张量。通常,你会为了某个特定目的创建张量。例如,如果你想在 -1 和 1 之间均匀分布十个值,可以使用 linspace() 函数:
清单 3.2:在 PyTorch 中创建张量
import torch
a = torch.linspace(-1, 1, 10)
print(a)
输出:
输出 3.2:由 linspace() 生成的张量
tensor([-1.0000, -0.7778, -0.5556, -0.3333, -0.1111, 0.1111, 0.3333, 0.5556,
0.7778, 1.0000])
但是,如果你想要一个随机值的张量(这在测试函数时非常有用),你可以像下面这样创建一个:
清单 3.3:创建一个随机张量
import torch
a = torch.rand(3,4)
print(a)
输出 3.3:一个 3 × 4 形状的随机张量
tensor([[0.4252, 0.1029, 0.9858, 0.7502],
[0.1993, 0.6412, 0.2424, 0.6451],
[0.7878, 0.7615, 0.9170, 0.8534]])
这个生成的张量是 3 × 4 的维度,且每个值均匀分布在 0 到 1 之间。如果你希望这些值是正态分布的,只需将函数改为 randn():
清单 3.4:创建一个正态分布的随机值张量
a = torch.randn(3,4)
如果你想让随机值是整数,例如在 3 到 10 之间,你可以使用 randint() 函数:
清单 3.5:创建一个随机整数张量
import torch
a = torch.randint(3, 10, size=(3,4))
print(a)
这将会生成,例如:
输出 3.4:一个随机整数张量
tensor([[4, 5, 7, 9],
[3, 8, 8, 9],
[4, 7, 7, 6]])
这些值的范围是 3 ≤ x < 10。默认情况下,下限是 0,因此如果你希望值在 0 ≤ x < 10 之间,可以使用:
清单 3.6:创建一个随机整数张量
a = torch.randint(10, size=(3,4))
另一个常用的张量是零张量和所有值相同的张量。要创建一个零张量(例如,维度为 2 × 3 × 4),你可以使用:
清单 3.7:创建一个零张量
import torch
a = torch.zeros(2, 3, 4)
print(a)
输出:
输出 3.5:一个零张量
tensor([[[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]],
[[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]]])
要创建一个所有值都为 5 的张量,你可以使用:
3.8:创建一个填充张量
import torch
a = torch.full((2,3,4), 5)
print(a)
输出:
输出 3.6:填充张量是一个具有相同值的张量
tensor([[[5, 5, 5, 5],
[5, 5, 5, 5],
[5, 5, 5, 5]],
[[5, 5, 5, 5],
[5, 5, 5, 5],
[5, 5, 5, 5]]])
但是如果你希望所有值都为 1,有一个更简单的函数:
3.9:创建一个全为 1 的张量
a = torch.ones(2,3,4)
最后,如果你想要一个单位矩阵,你可以使用 diag() 或 eye() 来获取:
清单 3.10:创建一个单位张量
import torch
a = torch.eye(4)
print(a)
输出:
输出 3.7:一个单位矩阵
tensor([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.]])
二、检查张量
一旦你有了一个张量,并且想了解更多信息,你可以使用 print() 简单地将其打印到屏幕上。但如果张量太大,检查其形状并显示其维度会更容易:
清单 3.11:检查张量形状
import torch
a = torch.zeros(2, 3, 4)
print(a.shape)
print(a.size())
输出:
输出 3.8:张量形状
torch.Size([2, 3, 4])
torch.Size([2, 3, 4])
张量的形状可以通过 shape 属性或 size() 函数访问。如果你想查看张量有多少维度(例如,2 × 3 × 4 是 3 维,而 3 × 4 是 2 维),你可以读取 ndim 属性:
清单 3.12:查找张量的维数
print(a.ndim)
这将返回“3”。如果你使用 len() 来检查张量,它只会给出第一维的大小,例如:
3.13:查找第一维的大小
import torch
a = torch.zeros(2, 3, 4)
print(len(a))
输出:
输出 3.9:第一维的大小
2
你可能还想了解张量的另一个属性是它的数据类型。通常,在深度学习中使用浮点数,但有时张量应该是整数(例如,在图像中作为像素值)。要检查数据类型,你可以读取 dtype 属性:
清单 3.14:查找张量的数据类型
print(a.dtype)
输出:
输出 3.10:张量的数据类型
torch.float32
如果你想更改数据类型,可以使用新类型重新创建张量:
清单 3.15:更改张量的数据类型是通过创建另一个张量
import torch
a = torch.zeros(2, 3, 4)
b = a.type(torch.int32)
print(a.dtype)
print(b.dtype)
以上输出:
输出 3.11:打印出的张量数据类型
torch.float32
torch.int32
总结
以上是PyTorch深度学习教程第三章-在 PyTorch 中操作张量(上)的内容。
在下一章中,你将学习PyTorch深度学习教程第三章-在 PyTorch 中操作张量(下)的内容。