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

Это список инициализации. Он инициализирует элементы до того, как будет запущен тело конструктора. Рассмотрим

class Foo {
 public:
   string str;
   Foo(string &p)
   {
      str = p;
   };
 };

vs

class Foo {
public:
  string str;
  Foo(string &p): str(p) {};
};

. В первом примере str будет инициализироваться конструктором без аргументов

string();

перед телом конструктора Foo. Внутри конструктора foo

string& operator=( const string& s );

будет вызываться на 'str', как вы делаете str = p;

. Во втором примере str будет инициализироваться непосредственно вызовом его конструктор

string( const string& s );

с «p» в качестве аргумента.

4
задан Jesse 22 March 2019 в 20:31
поделиться

2 ответа

Как уже отмечалось @ 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])
0
ответ дан Querenker 22 March 2019 в 20:31
поделиться

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

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

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


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

torch.arange(10).pow(2)

Вывод:

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

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

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

0
ответ дан blue-phoenox 22 March 2019 в 20:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: