在pytorch中需要一个矢量化解决方案
Need a vectorized solution in pytorch
我正在 PyTorch 框架中使用人脸图像进行实验。输入x是给定大小为5 * 5(高*宽)的人脸图像,共有192个通道。
Objective:获取patch_size的x的补丁(作为参数给出)。
我在两个for循环的帮助下得到了需要的结果。但我想要一个更好的矢量化解决方案,这样计算成本将比使用两个 for 循环少得多。
已用:PyTorch 0.4.1,(12 GB) Nvidia TitanX GPU。
下面是我用两个for循环实现的
def extractpatches( x, patch_size): # x is bsx192x5x5
patches = x.unfold( 2, patch_size , 1).unfold(3,patch_size,1)
bs,c,pi,pj, _, _ = patches.size() #bs,192,
cnt = 0
p = torch.empty((bs,pi*pj,c,patch_size,patch_size)).to(device)
s = torch.empty((bs,pi*pj, c*patch_size*patch_size)).to(device)
//Want a vectorized method instead of two for loops below
for i in range(pi):
for j in range(pj):
p[:,cnt,:,:,:] = patches[:,:,i,j,:,:]
s[:,cnt,:] = p[:,cnt,:,:,:].view(-1,c*patch_size*patch_size)
cnt = cnt+1
return s
提前感谢您的帮助。
我想你可以试试下面的方法。我在我的实验中使用了你的部分代码,它对我有用。这里 l 和 f 是张量补丁的列表
l = [patches[:,:,int(i/pi),i%pi,:,:] for i in range(pi * pi)]
f = [l[i].contiguous().view(-1,c*patch_size*patch_size) for i in range(pi * pi)]
您可以使用玩具输入值验证上述代码。
谢谢
我正在 PyTorch 框架中使用人脸图像进行实验。输入x是给定大小为5 * 5(高*宽)的人脸图像,共有192个通道。
Objective:获取patch_size的x的补丁(作为参数给出)。
我在两个for循环的帮助下得到了需要的结果。但我想要一个更好的矢量化解决方案,这样计算成本将比使用两个 for 循环少得多。
已用:PyTorch 0.4.1,(12 GB) Nvidia TitanX GPU。
下面是我用两个for循环实现的
def extractpatches( x, patch_size): # x is bsx192x5x5
patches = x.unfold( 2, patch_size , 1).unfold(3,patch_size,1)
bs,c,pi,pj, _, _ = patches.size() #bs,192,
cnt = 0
p = torch.empty((bs,pi*pj,c,patch_size,patch_size)).to(device)
s = torch.empty((bs,pi*pj, c*patch_size*patch_size)).to(device)
//Want a vectorized method instead of two for loops below
for i in range(pi):
for j in range(pj):
p[:,cnt,:,:,:] = patches[:,:,i,j,:,:]
s[:,cnt,:] = p[:,cnt,:,:,:].view(-1,c*patch_size*patch_size)
cnt = cnt+1
return s
提前感谢您的帮助。
我想你可以试试下面的方法。我在我的实验中使用了你的部分代码,它对我有用。这里 l 和 f 是张量补丁的列表
l = [patches[:,:,int(i/pi),i%pi,:,:] for i in range(pi * pi)]
f = [l[i].contiguous().view(-1,c*patch_size*patch_size) for i in range(pi * pi)]
您可以使用玩具输入值验证上述代码。 谢谢