美文网首页
三维动态tensor数组如何padding

三维动态tensor数组如何padding

作者: 全村希望gone | 来源:发表于2019-05-20 18:58 被阅读0次

    开头

    实现自己idea的过程中,需要把三维动态数组(形状为[batch_size,seq_length,hidden_unit],之所以是动态,是因为train、evaluate、predict的batch可以取不同的值)的上下方向padding几行0值,于是便自己动手做了起来,本打算根据batch_size将三维数组分割为多个二维数组,然后将每个二维数组的上下都padding几行0就okay了,结果因为数组是动态的,压根就取不到第一维的值,导致不知道有多少个二维数组,于是我用了折(很)衷(low)的办法——把动态数组变为batch值固定的数组,于是暂时解决了问题,但心里一直放不下,于是边调参边改这个bug,终于困扰了我二十几天的bug被一个自带的函数解决了。说来可气也可笑,解决方法一直都在那儿,可我就是蒙头自己干,不去想想别人有没有写过这个函数。

    高潮

    由于我的idea本来就是从CNN中得来,于是我想去看CNN中如何实现padding这个功能的,结果没费什么力气便找到了一个函数——tf.pad,直觉告诉我就是它了!于是先动手写了测试程序,测试通过,然后应用到自己的大程序上。

    tf.pad

    tf.pad(
        tensor,
        paddings,
        mode='CONSTANT',
        name=None,
        constant_values=0
    )
    
    参数列表

    参数说明

    • tensor:你要padding的tensor,假设为A
    • padding:是一个整型tensor,形状是[n,2],n是tensor的维度数,所以
      • 当tensor是二维时,padding的形状就是[2,2],也就是有两个形状为[1,2]的tensor,第一个tensor对应的是A的第一维的上下方向,第二个tensor对应的是左右方向。
    input = tf.constant([[1, 2, 3],
                          [4, 5, 6]])
    b = tf.pad(input, [[0, 0], [1, 1]])
    c = tf.pad(input, [[1, 1], [0, 0]])
    print(tf.Session().run(b))
    print(tf.Session().run(c))
    

    第一个输出

    [[0 1 2 3 0]
     [0 4 5 6 0]]
    

    第二个输出

    [[0 0 0]
     [1 2 3]
     [4 5 6]
     [0 0 0]]
    
    • 当tensor是三维时,padding的形状就是[3,2],也就是有三个形状为[1,2]的tensor,第一个tensor对应的A的第一维,意思是在A的基础上padding多少个和A形状相同的tensor,第二个tensor对应的是A中每个tensor的上下方向,第三个tensor对应的是左右方向。
    input = tf.constant([[[1, 2, 3],
                          [4, 5, 6]],
                         [[2, 2, 5],
                          [4, 3, 7]],
                         [[8, 9, 0],
                          [1, 5, 6]]])
    b = tf.pad(input, [[0, 0], [1, 1], [1, 1]])
    c = tf.pad(input, [[1, 1], [0, 0], [1, 1]])
    print(tf.Session().run(b))
    print(tf.Session().run(c))
    

    第一个输出b

    [[[0 0 0 0 0]
      [0 1 2 3 0]
      [0 4 5 6 0]
      [0 0 0 0 0]]
    
     [[0 0 0 0 0]
      [0 2 2 5 0]
      [0 4 3 7 0]
      [0 0 0 0 0]]
    
     [[0 0 0 0 0]
      [0 8 9 0 0]
      [0 1 5 6 0]
      [0 0 0 0 0]]]
    

    第二个输出c

    [[[0 0 0 0 0]
      [0 0 0 0 0]]
    
     [[0 1 2 3 0]
      [0 4 5 6 0]]
    
     [[0 2 2 5 0]
      [0 4 3 7 0]]
    
     [[0 8 9 0 0]
      [0 1 5 6 0]]
    
     [[0 0 0 0 0]
      [0 0 0 0 0]]]
    
    • mode:这是padding的模式,有三种,分别是CONSTANT、REFLECT和SYMMETRIC,默认是使用CONSTANT,可以照着上面动手试试。
    • 其余两个参数我没用到过。

    相关文章

      网友评论

          本文标题:三维动态tensor数组如何padding

          本文链接:https://www.haomeiwen.com/subject/buxlzqtx.html