mask和index在一起操作挺多的,故关于index操作也可以看: 活到老学到老之index操作。
1. 对矩阵获取句子长度
1 | from torch.nn.utils.rnn import pad_sequence |
2. 计算loss的时候把mask加上
略.
3. 比如三维矩阵操作mask
1 | a = torch.arange(24).reshape(2, 3, 4) |
简单理解,就是将sequence_length中padding位忽略掉。
4. gather
也可以看这里:bert以首字表示词向量(2)。
1 | # 例如这句,他在ltp中:https://github.com/HIT-SCIR/ltp/blob/f3d4a25ee2fbb71613f76c99a47e70a5445b8c03/ltp/transformer_rel_linear.py#L58 中出现 |
它的完整实验代码如下:
1 |
|
1 | # -*- coding: utf8 -*- |
解释:
word_out表示取首字的向量作为整个词的向量,但是对于长度为padding的,那么取的是首个词的索引,需要mask掉。
比如:
['我', '爱', '北京']
,seq_out为(2,6,256)
,其中6
是['我', '爱', '北京', '和', '你']
字的长度,那么 ['我', '爱', '北京']
后两位就为padding,word_index为0,这个进行gather的时候就会取到我
的向量了,所以这个在后续计算时需要把padding部分给mask掉。
5. masked_fill
1 | a = torch.arange(4).float().reshape(2,2) |
6. 二维mask -> 三维mask
这个在变成4维(最后一维表示feature)时用到。
1 | mask = torch.tensor([ |
7. flatten操作
1 | a = torch.arange(12).view(2, 2, 3) |
8. 对角线
1 | # -*- coding: utf8 -*- |