Как преобразовать список тензоров разного размера в тензор сингла? - PullRequest
0 голосов
/ 03 апреля 2020

Я хочу преобразовать список тензоров с разными размерами в один тензор. Я пробовал torch.stack, но выдает ошибку.

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-237-76c3ff6f157f> in <module>
----> 1 torch.stack(t)

RuntimeError: invalid argument 0: Sizes of tensors must match except in dimension 0. Got 5 and 6 in dimension 1 at C:\w\1\s\tmp_conda_3.7_105232\conda\conda-bld\pytorch_1579085620499\work\aten\src\TH/generic/THTensor.cpp:612

мой список тензоров.

[tensor([-0.1873, -0.6180, -0.3918, -0.5849, -0.3607]),
 tensor([-0.6873, -0.3918, -0.5849, -0.9768, -0.7590, -0.6707]),
 tensor([-0.6686, -0.7022, -0.7436, -0.8231, -0.6348, -0.4040, -0.6074, -0.6921])]

Я также пробовал это по-другому, вместо тензоров я использовал списки из этих отдельных тензоров и попытался сделать из него тензор. Это также показало ошибку.

list: [[-0.18729999661445618, -0.6179999709129333, -0.3917999863624573, -0.5849000215530396, -0.36070001125335693], [-0.6873000264167786, -0.3917999863624573, -0.5849000215530396, -0.9768000245094299, -0.7590000033378601, -0.6707000136375427], [-0.6686000227928162, -0.7021999955177307, -0.7436000108718872, -0.8230999708175659, -0.6348000168800354, -0.40400001406669617, -0.6074000000953674, -0.6920999884605408]]

Ошибка:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-245-489aea87f307> in <module>
----> 1 torch.FloatTensor(t)

ValueError: expected sequence of length 5 at dim 1 (got 6)

Очевидно, он говорит, что ожидает одинаковую длину списков, если я не ошибаюсь.

Может кто-нибудь помочь здесь? Заранее спасибо.

С уважением, Prudhvinath Reddymalla

Оставайтесь в безопасности, оставайтесь дома.

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

Я согласен с @ helloswift123, вы не можете складывать тензоры различной длины.

Кроме того, ответ @ helloswift123 будет работать только тогда, когда общее количество элементов делится на желаемую форму. В этом случае общее количество элементов равно 19, и ни в коем случае оно не может быть преобразовано во что-то полезное, поскольку это простое число.

torch.cat(), как предлагается,

data = [torch.tensor([-0.1873, -0.6180, -0.3918, -0.5849, -0.3607]),
                torch.tensor([-0.6873, -0.3918, -0.5849, -0.9768, -0.7590, -0.6707]),
                torch.tensor([-0.6686, -0.7022, -0.7436, -0.8231, -0.6348, -0.4040, -0.6074, -0.6921])]
dataTensor = torch.cat(data)
dataTensor.numel()

Вывод:

tensor([-0.1873, -0.6180, -0.3918, -0.5849, -0.3607, -0.6873, -0.3918, -0.5849,
        -0.9768, -0.7590, -0.6707, -0.6686, -0.7022, -0.7436, -0.8231, -0.6348,
        -0.4040, -0.6074, -0.6921])
19 

Возможное решение:

Это также не идеальное решение, но может решить эту проблему.

# Have a list of tensors (which can be of different lengths) 
data = [torch.tensor([-0.1873, -0.6180, -0.3918, -0.5849, -0.3607]),
        torch.tensor([-0.6873, -0.3918, -0.5849, -0.9768, -0.7590, -0.6707]),
        torch.tensor([-0.6686, -0.7022, -0.7436, -0.8231, -0.6348, -0.4040, -0.6074, -0.6921])]

# Determine maximum length
max_len = max([x.squeeze().numel() for x in data])

# pad all tensors to have same length
data = [torch.nn.functional.pad(x, pad=(0, max_len - x.numel()), mode='constant', value=0) for x in data]

# stack them
data = torch.stack(data)

print(data)
print(data.shape)

Вывод:

tensor([[-0.1873, -0.6180, -0.3918, -0.5849, -0.3607,  0.0000,  0.0000,  0.0000],
        [-0.6873, -0.3918, -0.5849, -0.9768, -0.7590, -0.6707,  0.0000,  0.0000],
        [-0.6686, -0.7022, -0.7436, -0.8231, -0.6348, -0.4040, -0.6074, -0.6921]])
torch.Size([3, 8])

Это добавит нули к концу любого тензора с меньшим количеством элементов, и в этом случае вы можете использовать torch.stack() как обычно.

Надеюсь, это поможет!

0 голосов
/ 03 апреля 2020

try:

>>>data = [tensor([-0.1873, -0.6180, -0.3918, -0.5849, -0.3607]),tensor([-0.6873, -0.3918, 
-0.5849, -0.9768, -0.7590, -0.6707]),tensor([-0.6686, -0.7022, -0.7436, -0.8231, 
-0.6348, -0.4040, -0.6074, -0.6921])]

>>>dataTensor = torch.cat(data).reshape(x,y)  #x*y = data.numel()

>>>print(type(dataTensor))
<class 'torch.Tensor'>

torch.stack объединяет последовательность тензоров с одинакового размера .

torch.cat объединяет последовательность тензоров,

Все тензоры должны иметь одинаковую форму (, за исключением сцепленного размера )

Надеюсь, это полезно для вас.

...