1. 程式人生 > >TensorFlow學習筆記[一]—— 填充張量函式 tf.pad 解析

TensorFlow學習筆記[一]—— 填充張量函式 tf.pad 解析

函式的作用:

對張量按照你的需求進行填充

函式原型:

pad(
    tensor,
    paddings,
    mode='CONSTANT',
    name=None
)

引數說明:

tensor:   A 'Tensor'.     #tensor是要填充的張量;
paddings: A 'Tensor' of type 'int32'.     #paddings也是一個張量,是需要擴張的維度,代表每一維填充多少行和列
(注意!!paddings的rank也就是秩一定要和要填充的tensor的秩一樣才行),型別是Int32;
mode:    One of "CONSTANT", "REFLECT", or "SYMMETRIC" (case-insensitive)    #mode可選三個值,分別是"CONSTANT","REFLECT"和"SYMMETRIC",代表三種不同的填充方式
name:    A name for the operation (optional).      #pad操作的重新命名,一般不需要管,預設是None

mode引數詳細說明:

mode="CONSTANT" 是填充0

mode="REFLECT"是對映填充,上下(1維)填充順序和paddings是相反的,左右(零維)順序補齊

mode="SYMMETRIC"是對稱填充,上下(1維)填充順序是和paddings相同的,左右(零維)對稱補齊


返回值說明:

A 'Tensor'.     Has the same type as 'tensor'.

即返回值也是一個Tensor,型別和引數'tensor'是一樣的。

舉例說明:


本例使用的tensor都是rank=2的,注意paddings的rank也要等於2,否則會報錯:

Example1:

t=[[2,3,4],[5,6,7]],   paddings=[[1,1],[2,2]],  mode="CONSTANT

"

那麼sess.run(tf.pad(t,paddings,"CONSTANT"))的輸出結果為:

array([[0, 0, 0, 0, 0, 0, 0],

          [0, 0, 2, 3, 4, 0, 0],

          [0, 0, 5, 6, 7, 0, 0],

          [0, 0, 0, 0, 0, 0, 0]], dtype=int32)

mode="CONSTANT"這種填充模式是最簡單的,一看就能明白

上,下,左,右分別填充了1行、1行以及2、2列

剛好和paddings=[[1,1],[2,2]]相等,

然後全部用0填充

Example 2:

t=[[2,3,4],[5,6,7]], paddings=[[1,2],[2,3]],

mode="CONSTANT"

sess.run(tf.pad(t,paddings,"CONSTANT"))的輸出結果為:

array([[0, 0, 0, 0, 0, 0, 0, 0],

          [0, 0, 2, 3, 4, 0, 0, 0],

          [0, 0, 5, 6, 7, 0, 0, 0],

          [0, 0, 0, 0, 0, 0, 0, 0],

          [0, 0, 0, 0, 0, 0, 0, 0]], dtype=int32)

同樣是mode="CONSTANT",這裡把paddings=[[1,1],[2,2]]改成paddings=[[1,2],[2,3]]

其實道理還是一樣的

上,下,左,右分別填充啦1行、2行以及2列、3列

剛好和paddings=[[1,2],[2,3]]相等

然後全部用0填充

Example 3:

t=[[2,3,4],[5,6,7]], paddings=[[1,1],[2,2]], mode='REFLECT'

sess.run(tf.pad(t,paddings,"REFLECT"))的輸出結果為:

array([[7, 6, 5, 6, 7, 6, 5],

           [4, 3, 2, 3, 4, 3, 2],

           [7, 6, 5, 6, 7, 6, 5],

           [4, 3, 2, 3, 4, 3, 2]], dtype=int32)

mode="REFLECT"這種填充模式相比mode="CONSTANT"會複雜一點

上,下,左,右分別填充了1行、1行以及2、2列

剛好和paddings=[[1,1],[2,2]]相等

這點和mode="CONSTANT"一樣,沒有區別

區別在於填充的值不同:

上下左右的值進行了對映填充,

上下值填充的順序和t是相反的,(我們先對同一列的值進行填充:例如看第三列,原來tensor的第二行第三列的值為2,第三行第三列的值為5,因此上下填充時,第一行第三列填充5,而第四行第三列就填充2了,即反過來了,大家這樣理解就可以了)

左右值填充的順序和t是也是相反的(也可以說是順序補齊,分別從中間向左右兩邊擴張,是順序的)

# 't' is [[2,3,4]].

# 'paddings' is [[2,0]]    左邊填充2列,右邊填充0列

pad(t, paddings, "REFLECT") ==> 

[[4, 3, 2, 3, 4]]

可以看出是反向填充,

右邊也一樣

# 't' is [[2,3,4]].

# 'paddings' is [[0,2]]    左邊填充0列,右邊填充2列

pad(t, paddings, "REFLECT") ==> 

[[2, 3, 4, 3, 2]]


Example 4:

t=[[2,3,4],[5,6,7]], paddings=[[1,1],[2,2]], mode='SYMMETRIC'

sess.run(tf.pad(t,paddings,"SYMMETRIC"))的輸出結果為:

array([[3, 2, 2, 3, 4, 4, 3],

          [3, 2, 2, 3, 4, 4, 3],

          [6, 5, 5, 6, 7, 7, 6],

          [6, 5, 5, 6, 7, 7, 6]], dtype=int32)

mode="SYMMETRIC"這種填充模式相比mode="REFLECT"差不多

區別在於:

上下左右的值進行了對稱填充,

上下值是按照t相同順序填充的(我們先對同一列的值進行填充:例如看第三列,原來tensor的第二行第三列的值為2,第三行第三列的值為5,因此上下填充時,第一行第三列填充2,而第四行第三列就填充5了,即和它最近的那個數值是一樣的,大家這樣理解就可以了)

左右值只是進行對稱補齊(分別從中間向左右兩邊擴張,是關於中心對稱的)

# 't' is [[2,3,4]].

# 'paddings' is [[2,0]]  左邊填充2列,右邊填充0列

pad(t, paddings, "REFLECT") ==> 

[[3, 2, 2, 3, 4]]

可以看出是對稱填充,

# 't' is [[2,3,4]].

# 'paddings' is [[0,2]]  左邊填充0列,右邊填充2列

pad(t, paddings, "REFLECT") ==> 

[[2, 3, 4, 4, 3]]