目录
- 1、tensor 是什么?
- 2、tensor 的三个属性
- 2.1 Rank 秩
- 2.2 Axis(复数 为 Axes) 轴
- 2.3 Shape 形状
- 3、Pytorch 中 torch.Tensor 的三个属性
- 3.1 torch.dtype
- 3.2 torch.device
- 3.3 torch.layout
- 4、创建张量的两种方法
- 4.1 从现有数据创建张量
- 4.2 凭空创建张量
- 5、改变张量
- 5.1 改变 dtype 和 device
- 5.1 改变 shape
1、tensor 是什么?
tensor 即张量,是一种数据结构,被广泛用于神经网络模型(编程)中,用来表示或者编码神经网络模型的输入、输出和模型参数等等。
- number(数字), array(数组), 2d-array(二维数组)
- scalar(标量), vector(向量), matrix(矩阵)
相信大家对上面两行名词都不会陌生,第一行的名词来源于计算机科学,第二行的名词则来源于数学,它们实际上是相同的概念:
获取一个元素所需要的索引数 | 计算机科学 | 数学 |
---|---|---|
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、tensor 的三个属性
2.1 Rank 秩
秩就是张量中存在的维度的数目,或者说从张量中获取一个元素所需要的索引数,例如矩阵、二维数组、二维张量,它们的秩都是 2
2.2 Axis(复数 为 Axes) 轴
轴就是张量中某一个特定的维度,一个秩等于 1 的张量有一个轴(Axis),一个秩等于 2 的张量有两个轴(Axes)等等。
每个轴的长度很重要,因为它可以告诉我们沿每个轴有多少索引可用,例如已知张量 t 的第一个轴长度为 3,我们就只能索引到 t[0] t[1] t[2]
,大于 2 就越界了。
2.3 Shape 形状
张量的秩告诉我们张量有多少个轴,张量的每个轴的长度告诉我们该轴有多少索引可用。于是,将它们结合起来,就是张量的形状,在 Pytorch 中使用
.shape
或 size()
方法即可得到一个张量的形状。
3、Pytorch 中 torch.Tensor 的三个属性
此节更详细的内容可以参考官方文档
3.1 torch.dtype
dtype 表示张量的数据类型,张量之间的张量运算必须发生在具有相同数据类型的张量之间,使用 .dtype
可知一个张量的数据类型:
张量之间的张量运算必须发生在具有相同数据类型的张量之间
3.2 torch.device
device 表示张量被分配到的设备(CPU 或者 GPU,又或者是哪一个 GPU),张量之间的张量运算必须发生在同一设备上存在的张量之间,使用 .device
可知一个张量被分配到的设备:
3.3 torch.layout
layout 表示张量在内存中的存储方式,也就是布局。分为 torch.strided(密集张量)和 torch.sparse_coo(稀疏 COO 张量)两种。常用的是 torch.strided,使用 stride()
方法即可获得张量的内存布局:
a 是两行三列的矩阵(二维张量),其布局为(3,1)表示在第一个维度(行)上,走 3 格可以得到下一个元素(下一行的元素),在第二个维度(列)上,走 1 格可以得到下一个元素(下一列的元素),以此类推。
4、创建张量的两种方法
4.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.Tensor() 是类 torch.Tensor 的构造函数,由于类 torch.Tensor 是类torch.FloatTensor 的别名,所以 torch.Tensor() = torch.FloatTensor(),因此 torch.Tensor() 的 dtype 一定是 32 位浮点数,无法指定;而 torch.tensor() 是所谓的工厂函数,它就可以指定 dtype、device 等属性
- torch.Tensor() 和 torch.tensor() 会复制输入数据(深拷贝),而torch.as_tensor() 和 torch.from_numpy() 会与输入对象共享内存(浅拷贝)
- torch.from_numpy() 只接受 Numpy 数组,而 torch.as_tensor() 接受各种类似数组的对象,包括其他 PyTorch 张量
- 因此首选 torch.tensor(),需要提高性能时再使用 torch.as_tensor()
4.2 凭空创建张量
凭空创建张量常用的有以下四种方法:
torch.eye()
单位矩阵(一定是矩阵,无法指定维度)torch.ones()
全 1 张量torch.zeros()
全 0 张量torch.rand()
随机张量
5、改变张量
5.1 改变 dtype 和 device
使用 .to()
方法即可,直接指定 dtype 和 device,如下:
5.1 改变 shape
方法比较多,看我的这篇博客即可。