一、函数功能介绍
tf.pad函数主要是用来对tensor的大小进行扩展,包括水平、垂直、深度(通道)等。
pad(tensor, paddings, mode="CONSTANT", name=None, constant_values=0)
输入参数:
tensor:输入的tensor
paddings:设置填充的大小
mode:填充方式,默认是CONSTANT,还有REFLECT和SYMMETRIC
name:名称
constant_values:CONSTANT填充方式的填充值
二、 实例
paddings是一个大小为[n,2]的tensor,其中n为输入tensor的秩(维度)。
a、CONSTANT填充方式(默认)
import tensorflow as tf
import numpy as np
if __name__ == "__main__":
a = np.array(np.arange(1,10))
a = a.reshape((3,3))
print(a)
sess = tf.InteractiveSession()
b = tf.pad(a,[[1,1],[2,2]])
print(sess.run(b))
输出
[[1 2 3]
[4 5 6]
[7 8 9]]
[[0 0 0 0 0 0 0]
[0 0 1 2 3 0 0]
[0 0 4 5 6 0 0]
[0 0 7 8 9 0 0]
[0 0 0 0 0 0 0]]
paddings中的[1,1]表示的是垂直方向上的填充,第一个1表示的是向上的填充行数,第二个1表示的是向下的填充行数。[2,2]表示的水平方向上的填充,第一个2表示的向左的填充行数,第二个2表示的是向右的填充行数。CONSTANT填充默认使用的是0进行填充,可以通过constant_values参数来控制,CONSTANT模式的填充值。
b、REFLECT填充方式
b = tf.pad(a,[[1,1],[2,2]],"REFLECT")
print(sess.run(b))
输出
[[6 5 4 5 6 5 4]
[3 2 1 2 3 2 1]
[6 5 4 5 6 5 4]
[9 8 7 8 9 8 7]
[6 5 4 5 6 5 4]]
REFLECT的填充方式使用的是一种通过对称轴进行对称复制的方式进行填充(复制时不包括对称轴),通过使用tensor边缘作为对称轴。如[1,1]中的第一个1表示的是,选择tensor的上边缘的第一行[1,2,3]作为对称轴,选择对称轴下面的第一行对称复制到上面也就是[4,5,6]。[2,2]中的第一个2表示的是,选择tensor左边的第一行[4,1,4,7,4]作为对称轴,然后将右边的2行进行对称复制到对称轴的左边。
注意:paddings中的参数填充函数,不能超过输入tensor在该方向上的shape-1,如上面的输入tensor的shape为(3,3),在使用REFLECT模式的时候,垂直方向和水平方向上都不能超过2。
c、SYMMETRIC填充方式
b = tf.pad(a,[[1,1],[2,2]],"SYMMETRIC")
print(sess.run(b))
输出
[[2 1 1 2 3 3 2]
[2 1 1 2 3 3 2]
[5 4 4 5 6 6 5]
[8 7 7 8 9 9 8]
[8 7 7 8 9 9 8]]
SYMMETRIC的填充方式于REFLECT填充方式类似,也是按照对称轴就是复制的,只是它包括对称轴。
扩展:
a = np.array(np.arange(1,9))
a = a.reshape((2,2,2))
print(a)
sess = tf.InteractiveSession()
b = tf.pad(a,[[1,1],[2,2],[3,3]],constant_values=0)
print(sess.run(b))
输出
[[[1 2]
[3 4]]
[[5 6]
[7 8]]]
[[[0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0]]
[[0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0]
[0 0 0 1 2 0 0 0]
[0 0 0 3 4 0 0 0]
[0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0]]
[[0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0]
[0 0 0 5 6 0 0 0]
[0 0 0 7 8 0 0 0]
[0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0]]
[[0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0]]]
paddings中的[1,1]表示的是深度方向上的填充,[2,2]表示的是垂直方向,[3,3]表示的是水平方向上的填充。