Создание тензора факела из генератора - PullRequest
6 голосов
/ 22 марта 2019

Я пытаюсь построить тензор из генератора следующим образом:

>>> torch.tensor(i**2 for i in range(10))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: Could not infer dtype of generator

В настоящее время я просто делаю:

>>> torch.tensor([i**2 for i in range(10)])
tensor([ 0,  1,  4,  9, 16, 25, 36, 49, 64, 81])

Есть ли способ избежать необходимости в этом промежуточном списке?

Ответы [ 2 ]

2 голосов
/ 22 марта 2019

Я не понимаю, почему вы хотите использовать генератор.Список на самом деле не имеет значения здесь.

Вопрос в следующем: хотите ли вы сначала создать данные в Python , а затем переместить в PyTorch (в большинстве случаев медленнее) или хотите ли вы создать его напрямую в PyTorch .
(генератор всегда сначала создает данные в Python)

Так что, если вы хотите загрузить данные , история другая, но если вы хотите сгенерировать данные Я не вижу причин, почему вы не должны делать это в PyTorch напрямую .


Если вы хотите напрямую создать свой список в PyTorch для своего примера, вы можете сделать это, используя arange и pow:

torch.arange(10).pow(2)

Вывод:

tensor([ 0,  1,  4,  9, 16, 25, 36, 49, 64, 81])

torch.arange(10) работает так же, как range в python, так что он точно такой же универсальный range.Тогда pow(2) просто переводит ваш тензор во 2-ю степень.

Но вы также можете выполнять все другие виды вычислений вместо pow, как только вы создали свой тензор, используя arange.

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

Как уже указывает @ blue-phoenox, предпочтительно использовать встроенные функции PyTorch для непосредственного создания тензора.Но если вам приходится иметь дело с генератором, целесообразно использовать numpy в качестве промежуточного этапа.Поскольку PyTorch избегает копирования массива numpy, он должен быть достаточно быстрым (по сравнению с простым пониманием списка)

>>> import torch
>>> import numpy as np
>>> torch.from_numpy(np.fromiter((i**2 for i in range(10)), int))
tensor([ 0,  1,  4,  9, 16, 25, 36, 49, 64, 81])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...