#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)) «