Как сделать «элемент за элементом на месте инверсии» с pytorch? - PullRequest
0 голосов
/ 17 ноября 2018

Дан массив a:

a = np.arange(1, 11, dtype = 'float32')

С помощью numpy я могу сделать следующее:

np.divide(1.0, a, out = a)

В результате:

array([1.        , 0.5       , 0.33333334, 0.25      , 0.2       ,
       0.16666667, 0.14285715, 0.125     , 0.11111111, 0.1       ],
      dtype=float32)

Предполагая, что a вместо этого является тензором Pytorch, следующая операция завершается неудачно :

torch.div(1.0, a, out = a)

Ожидается, что первый параметр div будет тензором соответствующей длины / формы.

Если я заменим 1.0 на массив b, заполненный единицами, его длина равна длине a, это сработает.Недостатком является то, что я должен выделить память для b.Я также могу сделать что-то вроде a = 1.0 / a, которое снова выделит дополнительную (временную) память.

Как я могу сделать эту операцию эффективно "на месте" (без выделения дополнительной памяти), в идеале с вещанием

1 Ответ

0 голосов
/ 17 ноября 2018

Pytorch следует соглашению об использовании _ для операций на месте.например,

add -> add_  # in-place equivalent
div -> div_  # in-place equivalent
etc

Элемент инверсия по элементам.

>>> a = torch.arange(1, 11, dtype=torch.float32) 
>>> a.pow_(-1) 
>>> a
>>> tensor([1.0000, 0.5000, 0.3333, 0.2500, 0.2000, 0.1667, 0.1429, 0.1250, 0.1111, 0.1000])

>>> a = torch.arange(1, 11, dtype=torch.float32) 
>>> a.div_(a ** a) 
>>> a
>>> tensor([1.0000, 0.5000, 0.3333, 0.2500, 0.2000, 0.1667, 0.1429, 0.1250, 0.1111, 0.1000])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...