How can I get a view of input as a complex tensor? RuntimeError: Tensor must have a last dimension with stride 1

How can I get a view of input as a complex tensor? RuntimeError: Tensor must have a last dimension with stride 1

我在 pytorch 中有一个包含 64 个元素的张量,我想将它转换为一个包含 32 个元素的复杂张量。顺序对我来说很重要,一切都应该在 PyTorch 中,这样我就可以在我的自定义损失函数中使用它: 主张量 (W) 的前半部分是实数,后半部分是虚数。所以我的最终张量应该是这样的:

W_final = 张量(W[0]+jW[32], W[1]+jW[33], W[2]+jW[34], W[3]+jW[ 35], ... , W[31]+jW[63])

我试过这种方法:

import torch
W_1 = = torch.reshape(W,(2,32)) #reshape W with shape (64) to W_1 with shape (2,32) 
W_2 = torch.transpose(W_1,0,1) #transpose W_1 to W_2 with shape (32,2), so I can use view_as_complex
W_final = torch.view_as_complex(W_2)

问题是使用转置,步幅也会改变,我得到这个错误: RuntimeError: Tensor must have a last dimension with stride 1

知道我该如何应对 stride 吗?或者有没有办法用与 numpy 相同的不同顺序重塑? 或任何其他转换为复数的方法?

它与重塑后 W_2 的非连续内存分配有关。 要处理此错误,您应该在 W_2 上调用 .contiguous()。 来自 Pytorch 文档: " 步幅是一个整数列表:k-th 步幅表示在张量的 k-th 维度中从一个元素跳到下一个元素所需的内存跳跃。这个概念使得执行许多张量运算非常有效。” 调用 contiguous 后,返回的张量的所有维度都将步幅为 1。

这是一个有效的示例代码:

import torch
W = torch.randn(64)
W_2 = W.view(-1,32).permute(1,0).contiguous()
W_final = torch.view_as_complex(W_2)

首先调用view将张量整形为(2,32),然后置换维度以转置结果并调用contiguous