当内部数组的大小不同时,将np数组转换为炬张量。

问题描述 投票:0回答:1

我有几个视频,我把它们一帧一帧地加载到一个numpy数组中。例如,如果我有8个视频,它们会被转换为一个8维的numpy数组,其中每个内部数组的维度根据单个视频的帧数而不同。当我打印

array.shape

我的输出是(8,)

现在我想为这些数据创建一个dataloader,为此我想把这个numpy数组转换为torch tensor。然而当我尝试使用 torch.from_numpy 甚至干脆 torch.tensor 函数,我得到的错误是

TypeError: can't convert np.ndarray of type numpy.object_. The only supported types are: float64, float32, float16, int64, int32, int16, int8, uint8, and bool.

我认为这是因为我的内部数组大小不同。一个可能的解决方案是人为地给我的视频添加一个维度,使它们大小相同,然后使用 np.stack 但这可能会导致以后可能出现的问题。有什么更好的解决办法吗?

编辑:其实添加维度是不行的,因为np.stack要求所有的维度都是一样的。

编辑:Sample Array会是这样的。

[ [1,2,3], [1,2], [1,2,3,4] ]

这是以一个(3,)形的np数组来存储的. 真正的数组实际上是4维的( Frames x Height x Width x Channels),所以这只是一个例子。

python arrays numpy pytorch tensor
1个回答
1
投票

你可以使用 rnn 利用函数 pad_sequence 使其大小相同。

ary
array([list([1, 2, 3]), list([1, 2]), list([1, 2, 3, 4])], dtype=object)

from torch.nn.utils.rnn import pad_sequence
t = pad_sequence([torch.tensor(x) for x in ary], batch_first=True)

t
tensor([[1, 2, 3, 0],
        [1, 2, 0, 0],
        [1, 2, 3, 4]])
t.shape
torch.Size([3, 4])
© www.soinside.com 2019 - 2024. All rights reserved.