Я пытаюсь уменьшить тензор, скажем, с (3,3)
до (1, 1)
, но я хочу сохранить исходный тензор:
import torch
a = torch.rand(3, 3)
a_copy = a.clone()
a_copy.resize_(1, 1)
Мне нужно requires_grad=True
в моем исходном тензоре, но PyTorch запрещает мне изменять размер копии:
a = torch.rand(3, 3, requires_grad=True)
a_copy = a.clone()
a_copy.resize_(1, 1)
Выдает ошибку:
Traceback (most recent call last):
File "pytorch_test.py", line 7, in <module>
a_copy.resize_(1, 1)
RuntimeError: cannot resize variables that require grad
Клонировать и отсоединить
Я пытался .clone()
и .detach()
а также:
a = torch.rand(3, 3, requires_grad=True)
a_copy = a.clone().detach()
with torch.no_grad():
a_copy.resize_(1, 1)
, который вместо этого выдает эту ошибку:
Traceback (most recent call last):
File "pytorch_test.py", line 14, in <module>
a_copy.resize_(1, 1)
RuntimeError: set_sizes_contiguous is not allowed on a Tensor created from .data or .detach().
If your intent is to change the metadata of a Tensor (such as sizes / strides / storage / storage_offset)
without autograd tracking the change, remove the .data / .detach() call and wrap the change in a `with torch.no_grad():` block.
For example, change:
x.data.set_(y)
to:
with torch.no_grad():
x.set_(y)
Такое поведение было указано в документах и # 15070 .
С no_grad()
Итак, следуя тому, что они сказали в сообщении об ошибке, я удалил .detach()
и вместо него использовал no_grad()
:
a = torch.rand(3, 3, requires_grad=True)
a_copy = a.clone()
with torch.no_grad():
a_copy.resize_(1, 1)
Но все равно выдает ошибку об grad:
Traceback (most recent call last):
File "pytorch_test.py", line 21, in <module>
a_copy.resize_(1, 1)
RuntimeError: cannot resize variables that require grad
Подобные вопросы
Я смотрел на Изменить размер PyTorch Tensor , но в этом примере этот тензор сохраняет все оригинальные ценности. Я также посмотрел на Pytorch предпочтительный способ копирования тензора , который я использую для копирования тензора.
Я использую PyTorch версии 1.4.0