zoukankan      html  css  js  c++  java
  • tf中几种mask的介绍

    一:tf.sequence_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)
    1. 当参数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)
    1. 当参数lenghts是[[ list ]…] 在NLP中用的比较少,我就举一个例子
    lenght = [[2,2,4],[3,4,5]]
    mask_data = tf.sequence_mask(lengths=lenght)
    # 输出
    array([[[ True,  True, False, False, False],
            [ True,  True, False, False, False],
            [ True,  True,  True,  True, False]],
    
           [[ True,  True,  True, False, False],
            [ True,  True,  True,  True, False],
            [ True,  True,  True,  True,  True]]])

    4.注意事项和应用场景
    这个填充很多时候lenghts不是我们举例子这样使用的固定长度length,大多数时候都是使用了tf.data.Dataset得到的数据。

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

    一:tf.boolean_mask()函数

    tensorflow 里的一个函数,在做目标检测(YOLO)时常常用到。

    其中b一般是bool型的n维向量,若a.shape=[3,3,3]    b.shape=[3,3]    

    则  tf.boolean_mask(a,b) 将使a (m维)矩阵仅保留与b中“True”元素同下标的部分,并将结果展开到m-1维。

    例:应用在YOLO算法中返回所有检测到的各类目标(车辆、行人、交通标志等)的位置信息(bx,by,bh,bw)

    下面用代码类解释:  

    a = np.random.randn(3, 3, 3)
    b = np.max(a,-1)
    c=  b >0.5
    print("a="+str(a))
    print("b="+str(b))
    print("c="+str(c))
    with tf.Session() as sess:
        d=tf.boolean_mask(a,c)
    print("d="+str(d.eval(session=sess)))

    输出:

    a=[[[ 0.09155271  0.09282064  1.40717416]
      [-0.23405791  0.49668615 -2.04293241]
      [-1.88603236 -2.0345092   1.49677093]]
    
     [[-0.93868614 -0.12003641 -1.48570443]
      [-0.73984936 -0.85963706 -0.81079767]
      [ 1.28287865  2.00767207 -1.28853578]]
    
     [[-0.49265434 -0.50572453  0.31728808]
      [-0.24718764 -0.13105037 -0.87185338]
      [-0.43106541  0.52068668  1.54395911]]]
    b=[[ 1.40717416  0.49668615  1.49677093]
     [-0.12003641 -0.73984936  2.00767207]
     [ 0.31728808 -0.13105037  1.54395911]]
    c=[[ True False  True]
     [False False  True]
     [False False  True]]
    d=[[ 0.09155271  0.09282064  1.40717416]
     [-1.88603236 -2.0345092   1.49677093]
     [ 1.28287865  2.00767207 -1.28853578]
     [-0.43106541  0.52068668  1.54395911]]

    首先,a = np.random.randn(3,3,3)生成3*3*3的张量,其次b = np.max(a, -1)表示在最后一个轴(此时为2)的方向上去最大值,此时将3*3*3的张量变为3*3的张量,然后执行c = b>0.5,c的结果为一个3*3的布尔型张量。最后执行tf.boolean_mask(a,c),将使a (3维)张量仅保留与c中“True”元素同下标的部分,并将结果展开到2维。

  • 相关阅读:
    luoguP2657 [SCOI2009] windy 数 数位dp
    LOJ#3280. 「JOISC 2020 Day4」首都城市 点分治+BFS
    luoguP2168 [NOI2015]荷马史诗 哈夫曼树
    转载-如何在博客园随笔中增加章节导航
    转载-MySQL之终端(Terminal)管理数据库、数据表、数据的基本操作
    转载-MySQL之终端(Terminal)管理MySQL
    数据库缓存
    独立图片服务器的部署(了解)
    CDN加速
    MySQL update替换字段部分内容
  • 原文地址:https://www.cnblogs.com/hit-joseph/p/12836192.html
Copyright © 2011-2022 走看看