赞
踩
tensor 即张量,是一种数据结构,被广泛用于神经网络模型(编程)中,用来表示或者编码神经网络模型的输入、输出和模型参数等等。
相信大家对上面两行名词都不会陌生,第一行的名词来源于计算机科学,第二行的名词则来源于数学,它们实际上是相同的概念:
获取一个元素所需要的索引数 | 计算机科学 | 数学 |
---|---|---|
0 | 数字 | 标量 |
1 | 数组 | 向量 |
2 | 二维数组 | 矩阵 |
所谓的获取一个元素所需要的索引数,我们如果有 t = [1, 2, 3, 4],想得到 3 的话就得写 t[2],如果有 t = [[1,2,3], [4,5,6], [7,8,9]],想取出 3 就得写 t[0][2]
当所需要的索引数 n 大于 2 时,计算机科学和数学就会分别表示为 ndarray(n 维数组)和 nd-tensor(n 维张量):
获取一个元素所需要的索引数 | 计算机科学 | 数学 |
---|---|---|
n | n 维数组 | n 维张量 |
因此,我们所说的张量其实就是 n 维数组。
秩就是张量中存在的维度的数目,或者说从张量中获取一个元素所需要的索引数,例如矩阵、二维数组、二维张量,它们的秩都是 2
轴就是张量中某一个特定的维度,一个秩等于 1 的张量有一个轴(Axis),一个秩等于 2 的张量有两个轴(Axes)等等。
每个轴的长度很重要,因为它可以告诉我们沿每个轴有多少索引可用,例如已知张量 t 的第一个轴长度为 3,我们就只能索引到 t[0] t[1] t[2]
,大于 2 就越界了。
张量的秩告诉我们张量有多少个轴,张量的每个轴的长度告诉我们该轴有多少索引可用。于是,将它们结合起来,就是张量的形状,在 Pytorch 中使用
.shape
或 size()
方法即可得到一个张量的形状。
此节更详细的内容可以参考官方文档
dtype 表示张量的数据类型,张量之间的张量运算必须发生在具有相同数据类型的张量之间,使用 .dtype
可知一个张量的数据类型:
张量之间的张量运算必须发生在具有相同数据类型的张量之间
device 表示张量被分配到的设备(CPU 或者 GPU,又或者是哪一个 GPU),张量之间的张量运算必须发生在同一设备上存在的张量之间,使用 .device
可知一个张量被分配到的设备:
layout 表示张量在内存中的存储方式,也就是布局。分为 torch.strided(密集张量)和 torch.sparse_coo(稀疏 COO 张量)两种。常用的是 torch.strided,使用 stride()
方法即可获得张量的内存布局:
a 是两行三列的矩阵(二维张量),其布局为(3,1)表示在第一个维度(行)上,走 3 格可以得到下一个元素(下一行的元素),在第二个维度(列)上,走 1 格可以得到下一个元素(下一列的元素),以此类推。
从数据 data 创建张量有以下四种方法:
torch.Tensor(data)
torch.tensor(data)
torch.as_tensor(data)
torch.from_numpy(data)
data 可以是列表、元组、NumPy 数组、标量和其他类型。torch.Tensor() 和
torch.tensor() 的区别看这篇博客,torch.as_tensor() 和 torch.from_numpy() 的区别看这篇博客。
简单总结一下就是:
凭空创建张量常用的有以下四种方法:
torch.eye()
单位矩阵(一定是矩阵,无法指定维度)torch.ones()
全 1 张量torch.zeros()
全 0 张量torch.rand()
随机张量使用 .to()
方法即可,直接指定 dtype 和 device,如下:
方法比较多,看我的这篇博客即可。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。