Изменить размер PyTorch Tensor

В настоящее время я использую функцию tensor.resize () для изменения размера тензора до новой формы t = t.resize(1, 2, 3).

Это дает мне предупреждение об устаревании:

изменение размера вне места не рекомендуется

Следовательно, я хотел переключиться на функцию tensor.resize_(), которая кажется подходящей заменой на месте. Однако это оставляет мне

не может изменять размер переменных, требующих градиента

ошибка. Я могу вернуться к

from torch.autograd._functions import Resize
Resize.apply(t, (1, 2, 3))

что и делает tensor.resize (), чтобы избежать предупреждения об устаревании. Мне это не кажется подходящим решением, а скорее хакерством. Как правильно использовать tensor.resize_() в этом случае?


person LL_    schedule 06.06.2018    source источник
comment
Вы уверены, что хотите использовать тензор для изменения размера, а не для изменения формы? И если вы хотите изменить его размер, можно ли что-нибудь заархивировать с помощью изменения размера, что невозможно с помощью операций нарезки?   -  person MBT    schedule 06.06.2018
comment
Я думаю, вы правы. На самом деле, теперь, когда вы упомянули об этом, я понимаю, что, вероятно, мне в первую очередь следовало использовать reshape. Вот результат t.size() до и после операции: torch.Size ([16, 512, 8, 10, 2]) и torch.Size ([16, 512, 8, 20])   -  person LL_    schedule 06.06.2018
comment
Да, я думаю, вы можете просто использовать view или reshape (начиная с версии 0.4.0).   -  person MBT    schedule 06.06.2018


Ответы (3)


Вместо этого вы можете выбрать tensor.reshape(new_shape) или torch.reshape(tensor, new_shape), как в:

# a `Variable` tensor
In [15]: ten = torch.randn(6, requires_grad=True)

# this would throw RuntimeError error
In [16]: ten.resize_(2, 3)
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-16-094491c46baa> in <module>()
----> 1 ten.resize_(2, 3)

RuntimeError: cannot resize variables that require grad

Вышеуказанное RuntimeError можно решить или избежать, используя tensor.reshape(new_shape)

In [17]: ten.reshape(2, 3)
Out[17]: 
tensor([[-0.2185, -0.6335, -0.0041],
        [-1.0147, -1.6359,  0.6965]])

# yet another way of changing tensor shape
In [18]: torch.reshape(ten, (2, 3))
Out[18]: 
tensor([[-0.2185, -0.6335, -0.0041],
        [-1.0147, -1.6359,  0.6965]])
person kmario23    schedule 06.06.2018
comment
Как уже отмечал @ blue-phoenox в комментариях к вопросу, я действительно пытался изменить форму, а не размер. Я реализовал предложенное здесь решение, и оно отлично работает! - person LL_; 06.06.2018
comment
В качестве примечания: я использовал функцию tensor.reshape() из-за ее более легкой читаемости! - person LL_; 06.06.2018

Не могли бы вы попробовать что-нибудь вроде:

import torch
x = torch.tensor([[1, 2], [3, 4], [5, 6]])
print(":::",x.resize_(2, 2))
print("::::",x.resize_(3, 3))
person Sunil    schedule 22.06.2019

Просто используйте t = t.contiguous().view(1, 2, 3), если вы действительно не хотите изменять его данные.

В противном случае операция на месте resize_ нарушит график вычисления градиента для t.
Если это не имеет значения для вас, просто используйте t = t.data.resize_(1,2,3).

person Daniel    schedule 06.06.2018