tensorflow的tf.pad函数详细介绍

一、函数功能介绍

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]表示的是水平方向上的填充。


猜你喜欢

转载自blog.csdn.net/sinat_29957455/article/details/80903913