秩、轴和形状的概念是我们在深度学习中最关心的张量属性。在这篇文章中,我们将深入研究张量的这三个属性。在深度学习中开始使用张量时,秩、轴和形状是我们最关心的三个张量属性。这些概念相互建立,从秩开始,然后是轴,再到形状,因此请密切注意这三者之间的这种关系。
张量的秩是指张量中存在的维数(dimensions)。假设我们被告知我们有一个 秩为2(rank 2)的张量。这意味着以下所有内容:
秩为1到6的张量分别称为一阶,二阶一直到六阶张量。一阶张量可以理解成一个向量,二阶张量可以理解成矩阵,三阶张量可以理解成立方体,四阶张量可以理解成立方体组成的一个向量,五阶张量可以理解成立方体组成的矩阵,依次类推。如下图所示
在实际操作中,可以理解成[
的深度。例如:
rank=1: [0,1,2]
rank=2: [[0,1],[2,3]]
rank=3: [[[0,1],[2,3]],[[4,5],[6,7]]]
如果我们有一个张量,并且我们想引用一个特定的维度,我们在深度学习中使用轴这个词。张量的轴是张量的特定维度。
如果我们说一个张量是一个秩为2张量,我们的意思是这个张量有 2 个维度,或者等价地,这个张量有两个轴。 元素是沿着轴存在。每个轴的长度限制元素的个数。现在让我们看看轴的长度。
每个轴的长度告诉我们每个轴有多少索引可用。
假设我们有一个名为 t 的张量,并且我们知道第一个轴的长度为 3,而第二个轴的长度为 4。
由于第一个轴的长度为 3,这意味着我们可以沿第一个轴索引三个位置,如下所示:
t[0]
t[1]
t[2]
由于第二个轴的长度为 4,我们可以沿第二个轴索引四个位置。对于第一个轴的每个索引,都有四个索引,所以我们有
t[0][0]
t[1][0]
t[2][0]
t[0][1]
t[1][1]
t[2][1]
t[0][2]
t[1][2]
t[2][2]
t[0][3]
t[1][3]
t[2][3]
张量的秩告诉我们一个张量有多少个轴,这些轴的长度将我们引向了一个非常重要的概念,即张量的形状。
让我们看一些例子来巩固下对轴的理解。举例如下张量
> dd = [
[1,2,3],
[4,5,6],
[7,8,9]
]
沿第一个轴的每个元素都是一个数组:
> dd[0]
[1, 2, 3]
> dd[1]
[4, 5, 6]
> dd[2]
[7, 8, 9]
沿第二个轴的每个元素都是一个数字:
> dd[0][0]
1
> dd[1][0]
4
> dd[2][0]
7
> dd[0][1]
2
> dd[1][1]
5
> dd[2][1]
8
> dd[0][2]
3
> dd[1][2]
6
> dd[2][2]
9
请注意,对于张量,最后一个轴的元素始终是数字。每个其它的轴将包含 n 维数组。张量的秩告诉我们一个张量有多少个轴,这些轴的长度将我们引向了一个非常重要的概念,即张量的形状。
张量的形状由每个轴的长度决定,所以如果我们知道给定张量的形状,那么我们就知道每个轴的长度,这告诉我们每个轴上有多少索引可用。
张量的形状为我们提供了张量每个轴的长度。
让我们考虑与之前相同的张量 dd:
> dd = [
[1,2,3],
[4,5,6],
[7,8,9]
]
如果我们创建一个这样的torch.Tensor 对象:
> t = torch.tensor(dd)
> t
tensor([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
> type(t)
torch.Tensor
现在,我们有一个 torch.Tensor 对象,因此我们可以要求查看张量的形状:
> t.shape
torch.Size([3,3])
这让我们可以看到张量的形状是 3 x 3。请注意,在 PyTorch 中,张量的大小和形状是一回事。
3 x 3 的形状告诉我们,这个 rank 2 张量的每个轴的长度为 3,这意味着我们在每个轴上都有三个可用的索引。现在让我们看看为什么张量的形状如此重要。
张量的形状很重要
由于几个原因,张量的形状很重要。第一个原因是因为形状允许我们从概念上思考,甚至可视化张量。更高阶的张量变得更抽象,形状给了我们一些具体的思考。形状还可以获得有关轴、秩以及索引的所有相关信息。
当我们的张量穿过我们的网络时,在网络内部的不同点会出现某些形状,作为神经网络程序员,我们的工作是了解传入的形状并能够根据需要重塑形状(reshaping)。
本文参考