python-3.x - 如何构建一个与 autograd 兼容的 Pytorch 模块,该模块可以像图像一样调整张量的大小?
问题描述
我想知道是否可以在 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.
似乎我不能在不先将其从 autograd 中分离出来的情况下“调整”张量的大小,但是分离它会阻止我计算梯度。
有没有办法构建一个与torchvision.transforms.Resize
autograd 兼容的 Torch 功能/模块?任何帮助深表感谢!
解决方案
torch.nn.functional.upsample
为我工作,是的!
推荐阅读
- graph - NetworkX 与 GraphDB:它们有相似的用途吗?何时使用其中一种,何时一起使用?
- javascript - 在 Javascript 中展平对象数组的快速方法
- python - 数据框和数组之间的点积上的 TypeError
- haskell - 将带有两个参数的过滤器函数应用于由 Haskell 中带有一个参数的函数生成的列表
- javascript - 在一年的最后几天修复 Date.getWeek() 函数错误?
- c - 如何更改进程的进程组ID
- php - “购买”后尝试从网页中删除项目,但仍显示在用户购买项目历史记录中
- javascript - Javascript 承诺:监控数组的状态
- reactjs - React Hooks 结合 Firebase 数据未在页面加载时显示
- python - 如何使用 argparse 指定最小或最大浮点值