Создание тензора факела из генератора

#pytorch

#pytorch

Вопрос:

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

 >>> 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])
  

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

Ответ №1:

Как уже указывает @blue-phoenox, предпочтительнее использовать встроенные функции PyTorch для непосредственного создания тензора. Но если вам приходится иметь дело с generator, может быть целесообразно использовать 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])
  

Комментарии:

1. Это очень хорошее решение! Я бы надеялся, что найдется лучший способ, который не будет полагаться на numpy в качестве посредника, но это в основном то, что я искал. Спасибо!

Ответ №2:

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

Вопрос в том, хотите ли вы сначала создать свои данные в 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. Спасибо за ответ. Это обеспечивает хорошее обходное решение, но суть моего вопроса на самом деле такова: могу ли я использовать генераторы python (с отличным синтаксисом, который python предоставляет для них) для создания тензора torch. Мой первоначальный мотивирующий пример был больше похож на: « >>>torch.tensor(my_distribution.sample() для _ в диапазоне(10)) «