开头
实现自己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,可以照着上面动手试试。
- 其余两个参数我没用到过。
网友评论