pytorch 支持复数吗?

最小(非)工作示例


kernel = Conv2d(in_channels=1, out_channels=1, kernel_size=(3, 2))
data = torch.rand(1, 1, 100, 100).type(torch.complex64)
kernel(data)

对于 64 位和 128 位复数产生 RuntimeError: "unfolded2d_copy" not implemented for 'ComplexDouble' ,而对于 32 位,我得到 RuntimeError: "copy_" not implemented for 'ComplexHalf'

我错过了什么,还是 pytorch 缺少对复数的支持?

注意:我在 macbook 上,仅使用 cpu。

stack overflow does pytorch support complex numbers?
原文答案
author avatar

接受的答案

目前(@最新的稳定版本 - 1.9.0)Pytorch 缺少对复杂张量上的此类操作的支持(这是一个测试版功能)。在 Native implementation of convolution for complex numbers 查看此功能请求

分别在真实和图像上拆分成卷积,虽然不理想,但目前是可行的方法。


答案:

作者头像

Pytorch 越来越多地增加对复数的支持。一些文档 here

  • v1.6 (2020 年 7 月 28 日)以来,pytorch 现在支持复向量和复梯度作为 BETA(我认为自 v1.9 以来不再作为 BETA)。
  • v1.12 (2022 年 6 月 28 日)以来,在 PyTorch 中添加了对 Complex32 和 Complex Convolutions 的支持(也作为 BETA)。

PyTorch 现在原生支持复数、复数自动求导、复数模块和大量复杂运算,包括线性代数和快速傅立叶变换 (FFT) 运算符。包括 torchaudio 和 ESPNet 在内的许多库已经在 PyTorch 中使用了复数,而 PyTorch 1.12 进一步扩展了复数功能,包括复数卷积和支持半精度 FFT 运算的实验性 complex32(“复数一半”)数据类型。由于 CUDA 11.3 包中的错误,如果您使用复数,我们建议使用 wheels 中的 CUDA 11.6 包。


确实存在用于实施复值神经网络 (CVNN) 的第三方库:

如果你想使用 Pytorch,我相信最好的库是 ComplexPytorch

如果您更喜欢 Tensorflow,让我向您推荐我自己的 library ,它使用 Tensorflow 作为后端,并且我模拟(或至少尝试模拟)TensorFlow API 和 UX。我也在图书馆做了很多 documentation

最后,我会推荐这个 paper ,代码使用不再维护的Theano,但它有很多关于如何实现CVNN的理论所以