深度学习中mask技巧的使用

需求:我门在做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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值