当前位置:   article > 正文

由浅入深,带你搞懂 Pytorch 中的张量 tensor 是什么_tensor在pytorch的定义

tensor在pytorch的定义

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 维张量):

获取一个元素所需要的索引数计算机科学数学
nn 维数组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 中使用
.shapesize() 方法即可得到一个张量的形状。

在这里插入图片描述

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

方法比较多,看我的这篇博客即可。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/95273
推荐阅读
相关标签
  

闽ICP备14008679号