【Tensorflow】tf.sequence_mask()

本文详细介绍了 TensorFlow 中的 `tf.sequence_mask()` 和 `tf.boolean_mask()` 函数。`tf.sequence_mask()` 主要用于在填充计算时排除填充的部分,确保损失函数的准确性,适用于不同长度序列的处理。`tf.boolean_mask()` 则根据提供的布尔掩码过滤张量。这两个函数在处理变长序列数据,如NLP任务中填充0的情况,以及在BERT等模型训练中的前后信息隔离等方面有广泛应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一:tf.sequence_mask()函数

二:tf.boolean_mask()函数


一:tf.sequence_mask()函数

应用场景主要是在填充计算时候使用,比如你把没有单词的位置填充了0,如果纳入了前向传播计算,影响了最终经验损失函数的结果。那么我们如果通过tf.sequence_mask得到的mask张量,与损失函数结果进行对照相乘,可以去掉无用的损失值,保证了计算的准确性。

1.定义

# 函数定义
sequence_mask(
    lengths,
    maxlen=None,
    dtype=tf.bool,
    name=None
)
# 返回数据
return mask类型数据

2.参数解释
函数返回的一个mask张量,默认其中内部元素类型是tf.bool(布尔变量)
经过tf.Session()打印可以得到一个array数据。
注解:一般实际代码中选择数据类型为tf.float32,这样True会变成1.,同理False变成0.,看不懂可以继续往下看

要点解释:

  • 1.返回值mask张量:默认mask张量就是布尔格式的一种张量表达,只有True和 False 格式,也可以通过参数dtype指定其他数据格式。
  • 2.参数lengths:顾名思义表示的是长度;可以是标量,也可以是列表 [ ] ,也可以是二维列表[ [ ],[ ] ,…],甚至是多维列表…。一般列表类型的用的比较多
  • 3.参数maxlen:当默认None,默认从lengths中获取最大的那个数字,决定返回mask张量的长度;当为N时,返回的是N长度。
  • 如果觉得晦涩,举例,看完就懂了:

3.函数举例

  • 当参数lenghts是标量
import tensorflow as tf

lenght = 4 
mask_data = tf.sequence_mask(lengths=lenght)
# 输出结果,输出结果是长度为4的array,前四个True
array([ True,  True,  True,  True])

# 定义maxlen时
mask_data = tf.sequence_mask(lengths=lenght,maxlen=6)
# 输出结果,输出结果是长度为6的array,前四个True
array([ True,  True,  True,  True, False, False])

# 定义dtype时
mask_data = tf.sequence_mask(lengths=lenght,maxlen=6,dtype=tf.float32)
# 输出结果,输出结果是长度为6的array,前四个1.0
array([1., 1., 1., 1., 0., 0.], dtype=float32)
  • 当参数lenghts是[ list ],这个形式的非常常用,主要是针对数据填充用的非常多。比如我一个batch_data有10个数据,每个数据是一个句子,每个句子不可能是一样长的,肯定有短的需要填充0元素,那么lengths就专门记录每个句子的长度的。
# 比如这个lenght就是记录了第一个句子2个单词,第二个句子2个单词,第三个句子4个单词
lenght = [2,2,4] 
mask_data = tf.sequence_mask(lengths=lenght)
# 长度为max(lenght)
array([[ True,  True, False, False],
       [ True,  True, False, False],
       [ True,  True,  True,  True]])

# 定义maxlen时
mask_data = tf.sequence_mask(lengths=lenght,maxlen=6)
# 长度为maxlen
array([[ True,  True, False, False, False, False],
       [ True,  True, False, False, False, False],
       [ True,  True,  True,  True, False, False]])

# 定义dtype时
mask_data = tf.sequence_mask(lengths=lenght,maxlen=6,dtype=tf.float32)
# 长度为maxlen,数据格式为float32
array([[1., 1., 0., 0., 0., 0.],
       [1., 1., 0., 0., 0., 0.],
       [1., 1., 1., 1., 0., 0.]], dtype=float32)

 

二:tf.boolean_mask()函数

三、应用

1、batch输出向量的长度要一致,不足的位置填充0,但是在损失函数部分需要确定到实际输入的位置;

2、bert等模型训练,在 t 时刻不能看到 t 时刻之后的信息;

参考:

NLP 中的Mask全解 - 海晨威的文章 - 知乎

tf中几种mask的介绍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值