【问题标题】:masked kernel in convolution in pytorchpytorch卷积中的掩码内核
【发布时间】:2020-09-02 17:09:36
【问题描述】:

假设:

x = torch.arange(16, dtype=torch.float).reshape(1, 1, 4, 4)

一个二维卷积层是:

layer = torch.nn.Conv2d(in_channels=1, out_channels=1, kernel_size=2, stride=2)
layer.weight.data[:] = 1.
layer.bias.data[:] = 0.

通常,将 x 传递给 layer 会得到:

>>layer(x)    
tensor([[[[10., 18.],
              [42., 50.]]]], grad_fn=<MkldnnConvolutionBackward>)

考虑到有 4 个掩码过滤器,如何在每个步骤中对内核进行掩码? 例如下图表示4个过滤器(白色:True,黑色:False)

输出应该是:

tensor([[[[5., 15.],
          [30., 40.]]]], grad_fn=<MkldnnConvolutionBackward>)

P.S:所有掩码都是通过二维输入数组中缺失的像素获得的。所以上面的4个mask其实是一个和输入形状一样的矩阵。

【问题讨论】:

    标签: python pytorch


    【解决方案1】:

    我认为您正在寻找来自 Nvidia Research 的 partial convolution

    在他们的 ECCV 2018 论文Image Inpainting for Irregular Holes Using Partial Convolutions中给出了更详细的描述

    【讨论】:

    • 谢谢。是的,这篇论文似乎是相关的。我需要检查一下是否有解决我的问题的方法。
    【解决方案2】:

    我找到了解决办法。

    在将输入和掩码提供给 Conv2d 方法之前,在输入和掩码之间进行元素乘法就足够了。(掩码输入比掩码内核本身容易得多!!):

    mask = torch.tensor([[[1, 1, 1, 0]], [[1, 0, 1, 1]], [[1, 1, 0, 1]], [[0, 1, 1, 1]]], dtype=torch.float, requires_grad=False).reshape(1, 1, 4, 4)
    
    >>layer(torch.mul(x, mask))
    tensor([[[[5., 15.],
              [30., 40.]]]], grad_fn=<MkldnnConvolutionBackward>)
    

    P.S感谢@Shai,我从paper 中表示的部分卷积中得到了这个想法。然而,它对输出做了一些额外的操作。它定义了一个掩码比率,我猜它会根据它对最终输出进行加权。

    【讨论】:

      猜你喜欢
      • 2018-11-11
      • 1970-01-01
      • 2020-09-23
      • 2016-12-31
      • 2020-10-10
      • 2021-11-09
      • 2019-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多