需求:我门在做NLP任务的时候,因为需要补齐每个句子而填充很多PAD(PAD值往往是0),但是我们在后续处理通常是不需要这些无用的填充(例如求损失(2D),或者attention(3D)得到句子级别表示的词向量的时候去掉无用词向量)。
对于二维的:
例如我们有个(batch_size, seq_len)的矩阵,我们知道每个seq_len中有效词实际长(即去除PAD)
def SequenceMask2D(X,X_len,value=0):
maxLen = X.size(1)
mask = torch.arange(maxLen)[None,:] < X_len[:,None]
X[~mask] = value
return X
maxLen = 10
seq_len = 2
X_len = torch.LongTensor([3,4])
X = torch.ones((seq_len,maxLen))
y = torch.arange(maxLen)
print("y[None,:]",y[None,:])
print("X_len[:,None]",X_len[:,None])
mask = y[None,:] < X_len[:,None]
print(~mask)
X[~mask] = 0
print(X)
'''
y[None,:] tensor([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
X_len[:,None] tensor([[3],[4]])
tensor([[False, False, False, True, True, True, True, True, True, True],
[False, False, False, False, True, True, True, True, True, Tr