【问题标题】:How can I get a view of input as a complex tensor? RuntimeError: Tensor must have a last dimension with stride 1如何将输入视为复杂张量? RuntimeError:张量必须具有步幅为 1 的最后一个维度
【发布时间】:2020-09-11 18:12:50
【问题描述】:

我在 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 相同的不同订单进行重塑? 或任何其他方式转换为复杂?

【问题讨论】:

  • 欢迎来到 Stack Overflow!

标签: python pytorch complex-numbers stride


【解决方案1】:

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

【讨论】:

  • 非常感谢,吉尔。你帮了很多忙。
  • 我的荣幸,拉齐 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-15
  • 2019-12-19
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 2019-11-09
相关资源
最近更新 更多