torch.Tensor
一个torch.Tensor
是一个多维矩阵,包含同一数据类型的所有元素。
数据类型
Torch 使用以下数据类型来定义张量:
数据类型 |
数据类型(dtype) |
---|---|
32位浮点数 |
|
64位浮点数 |
|
16位浮点数 1 |
|
16位浮点数 2 |
|
32位复杂数 |
|
64位复杂数 |
|
128位复数 |
|
8位无符号整数 |
|
16位无符号整数 |
|
32位无符号整数 |
|
64位无符号整数 |
|
8位有符号整数 |
|
16位带符号的整数 |
|
32位 signed 整数 |
|
64位带符号的整数 |
|
布尔类型 |
|
8位无符号整数的量化值 |
|
8位有符号整数的量化值 |
|
32位有符号的量化整数 |
|
4位无符号量化整数3 |
|
8位浮点数(e4m3)5 |
|
8位浮点数(e5m2)5 |
|
- 1
-
有时也称为 binary16:它使用 1 位符号、5 位指数和 10 位尾数。这种格式在需要高精度但可以接受较小数值范围的情况下非常有用。
- 2
-
有时也称为大脑浮点数:它使用1位符号位、8位指数位和7位有效数字位。当范围很重要时,这种格式非常有用,因为它与
float32
具有相同的指数位数量。 - 3
-
量化后的4位整数以8位有符号整数的形式存储。目前仅支持于EmbeddingBag操作符中。
- 4(1,2,3)
-
除了
uint8
之外的无符号类型目前仅在即时模式下提供有限支持(主要用于与torch.compile
一起使用);如果你需要即时模式支持且不需要额外的取值范围,建议使用相应的有符号类型。更多详情请参见https://github.com/pytorch/pytorch/issues/58734。 - 5(1,2)
-
torch.float8_e4m3fn
和torch.float8_e5m2
实现了来自 https://arxiv.org/abs/2209.05433 的 8 位浮点类型规范。操作支持非常有限。
为了保持向下兼容性,我们支持这些数据类型的以下替代类名:
数据类型 |
CPU张量 |
GPU张量 |
---|---|---|
32位浮点数 |
|
|
64位浮点数 |
|
|
16位浮点数 |
|
|
16位浮点数 |
|
|
8位无符号整数 |
|
|
8位有符号整数 |
|
|
16位带符号的整数 |
|
|
32位 signed 整数 |
|
|
64位带符号的整数 |
|
|
布尔类型 |
|
|
为了构建张量,我们建议使用工厂函数(如torch.empty()
),并传入dtype
参数。此外,torch.Tensor
构造函数是默认张量类型(torch.FloatTensor
)的别名。
初始化与基本操作
可以使用torch.tensor()
构造函数从Python 列表或序列中构建张量。
>>> torch.tensor([[1., -1.], [1., -1.]]) tensor([[ 1.0000, -1.0000], [ 1.0000, -1.0000]]) >>> torch.tensor(np.array([[1, 2, 3], [4, 5, 6]])) tensor([[ 1, 2, 3], [ 4, 5, 6]])
警告
torch.tensor()
总是复制 data
。如果你有一个 Tensor data
,并且只想改变其 requires_grad
标志,可以使用 requires_grad_()
或者 detach()
来避免复制。如果你有一个 numpy 数组,并且想要避免复制,可以使用 torch.as_tensor()
。
可以通过向构造函数或张量创建操作符传递torch.dtype
和/或 torch.device
来构建具有特定数据类型的张量:
>>> torch.zeros([2, 4], dtype=torch.int32) tensor([[ 0, 0, 0, 0], [ 0, 0, 0, 0]], dtype=torch.int32) >>> cuda0 = torch.device('cuda:0') >>> torch.ones([2, 4], dtype=torch.float64, device=cuda0) tensor([[ 1.0000, 1.0000, 1.0000, 1.0000], [ 1.0000, 1.0000, 1.0000, 1.0000]], dtype=torch.float64, device='cuda:0')
关于如何构建张量的更多内容,请参见创建操作
可以使用Python的索引和切片符号来访问和修改张量的内容。
>>> x = torch.tensor([[1, 2, 3], [4, 5, 6]]) >>> print(x[1][2]) tensor(6) >>> x[0][1] = 8 >>> print(x) tensor([[ 1, 8, 3], [ 4, 5, 6]])
使用torch.Tensor.item()
从只包含单个值的张量中获取一个Python数字:
>>> x = torch.tensor([[1]]) >>> x tensor([[ 1]]) >>> x.item() 1 >>> x = torch.tensor(2.5) >>> x tensor(2.5000) >>> x.item() 2.5
关于索引的更多内容,请参见索引、切片、连接和变异操作
可以通过将 requires_grad=True
设置为创建一个张量,从而使torch.autograd
记录对其执行的操作以进行自动微分。
>>> x = torch.tensor([[1., -1.], [1., 1.]], requires_grad=True) >>> out = x.pow(2).sum() >>> out.backward() >>> x.grad tensor([[ 2.0000, -2.0000], [ 2.0000, 2.0000]])
每个张量都有一个关联的 torch.Storage
来存储其数据。 张量类还提供了对存储的多维、带步长视图,并在此基础上定义了数值运算。
注意
关于张量视图的更多内容,请参见张量视图。
注意
有关 torch.dtype
、torch.device
和 torch.layout
属性的更多信息,请参见张量属性。
注意
修改张 tensor 的方法都会在名称后面加上下划线后缀。例如,torch.FloatTensor.abs_()
会就地计算绝对值并返回修改后的 tensor,而 torch.FloatTensor.abs()
则会在新的 tensor 中返回结果。
注意
要更改现有张量的 torch.device
和/或 torch.dtype
,请考虑使用张量的 to()
方法。
警告
当前 torch.Tensor
的实现引入了内存开销,在使用许多小张量的应用中可能会导致意外的高内存 usage。如果你遇到这种情况,可以考虑使用一个大的结构体。
张量类参考
- 类torch.Tensor
-
根据不同的使用场景,有几种主要的方式可以创建张量。
-
要使用现有数据创建张量,请使用
torch.tensor()
。 -
要创建具有特定大小的张量,请使用
torch.*
张量创建操作(参见创建操作)。 -
要创建一个与另一个张量大小相同(类型相似)的张量,请使用
torch.*_like
张量创建操作(参见创建操作)。 -
要创建一个与另一张量类型相同但尺寸不同的张量,请使用
tensor.new_*
创建操作。 -
有一个已不再推荐使用的构造函数
torch.Tensor
。建议使用torch.tensor()
替代。
-
- Tensor.__init__(self, data)
-
此构造函数已被弃用,建议使用
torch.tensor()
代替。其行为取决于data
的类型。-
如果
data
是一个张量,返回该张量的别名。与torch.tensor()
不同,这个函数会跟踪自动微分,并将梯度传播回原始张量。device
参数不适用于此data
类型。 -
如果
data
是一个序列或嵌套序列,则创建一个默认数据类型(通常是torch.float32
)的张量,其值为序列中的数据,并在必要时进行类型转换。值得注意的是,这与torch.tensor()
不同,即使输入全部是整数,此构造函数也会始终创建一个浮点型张量。 -
如果
data
是一个torch.Size
,则返回相应大小的空张量。
此构造函数不支持显式指定返回张量的
dtype
或device
。我们建议使用torch.tensor()
,它提供了这些功能。- 参数:
-
data (array_like): 构造张量所使用的数据。
- 关键字参数:
-
-
设备 (
torch.device
, 可选): 指定返回张量所使用的设备。 -
默认:如果为 None,则使用与该张量相同的
torch.device
。
-
设备 (
-
- 张量T
-
返回该张量维度反转后的视图。
如果
n
是x
的维度数量,那么x.T
等同于x.permute(n-1, n-2, ..., 0)
。警告
在二维张量之外的其他维度上使用
Tensor.T()
来反转形状是不推荐的,并且在未来版本中会抛出错误。建议使用mT
来转置矩阵批次,或者使用 x.permute(*torch.arange(x.ndim - 1, -1, -1)) 来反转张量的维度。
- 张量 H
-
返回矩阵(二维张量)共轭转置后的视图。
x.H
等同于复数矩阵的x.transpose(0, 1).conj()
,对于实数矩阵则等同于x.transpose(0, 1)
。参见
mH
: 一个也可以应用于矩阵批次的属性。
- 张量mT
-
返回此张量的视图,将最后两个维度进行转置。
x.mT
等同于x.transpose(-2, -1)
。
- 张量。mH
-
访问此属性等同于调用
adjoint()
。
返回一个新的 Tensor,其中 |
|
返回一个大小为 |
|
返回一个大小为 |
|
返回一个大小为 |
|
返回一个大小为 |
|
如果张量存储在 GPU 上,则值为 |
|
如果是量化张量,则为 |
|
如果是元张量,则该值为 |
|
这个张量所在的位置由 |
|
此属性默认为 |
|
“dim()”的别名 |
|
返回一个新的张量,包含输入张量 |
|
返回一个新张量,其中包含 |
|
如果张量不采用稀疏存储布局,则返回表示张量元素“视图”的字节数。 |
|
别名 for |
|
参见 |
|
|
|
别名 для 别名 for |
|
这是 |
|
参见 |
|
|
|
|
|
将一个标量或张量添加到 |
|
|
|
|
|
就地版本的 |
|
|
|
就地版本的 |
|
就地版本的 |
|
参见 |
|
|
|
参见 |
|
参见 |
|
参见 |
|
对张量中的每个元素应用函数 |
|
参见 |
|
|
|
|
|
参见 |
|
|
|
|
|
|
|
atan2_(other) 返回 Tensor |
|
参见 |
|
参见 |
|
计算当前张量相对于图中叶子节点的梯度。 |
|
|
|
返回一个结果张量,其中每个$\texttt{result[i]}$独立地从$\text{Bernoulli}(\texttt{self[i]})$分布中抽取样本。 |
|
将 |
|
|
|
|
|
|
|
|
|
|
|
原地版的 |
|
|
|
参见 |
|
|
|
|
|
使用从柯西分布中抽取的数字来填充张量。 |
|
参见 |
|
|
|
|
|
|
|
别名 для |
|
别名为 |
|
返回一个与 |
|
将 |
|
参见 |
|
|
|
在原地操作的 |
|
参见 |
|
|
|
参见 |
|
|
|
参见 |
|
|
|
acosh() 返回 Tensor |
|
acosh_() 返回 Tensor |
|
返回该对象在CPU内存中的副本。 |
|
返回该对象在CUDA内存中的副本。 |
|
|
|
|
|
|
|
|
|
|
|
返回 |
|
给定一个量化张量,进行去量化处理,并返回去量化后的浮点张量。 |
|
参见 |
|
返回稀疏张量 |
|
返回一个新的与当前图分离的张量。 |
|
将张量从创建它的图中分离出来,使其成为独立的叶子节点。 |
|
参见 |
|
填写一个至少二维的张量的主要对角线。 |
|
参见 |
|
参见 |
|
|
|
返回 |
|
返回一个描述 |
|
参见 |
|
参见 |
|
就地版的 |
|
|
|
参见 |
|
|
|
返回单个元素的字节大小。 |
|
参见 |
|
|
|
参见 |
|
|
|
参见 |
|
|
|
|
|
参见 |
|
|
|
|
|
返回一个新的视图,将 |
|
将此张量扩展为与 |
|
使用从概率密度函数(PDF)中抽取的元素来填充 |
|
参见 |
|
|
|
将 |
|
参见 |
|
|
|
|
|
|
|
|
|
参见 |
|
就地版本的 |
|
参见 |
|
就地版本的 |
|
参见 |
|
|
|
参见 |
|
就地版本的 |
|
|
|
使用从几何分布中抽取的元素填充 |
|
参见 |
|
对于 CUDA 张量,此函数返回张量所在 GPU 的设备编号。
|
|
参见 |
|
就地版本的 |
|
参见 |
|
就地版本的 |
|
|
|
|
|
参见 |
|
|
|
|
|
|
|
将 |
|
与 |
|
按照 |
|
|
|
根据 |
|
|
|
使用 |
|
|
|
按照 |
|
返回稀疏COO张量的索引张量。 |
|
参见 |
|
|
|
对于一个给定的量化张量, |
|
如果 |
|
如果 |
|
如果 |
|
如果 |
|
参见 |
|
所有 |
|
如果该张量位于固定内存中,返回 true。 |
|
如果两个张量指向同一块内存(具有相同的存储、偏移量、大小和步长),则返回 True。 |
|
判断张量是否位于共享内存中。 |
|
如果 |
|
如果张量采用稀疏COO存储布局,则值为 |
|
返回此张量的标准Python数值。 |
|
参见 |
|
|
|
就地版的 |
|
参见 |
|
就地版的 |
|
就地版本的 |
|
参见 |
|
|
|
|
|
参见 |
|
原地版的 |
|
原地版的 |
|
原地版的 |
|
参见 |
|
|
|
使用给定均值$\mu$和标准差$\sigma$参数化的对数正态分布的样本,填充 |
|
原地版的 |
|
原地版的 |
|
原地版的 |
|
|
|
|
|
|
|
参见 |
|
就地版本的 |
|
lt(other) → Tensor |
|
就地版本的 |
|
参见 |
|
创建一个与 |
|
对 |
|
将 |
|
将 |
|
注意 |
|
参见 |
|
参见 |
|
定义了在调用 |
|
参见 |
|
参见 |
|
参见 |
|
参见 |
|
参见 |
|
|
|
参见 |
|
就地版本的 |
|
|
|
参见 |
|
“dim()”的别名 |
|
就地版本的 |
|
参见 |
|
就地版本的 |
|
就地版本的 |
|
参见 |
|
|
|
|
|
别名: |
|
就地版的 |
|
参见 |
|
以 NumPy |
|
参见 |
|
将张量复制到固定内存中,除非它已经在那里了。 |
|
原地版的 |
|
参见 |
|
|
|
参见 |
|
将 |
|
参见 |
|
返回指定 QTensor 的量化方案。 |
|
对于经过线性(仿射)量化处理的张量,返回其量化器的缩放因子。 |
|
对于经过线性(仿射)量化处理的张量,返回其量化器的零点。 |
|
对于经过线性(仿射)通道量化处理的张量,返回其量化器的比例因子张量。 |
|
给定一个经过线性(仿射)通道量化处理的张量,返回其量化器的零点张量。 |
|
对于经过线性(仿射)通道量化处理的张量,返回该通道量化所应用的维度索引。 |
|
用从离散均匀分布 |
|
|
|
标记该张量已被此流使用。 |
|
注册一个后向钩子。 |
|
注册一个在梯度累积之后运行的反向钩子。 |
|
|
|
|
|
沿着指定的维度重复这个张量。 |
|
如果需要为该张量计算梯度,则值为 |
|
更改是否记录此张量上的自动求导操作:就地修改此张量的 |
|
返回一个与 |
|
返回一个与 |
|
将 |
|
将 |
|
在此张量上调用 |
|
如果此张量是非叶子张量,并且其 |
|
参见 |
|
|
|
就地版的 |
|
独立版本的 |
|
将张量 |
|
以与 |
|
使用通过 |
|
|
|
设置底层存储、大小和步长。 |
|
将底层存储移到共享内存。 |
|
|
|
|
|
参见 |
|
就地版的 |
|
参见 |
|
|
|
参见 |
|
|
|
参见 |
|
|
|
参见 |
|
|
|
|
|
|
|
返回 |
|
返回 |
|
参见 |
|
返回一个新的稀疏张量,该张量的值来自步进张量 |
|
返回 |
|
参见 |
|
|
|
|
|
|
|
参见 |
|
参见 |
|
返回底层的 |
|
返回底层的 |
|
返回 |
|
返回存储类型的值。 |
|
返回 |
|
参见 |
|
|
|
参见 |
|
就地版本的 |
|
参见 |
|
将 |
|
参见 |
|
参见 |
|
|
|
参见 |
|
进行张量的数据类型和/或设备转换。 |
|
返回一个布局为 |
|
参见 |
|
参见 |
|
|
|
参见 |
|
|
|
|
|
|
|
将张量以(嵌套的)列表形式返回。 |
|
参见 |
|
如果 |
|
返回张量的稀疏版本。 |
|
将张量转换为压缩稀疏行(CSR)格式。 |
|
将张量转换为压缩列存储(CSC)格式。 |
|
将张量转换为给定块大小的块稀疏行(BSR)存储格式。 |
|
将张量转换为给定块大小的块稀疏列(BSC)存储格式。 |
|
就地版的 |
|
参见 |
|
就地版本的 |
|
参见 |
|
|
|
|
|
|
|
如果没有提供dtype,则返回类型;否则,将此对象转换为指定的类型。 |
|
将此张量转换为指定类型并返回。 |
|
返回原始张量的一个视图,包含从 |
|
使用从连续均匀分布中抽取的数字来填充 |
|
返回输入张量中的唯一元素。 |
|
删除每组连续相同元素中的除第一个以外的所有元素。 |
|
与 |
|
返回稀疏COO张量的值张量。 |
|
参见 |
|
参见 |
|
返回一个新的张量,该张量的数据与 |
|
将此张量视作与 |
|
|
|
|
|
返回该对象在XPU内存中的副本。 |
|
将 |