PyTorch学习笔记(二):关于张量的阶、轴和形状的解释
PyTorch
最后更新 2020-04-17 16:54 阅读 6600
最后更新 2020-04-17 16:54
阅读 6600
PyTorch
上一篇我们讲解到《张量解释-深度学习的数据结构》。
在这篇文章中,我们将深入研究张量,并介绍三个基本的张量属性,阶,轴和形状。 阶、轴和形状的概念是我们在深度学习中最关心的张量属性。
阶、轴和形状的概念是我们在深度学习中最关心的张量属性。
- 阶
- 轴
- 形状
当我们在深度学习中开始学习张量时,最为关注的是张量的三个属性:阶、轴和形状。这些概念建立在一个又一个的基础上,从阶开始,然后是轴,最后到形状,所以要注意这三者之间的关系。
阶、轴和形状都与我们在上一篇文章中讨论的索引概念有着根本的联系。如果你没看过,我强烈建议你去看看。首先引入张量的阶。
张量的阶(Rank)、轴(Axis)和形状(Shape)
一、张量的阶
张量的阶是指张量中的维数。假设我们有一个二阶张量。这意味着以下所有内容:
- 我们有一个矩阵
- 我们有一个二维数组
- 我们有一个二维张量
我们在这里介绍阶(rank)这个词,是因为它通常用于深度学习中,指的是给定张量中存在的维数。这只是不同研究领域使用不同词汇来指代同一概念的另一个例子。别搞混了。
阶和轴
张量的阶告诉我们访问(引用)张量数据结构中的特定数据元素需要多少个索引。
A tensor's rank tells us how many indexes are needed to refer to a specific element within the tensor.
让我们通过观察张量的轴来建立阶的概念。
二、张量的轴
如果我们有一个张量,并且我们想引用一个特定的维度,我们在深度学习中使用轴(axis)这个词。
An axis of a tensor is a specific dimension of a tensor.
假设有个张量是一个2阶的张量,这意味着这个张量有2个维度,或者等价于,张量有 2 个轴。
元素被称为存在或沿着轴运行。这个机制受每个轴的长度限制。现在让我们看看轴的长度。
轴的长度
每个轴的长度告诉我们每个轴上有多少个索引可用。
假设我们有一个叫 t 的张量,我们知道第一个轴的长度是3,而第二个轴的长度是4。
由于第一个轴有三个长度,这意味着我们可以沿着第一个轴索引三个位置,如下所示
t[0] t[1] t[2]
所有这些索引都是有效的,但是我们不能移动到超过索引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:
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维数组。这就是我们在这个例子中看到的,但是这个思想是通用的。
张量的阶告诉我们一个张量有多少轴,这些轴的长度使我们得到一个非常重要的概念,即张量的形状。
三、 张量的形状
张量的形状由每个轴的长度决定,所以如果我们知道给定张量的形状,那么我们就知道每个轴的长度,这就告诉我们每个轴上有多少索引可用。
The shape of a tensor gives us the length of each axis of the tensor.
以之前相同的张量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对象,所以我们可以查看tensor的形状:
> t.shape torch.Size([3,3])
这可以让我们看到张量的形状是3 x 3。注意,在PyTorch中,张量的大小和形状是一样的。 3 x 3的形状告诉我们,这个2阶张量的每个轴的长度都是3,这意味着我们有三个沿着每个轴可用的索引。现在让我们看看为什么张量的形状如此重要。
张量的形状很重要
张量的形状很重要,有几个原因。第一个原因是形状允许我们在概念上思考,甚至想象一个张量。高阶张量变得更抽象,形状给了我们一些具体的思考。
形状还编码所有有关轴、阶和索引的相关信息。
另外,当我们对神经网络进行编程时,我们必须经常执行的一种操作叫做reshape。 当我们的张量在网络中流动时,在网络内部的不同点上会出现特定的形状,作为神经网络程序员,我们的工作就是理解传入的形状,并有能力根据需要重构形状。
重构(reshape)张量
在我们研究 reshape 张量之前,请回想一下开始重构之前,我们是如何使用下面术语列表的:
Shape 6 x 1
- number
- scalar
- array
- vector
- 2d-array
- matrix
Shape 2 x 3
- number, array, 2d-array
- scalar, vector, matrix
Shape 3 x 2
- number, scalar
- array, vector
- 2d-array, matrix
这些术语组中的每一组只表示具有不同形状的相同基础数据。这只是一个小例子来启发重构(reshape)的想法。从这个动机中得到的重要好处是,形状改变了术语的分组,但不会改变基础术语本身。让我们再看看我们的例子张量dd:
> t = torch.tensor(dd) > t tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
这个 torch.Tensor 是一个二阶张量,形状是[3,3]或3x 3。现在,假设我们需要重构 t 的形状为[1,9]。这将为我们提供一个沿第一个轴的数组和沿第二个轴的九个数字。
> t.reshape(1,9) tensor([[1, 2, 3, 4, 5, 6, 7, 8, 9]]) > t.reshape(1,9).shape torch.Size([1, 9])
现在,关于重构,需要注意的一点是,形状中的分量值的乘积必须等于张量中元素的总数。
例如:
3 * 3 = 9 1 * 9 = 9
这使得张量数据结构中有足够的位置来包含整形后的所有原始数据元素。
Reshaping changes the shape but not the underlying data elements.
这只是张量重构的一个简单介绍。在以后的文章中,我们将更详细地介绍这个概念。
总结
本文介绍了张量。我们现在应该很好地理解了张量和用来描述它们的术语,比如阶、轴和形状。很快,我们将看到在PyTorch中创建张量的各种方法。
英文原文链接是:https://deeplizard.com/learn/video/AiyK0idr4uM