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]],
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]]