PyTorch - 05 - Rank, Axes 和Shape:深度学习张量
Rank, Axes 和Shape:深度学习张量
等级,轴和形状的概念是在深度学习中最关心我们的张量属性。
- 秩
- 轴数
- 形状
等级,轴和形状是在深度学习中从张量开始时最关心我们的三个张量属性。 这些概念是相互依存的,首先是等级,然后是轴,最后是形状,因此请密切注意这三个之间的关系。
等级,轴和形状在一起都与我们在上一篇文章中讨论过的索引概念基本相关。 如果您还没有看到它,我强烈建议您检查一下。 让我们从一楼开始介绍一下张量的等级。
张量等级
张量的等级是指张量内存在的维数。 假设我们被告知我们有一个2级张量。 这意味着以下所有:
- 我们有一个矩阵
- 我们有一个二维数组
- 我们有一个二维张量
我们在这里引入“等级”一词是因为它是指在给定张量中存在的维数时在深度学习中常用的单词。 这只是不同研究领域使用不同词语指代同一概念的另一种情况。 不要让它让您失望!
排名和索引
张量的等级告诉我们访问(指)张量数据结构中包含的特定数据元素需要多少个索引。
张量的等级告诉我们需要多少个索引来引用张量内的特定元素。
通过查看张量的轴来建立等级的概念。
张量轴
如果我们有张量,并且想要引用一个特定的维,则在深度学习中使用单词轴。
张量的轴是张量的特定尺寸。
如果说张量是2级张量,则意味着张量具有2个维度,或者等效地,张量具有2个轴。
据说元素存在或沿轴延伸。 该运行受每个轴的长度限制。 现在让我们看一看轴的长度。
轴长
每个轴的长度告诉我们沿每个轴有多少索引可用。
假设我们有一个名为t的张量,并且我们知道第一个轴的长度为3,而第二个轴的长度为4。
由于第一根轴的长度为三,这意味着我们可以沿第一根轴索引三个位置,如下所示:
t[0]
t[1]
t[2]
所有这些索引都是有效的,但是我们不能移动通过的索引2。
由于第二根轴的长度为四,因此我们可以沿第二根轴索引四个位置。 对于第一轴的每个索引,这都是可能的,所以我们有
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维数组。 这是我们在本示例中看到的,但是这个想法是概括的。
张量的等级告诉我们张量具有多少个轴,这些轴的长度使我们引出一个非常重要的概念,即张量的形状。
张量的形状
张量的形状由每个轴的长度确定,因此,如果我们知道给定张量的形状,则可以知道每个轴的长度,这告诉我们沿每个轴有多少个索引可用。
张量的形状为我们提供了张量每个轴的长度。
让我们考虑与之前相同的张量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 x3。请注意,在PyTorch中,张量的大小和形状是相同的。
3 x 3的形状告诉我们,该秩为2的张量的每个轴的长度为3,这意味着我们沿每个轴都有三个索引。 现在让我们看看为什么张量的形状如此重要。
张量的形状很重要
张量的形状很重要,原因有几个。 第一个原因是因为形状使我们可以在概念上考虑甚至可视化张量。 高阶张量变得更抽象,并且形状使我们有一些具体的思考的地方。
形状还对有关轴,等级和索引的所有相关信息进行编码。
此外,在对神经网络进行编程时必须经常执行的一种操作类型称为重塑。
当我们的张量流过我们的网络时,期望在网络中的不同点处出现某些形状,而作为神经网络程序员,我们需要了解传入的形状并具有根据需要进行变形的能力。
重塑张量
在研究重整张量之前,请回想一下我们如何重塑我们之前开始的术语列表:
形状6 x 1
- 数
- 标量
- 数组
- 向量
- 二维阵列
- 矩阵
形状2 x 3
- 数字,数组,二维数组
- 标量,矢量,矩阵
形状3 x 2
- 数字,标量
- 数组,向量
- 2D阵列,矩阵
这些术语组中的每组仅以不同的形状表示相同的基础数据。这只是激发重塑想法的一个小例子。
此动机的重要意义在于,形状会更改术语的分组,但不会更改基础术语本身。
让我们再次看一下张量dd的示例:
> t = torch.tensor(dd)
> t
tensor([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
此割炬张量是等级为2的张量,形状为[3,3]或3 x 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
这样可以使张量数据结构内有足够的位置,以在重塑后包含所有原始数据元素。
重塑会更改形状,但不会更改基础数据元素。
这只是张量重塑的简要介绍。 在以后的文章中,我们将更详细地介绍该概念。
总结
这将对张量进行介绍。 现在,我们应该对张量和用来描述它们的行列(如等级,轴和形状)有很好的理解。 很快,我们将看到在PyTorch中创建张量的各种方法。