繁体   English   中英

将张量列表转换为张量pytorch

[英]converting list of tensors to tensors pytorch

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

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

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

当我使用torch.tensor(x)时出现错误ValueError:只能将一个元素张量转换为Python标量

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

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

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

还请注意,截至目前 ,您不能在cpu上使用带有半张量的cat,因此您应该将它们转换为float,进行串联,然后再转换回一半

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()

暂无
暂无

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

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