三维动态tensor数组如何padding

2019-05-20  本文已影响0人  全村希望gone

开头

实现自己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
)
参数列表

参数说明

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]]
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]]]
上一篇 下一篇

猜你喜欢

热点阅读