繁体   English   中英

如何将输入视为复张量? 运行时错误:张量必须具有步长为 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

知道我该如何处理步幅吗? 或者有什么方法可以用与numpy相同的不同顺序来重塑? 或任何其他方式转换为复杂?

它与重塑后 W_2 的非连续内存分配有关。 要处理此错误,您应该在 W_2 上调用 .contiguous .contiguous() 来自 Pytorch Docs:“步幅是一个整数列表:第 k 步幅表示从张量的第 k 维中的一个元素到下一个元素所需的内存跳跃。这个概念使得执行许多张量操作有效。” 一旦你调用contiguous ,返回的张量的所有维度都将有 stride 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM