【问题标题】:Masking tensor of same shape in PyTorch在 PyTorch 中屏蔽相同形状的张量
【发布时间】:2019-10-25 00:11:00
【问题描述】:

给定一个数组和相同形状的掩码,我想要相同形状的掩码输出并包含 0,其中掩码为 False。

例如,

# input array
img = torch.randn(2, 2)
print(img)
# tensor([[0.4684, 0.8316],
#        [0.8635, 0.4228]])
print(img.shape)
# torch.Size([2, 2])

# mask
mask = torch.BoolTensor(2, 2)
print(mask)
# tensor([[False,  True],
#        [ True,  True]])
print(mask.shape)
# torch.Size([2, 2])

# expected masked output of shape 2x2
# tensor([[0, 0.8316],
#        [0.8635, 0.4228]])

问题:屏蔽改变了输出的形状,如下所示:

#1: shape changed
img[mask]
# tensor([0.8316, 0.8635, 0.4228])

【问题讨论】:

    标签: python pytorch


    【解决方案1】:

    只需将您的布尔掩码类型转换为整数掩码,然后使用浮点数将掩码转换为与img 中相同的类型。之后执行逐元素乘法。

    masked_output = img * mask.int().float()

    【讨论】:

      【解决方案2】:

      最直接的方法是创建另一个张量来处理它。

      import torch
      
      def generate_masked_tensor(input, mask, fill=0):
          masked_tensor = torch.zeros(input.size()) + fill
          masked_tensor[mask] = input[mask]
          return masked_tensor
      
      if __name__ == "__main__":
          img = torch.randn(2, 2)
          mask = torch.tensor([False, True, True, False]).bool().view(2, 2)
          masked_img = generate_masked_tensor(img, mask)
          print (masked_img)
      

      输出:

      tensor([[0.0000, 0.8028],
              [1.5411, 0.0000]])
      

      【讨论】:

        【解决方案3】:

        我找到的解决方法之一是:

        img[mask==False] = 0
        

        或使用

        img[~mask] = 0
        

        它会改变 img 本身。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-11-20
          • 2021-02-26
          • 2020-10-19
          • 2019-02-21
          • 2022-01-16
          • 1970-01-01
          • 2020-08-27
          • 2022-12-12
          相关资源
          最近更新 更多