【问题标题】:pytorch masked_fill: why can't I mask all zeros?pytorch masked_fill:为什么我不能屏蔽所有零?
【发布时间】:2019-10-13 04:20:21
【问题描述】:

我想用-np.inf 屏蔽分数矩阵中的所有零,但我只能屏蔽部分零,看起来像

您在右上角看到仍然有没有被-np.inf 掩盖的零

这是我的代码:

q = torch.Tensor([np.random.random(10),np.random.random(10),np.random.random(10), np.random.random(10), np.zeros((10,1)), np.zeros((10,1))])
k = torch.Tensor([np.random.random(10),np.random.random(10),np.random.random(10), np.random.random(10), np.zeros((10,1)), np.zeros((10,1))])
scores = torch.matmul(q, k.transpose(0,1)) / math.sqrt(10)
mask = torch.Tensor([1,1,1,1,0,0])
mask = mask.unsqueeze(1)
scores = scores.masked_fill(mask==0, -np.inf)

可能是面具错了?

【问题讨论】:

    标签: python tensorflow pytorch


    【解决方案1】:

    你的面具错了。试试

    scores = scores.masked_fill(scores == 0, -np.inf)
    

    scores 现在看起来像

    tensor([[1.4796, 1.2361, 1.2137, 0.9487,   -inf,   -inf],
            [0.6889, 0.4428, 0.6302, 0.4388,   -inf,   -inf],
            [0.8842, 0.7614, 0.8311, 0.6431,   -inf,   -inf],
            [0.9884, 0.8430, 0.7982, 0.7323,   -inf,   -inf],
            [  -inf,   -inf,   -inf,   -inf,   -inf,   -inf],
            [  -inf,   -inf,   -inf,   -inf,   -inf,   -inf]])
    

    【讨论】:

      【解决方案2】:

      在 mujjiga 的代码中,分数张量本身用作掩码,因此它将所有 0 替换为 -inf,尽管这不是掩码的通常预期用途。掩码通常与想要掩码的张量无关。

      【讨论】:

        【解决方案3】:

        你的代码是正确的,输出显示正确的行为。 当前,您的掩码具有 [6,1] 形状,因此它首先掩盖了每列中的最后两个元素。

        >>> mask = torch.Tensor([1,1,1,1,0,0])
        
        >>> mask.shape
        
        torch.Size([6])
        
        >>> mask = mask.unsqueeze(1)
        
        >>> mask.shape
        
        torch.Size([6, 1])
        

        【讨论】:

          【解决方案4】:

          或者稍微修改一下你的代码,它会起作用的

          import math
          
          q = torch.Tensor([np.random.random(10),np.random.random(10),np.random.random(10), np.random.random(10), np.zeros((10,1)), np.zeros((10,1))])
          k = torch.Tensor([np.random.random(10),np.random.random(10),np.random.random(10), np.random.random(10), np.zeros((10,1)), np.zeros((10,1))])
          scores = torch.matmul(q, k.transpose(0,1)) / math.sqrt(10)
          mask = torch.Tensor([1,1,1,1,0,0])
          mask2 = mask.unsqueeze(1)
          scores = scores.masked_fill(mask2==0, -np.inf)
          mask = mask.unsqueeze(0)
          scores = scores.masked_fill(mask==0, -np.inf)
          scores
          

          【讨论】:

            猜你喜欢
            • 2016-12-29
            • 1970-01-01
            • 2011-06-22
            • 2017-06-01
            • 2016-01-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多