4

我想用 屏蔽分数矩阵中的所有零-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)

也许面具是错的?

4

4 回答 4

9

你的面具是错误的。尝试

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]])
于 2019-05-27T15:26:54.710 回答
3

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

于 2020-03-04T08:27:04.827 回答
1

应您的代码是正确的,输出显示正确的行为。当前,您的掩码具有 [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])
于 2020-03-04T08:20:21.273 回答
0

甚至通过稍微更改您的代码,它都会起作用

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
于 2020-07-31T12:26:51.497 回答