我有几个视频,我把它们一帧一帧地加载到一个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),所以这只是一个例子。
你可以使用 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])