【问题标题】:converting list of tensors to tensors pytorch将张量列表转换为张量 pytorch
【发布时间】:2019-07-29 17:57:45
【问题描述】:

我有张量列表,每个张量都有不同的大小如何使用 pytroch 将此张量列表转换为张量

有关更多信息,我的列表包含张量,每个张量都有不同的大小 例如第一个张量大小是 torch.Size([76080, 38])

其他张量的形状在第二个元素中会有所不同,例如列表中的第二个张量是 torch.Size([76080, 36])

当我使用 火炬.张量(x) 我收到一个错误 ValueError: 只有一个元素张量可以转换为 Python 标量

【问题讨论】:

  • 请提供更多代码。
  • 特征项:x.append(torch.tensor((item)))
  • 这给了我一个张量列表,但是每个张量都有不同的大小,所以当我尝试 torch.stack(x) 它给了我同样的错误@FábioPerez
  • 您的问题需要更详细...这些数据来自哪里,如果来自图像,只需将所有图像调整为相同形状,然后再转换为手电筒类型。如果您在处理数据时更详细地解释它,那么这里的任何人都会更容易帮助.. 至少我们可以提供处理数据的策略建议
  • 在尝试torch.tensor(torch.split(sometuple)) 时遇到了这个问题。同样适用...可变长度不起作用。

标签: python pytorch


【解决方案1】:

张量不能保存可变长度的数据。你可能正在寻找cat

例如,这里我们有一个列表,其中包含两个具有不同大小的张量(在它们的最后一个 dim(dim=2) 中),我们想要创建一个由它们组成的更大的张量,因此我们可以使用 cat 并创建一个更大的张量,包含他们的两个数据。

还请注意,从 right now 开始,您不能在 cpu 上使用 cat 和半张量,因此您应该将它们转换为浮点数,进行连接,然后再转换回半张量

import torch

a = torch.arange(8).reshape(2, 2, 2)
b = torch.arange(12).reshape(2, 2, 3)
my_list = [a, b]
my_tensor = torch.cat([a, b], dim=2)
print(my_tensor.shape) #torch.Size([2, 2, 5])

你还没有解释你的目标,所以另一个选择是像这样使用pad_sequence

from torch.nn.utils.rnn import pad_sequence
a = torch.ones(25, 300)
b = torch.ones(22, 300)
c = torch.ones(15, 300)
pad_sequence([a, b, c]).size() #torch.Size([25, 3, 300])

编辑:在这种特殊情况下,您可以使用torch.cat([x.float() for x in sequence], dim=1).half()

【讨论】:

  • 嘿 Separius 感谢您的回答,但您能解释一下什么是 dim 以及我应该如何设置它?
  • 我还有一个按降序排列的张量列表,第一个张量的形状是 torch.Size([76080, 38])
  • 其他张量的形状在第二个元素中会有所不同,例如列表中的第二个张量是 torch.Size([76080, 36])
  • 当我移除暗淡时,我得到这个错误 RuntimeError: _th_cat is not implemented for type torch.HalfTensor
  • 我尝试使用填充序列,但它给了我这个错误 TypeError: _pack_padded_sequence(): argument 'input' (position 1) must be Tensor, not list
【解决方案2】:

pytorch 中的Tensor 与python 中的List 不同,后者可以保存可变长度的对象。

在pytorch中,可以将一个固定长度的数组传递给Tensor:

>>> torch.Tensor([[1, 2], [3, 4]])
>>> tensor([[1., 2.],
            [3., 4.]])

而不是:

>>> torch.Tensor([[1, 2], [3, 4, 5]])
>>> 
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-16-809c707011cc> in <module>
----> 1 torch.Tensor([[1, 2], [3, 4, 5]])

ValueError: expected sequence of length 2 at dim 1 (got 3)

torch.stack一样。

【讨论】:

  • 嗨,cloudyy,感谢您的回答,这很有帮助....
  • 不确定这是否有用,但这是 pytorch 论坛的解决方案:discuss.pytorch.org/t/…
猜你喜欢
  • 2020-08-05
  • 2022-10-17
  • 2019-05-23
  • 2022-01-10
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多