【问题标题】:Need a vectorized solution in pytorch需要 pytorch 中的矢量化解决方案
【发布时间】:2019-06-13 04:40:47
【问题描述】:

我正在 PyTorch 框架中使用人脸图像进行实验。输入 x 是给定大小为 5 * 5(高 * 宽)的人脸图像,共有 192 个通道。

目标:获得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

提前感谢您的帮助。

【问题讨论】:

  • 你能描述一下补丁采样过程的逻辑吗?我今天懒得看 for 循环 :)

标签: vectorization pytorch


【解决方案1】:

我认为您可以尝试以下方法。我在实验中使用了你的部分代码,它对我有用。这里 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)] 

您可以使用玩具输入值验证上述代码。 谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 2021-11-10
    相关资源
    最近更新 更多