Shortcuts

复数

复数是可以表示为 a+bja + bj 形式的数,其中 a 和 b 是实数, 而 j 被称为虚数单位,它满足方程 j2=1j^2 = -1。复数在数学和 工程中经常出现,特别是在信号处理等主题中。传统上,许多用户和库(例如,TorchAudio)通过将数据表示为形状为 (...,2)(..., 2) 的浮点张量来处理复数,其中最后一个 维度包含实部和虚部。

在处理复数时,复数数据类型的张量提供了更自然的用户体验。复数张量的操作(例如,torch.mv()torch.matmul())可能比模仿它们的浮点张量操作更快且更节省内存。PyTorch中涉及复数的操作经过优化,以使用向量化汇编指令和专用内核(例如,LAPACK,cuBlas)。

注意

torch.fft 模块中的光谱操作支持原生复数张量。

警告

复杂张量是一个测试版功能,可能会发生变化。

创建复杂张量

我们支持两种复数数据类型:torch.cfloattorch.cdouble

>>> x = torch.randn(2,2, dtype=torch.cfloat)
>>> x
张量([[-0.4621-0.0303j, -0.2438-0.5874j],
     [ 0.7706+0.1421j,  1.2110+0.1918j]])

注意

复数张量的默认数据类型由默认的浮点数据类型决定。 如果默认的浮点数据类型是torch.float64,那么复数将被推断为torch.complex128的数据类型,否则它们将被假定为torch.complex64的数据类型。

除了 torch.linspace()torch.logspace()torch.arange() 之外的所有工厂函数都支持复数张量。

从旧表示的过渡

目前使用形状为 (...,2)(..., 2) 的实张量来绕过缺少复杂张量的用户,可以轻松地在他们的代码中使用复杂张量,使用 torch.view_as_complex()torch.view_as_real()。请注意,这些函数不会执行任何复制操作,并返回输入张量的视图。

>>> x = torch.randn(3, 2)
>>> x
张量([[ 0.6125, -0.1681],
     [-0.3773,  1.3487],
     [-0.0861, -0.7981]])
>>> y = torch.view_as_complex(x)
>>> y
张量([ 0.6125-0.1681j, -0.3773+1.3487j, -0.0861-0.7981j])
>>> torch.view_as_real(y)
张量([[ 0.6125, -0.1681],
     [-0.3773,  1.3487],
     [-0.0861, -0.7981]])

访问实部和虚部

复数张量的实部和虚部可以通过 realimag 访问。

注意

访问realimag属性不会分配任何内存,并且在realimag张量上的就地更新将更新原始复数张量。此外,返回的realimag张量不是连续的。

>>> y.real
张量([ 0.6125, -0.3773, -0.0861])
>>> y.imag
张量([-0.1681,  1.3487, -0.7981])

>>> y.real.mul_(2)
张量([ 1.2250, -0.7546, -0.1722])
>>> y
张量([ 1.2250-0.1681j, -0.7546+1.3487j, -0.1722-0.7981j])
>>> y.real.stride()
(2,)

角度和绝对值

可以使用 torch.angle()torch.abs() 计算复数张量的角度和绝对值。

>>> x1=torch.tensor([3j, 4+4j])
>>> x1.abs()
张量([3.0000, 5.6569])
>>> x1.angle()
张量([1.5708, 0.7854])

线性代数

许多线性代数操作,如 torch.matmul()torch.linalg.svd()torch.linalg.solve() 等,都支持复数。 如果您想请求我们目前不支持的操作,请先 搜索 是否已有相关问题,如果没有,请 提交一个

序列化

复数张量可以被序列化,允许数据以复数值的形式保存。

>>> torch.save(y, 'complex_tensor.pt')
>>> torch.load('complex_tensor.pt')
张量([ 0.6125-0.1681j, -0.3773+1.3487j, -0.0861-0.7981j])

自动微分

PyTorch 支持对复数张量的自动求导。计算的梯度是共轭 Wirtinger 导数,其负值正是梯度下降算法中使用的最速下降方向。因此,所有现有的优化器都可以直接与复数参数一起使用。更多详情,请查看注释 复数的自动求导

我们不完全支持以下子系统:

  • 量化

  • 即时编译

  • 稀疏张量

  • 分布式

如果这些对你的用例有帮助,请搜索 是否已经提交了问题,如果没有,请提交一个

优云智算