преобразование списка тензоров в тензоры pytorch - PullRequest
0 голосов
/ 07 марта 2019

У меня есть список тензоров, каждый тензор имеет разные размеры, как я могу преобразовать этот список тензоров в тензор, используя pytroch

для получения дополнительной информации мой список содержит тензоры, каждый из которых имеет разный размер например, первый размер тензора - torch.Size ([76080, 38])

форма других тензоров будет отличаться во втором элементе, например, вторым тензором в списке является torch.Size ([76080, 36])

когда я использую torch.tensor (х) Я получаю ошибку ValueError: в скаляры Python могут быть преобразованы только тензоры одного элемента

Ответы [ 2 ]

1 голос
/ 08 марта 2019

Tensor в pytorch отличается от List в python, который может содержать объекты переменной длины.

В 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.

0 голосов
/ 08 марта 2019

тензоры не могут содержать данные переменной длины.вы, возможно, ищете cat

, например, здесь у нас есть список с двумя тензорами, которые имеют разные размеры (в их последнем dim (dim = 2)), и мы хотим создатьбольший тензор, состоящий из них обоих, поэтому мы можем использовать cat и создать больший тензор, содержащий оба их данных.

также обратите внимание, что вы не можете использовать 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])

edit: в данном конкретном случае вы можете использовать torch.cat([x.float() for x in sequence], dim=1).half()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...