Pytorch nn.functional.interpolate 使用什么信息?
What information does Pytorch nn.functional.interpolate use?
我在 PyTorch 中有一个大小为 bx2xhxw
的张量 img
,我想使用 torch.nn.functional.interpolate
对其进行上采样。但是在插值时我不希望通道 1 使用来自通道 2 的信息。为此我应该这样做,
img2 = torch.rand(b,2,2*h,2*w) # create a random torch tensor.
img2[:,0,:,:] = nn.functional.interpolate(img[:,0,:,:], [2*h,2*w], mode='bilinear', align_corners=True)
img2[:,1,:,:] = nn.functional.interpolate(img[:,1,:,:], [2*h,2*w], mode='bilinear', align_corners=True)
img=img2
或简单地使用
img = nn.functional.interpolate(img, [2*h,2*w], mode='bilinear', align_corners=True)
将解决我的目的。
你应该使用 (2)。对于所有类型的插值(1D、2D、3D),第一维和第二维(分别是批处理和通道)没有通信,因为它们应该是。
简单示例:
import torch
import torch.nn.functional as F
b = 2
c = 4
h = w = 8
a = torch.randn((b, c, h, w))
a_upsample = F.interpolate(a, [h*2, w*2], mode='bilinear', align_corners=True)
a_mod = a.clone()
a_mod[:, 0] *= 1000
a_mod_upsample = F.interpolate(a_mod, [h*2, w*2], mode='bilinear', align_corners=True)
print(torch.isclose(a_upsample[:,0], a_mod_upsample[:,0]).all())
print(torch.isclose(a_upsample[:,1], a_mod_upsample[:,1]).all())
print(torch.isclose(a_upsample[:,2], a_mod_upsample[:,2]).all())
print(torch.isclose(a_upsample[:,3], a_mod_upsample[:,3]).all())
输出:
tensor(False)
tensor(True)
tensor(True)
tensor(True)
可以看出第一个通道的较大变化对其他通道没有影响。
我在 PyTorch 中有一个大小为 bx2xhxw
的张量 img
,我想使用 torch.nn.functional.interpolate
对其进行上采样。但是在插值时我不希望通道 1 使用来自通道 2 的信息。为此我应该这样做,
img2 = torch.rand(b,2,2*h,2*w) # create a random torch tensor.
img2[:,0,:,:] = nn.functional.interpolate(img[:,0,:,:], [2*h,2*w], mode='bilinear', align_corners=True)
img2[:,1,:,:] = nn.functional.interpolate(img[:,1,:,:], [2*h,2*w], mode='bilinear', align_corners=True)
img=img2
或简单地使用
img = nn.functional.interpolate(img, [2*h,2*w], mode='bilinear', align_corners=True)
将解决我的目的。
你应该使用 (2)。对于所有类型的插值(1D、2D、3D),第一维和第二维(分别是批处理和通道)没有通信,因为它们应该是。
简单示例:
import torch
import torch.nn.functional as F
b = 2
c = 4
h = w = 8
a = torch.randn((b, c, h, w))
a_upsample = F.interpolate(a, [h*2, w*2], mode='bilinear', align_corners=True)
a_mod = a.clone()
a_mod[:, 0] *= 1000
a_mod_upsample = F.interpolate(a_mod, [h*2, w*2], mode='bilinear', align_corners=True)
print(torch.isclose(a_upsample[:,0], a_mod_upsample[:,0]).all())
print(torch.isclose(a_upsample[:,1], a_mod_upsample[:,1]).all())
print(torch.isclose(a_upsample[:,2], a_mod_upsample[:,2]).all())
print(torch.isclose(a_upsample[:,3], a_mod_upsample[:,3]).all())
输出:
tensor(False)
tensor(True)
tensor(True)
tensor(True)
可以看出第一个通道的较大变化对其他通道没有影响。