我在想是否可以在Pytorch中构建一个图像缩放模块,该模块以3 * H * W的torch.tensor作为输入并返回一个张量作为调整大小后的图像。我知道可以将张量转换为PIL图像并使用torchvision,但我还希望从调整大小后的图像向原始图像反向传播梯度,以下示例会在Windows 10上(在PyTorch 0.4.0中)返回此类错误:
import numpy as np
from torchvision import transforms
t2i = transforms.ToPILImage()
i2t = transforms.ToTensor()
trans = transforms.Compose(
t2i, transforms.Resize(size=200), i2t]
)
test = np.random.normal(size=[3, 300, 300])
test = torch.tensor(test, requires_grad=True)
resized = trans(test)
resized.backward()
print(test.grad)
Traceback (most recent call last):
File "D:/Projects/Python/PyTorch/test.py", line 41, in <module>
main()
File "D:/Projects/Python/PyTorch/test.py", line 33, in main
resized = trans(test)
File "D:\Anaconda3\envs\pytorch\lib\site-packages\torchvision\transforms\transforms.py", line 42, in __call__
img = t(img)
File "D:\Anaconda3\envs\pytorch\lib\site-packages\torchvision\transforms\transforms.py", line 103, in __call__
return F.to_pil_image(pic, self.mode)
File "D:\Anaconda3\envs\pytorch\lib\site-packages\torchvision\transforms\functional.py", line 102, in to_pil_image
npimg = np.transpose(pic.numpy(), (1, 2, 0))
RuntimeError: Can't call numpy() on Variable that requires grad. Use var.detach().numpy() instead.
似乎我不能在不先将张量从自动求导中分离出来的情况下进行“imresize”,但是分离它会防止我计算梯度。
是否有一种方法可以构建一个torch函数/模块,它与自动求导兼容,并且执行与torchvision.transforms.Resize
相同的操作?非常感谢您的帮助!