tf.pad詳細
7493 ワード
目次
関数のプロトタイプ:
2 D塗りつぶしの例:
3 D塗りつぶしの例:
公式サイトの説明とまとめ:
本文は主にTensorFlowの公式英語ドキュメントから整理した.そして2つのブログを参考にして、ブロガーがカタツムリに乗って前に走ったtf.pad関数機能紹介とブロガーcaicaiatnbuの[TensorFlow学習ノート-08]tf.pad関数ソースコード解析侵入.
tf.pad()関数は主にテンソルを各次元に埋め込む
関数のプロトタイプ:
def pad(tensor,paddings,mode="CONSTANT",name=None,constant_value=0):関数パラメータ: tensorは充填されるテンソルであり、int 32 paddingsはtensorのどの次元に充填するか、どのくらい充填するかを指摘し、paddingsのrankはtensorのrankと同じ でなければならないことに注意しなければならない. modeは充填方式を指し、「CONSTANT」は定数で充填(デフォルトは0、必要に応じてconstant_valueで付与可能)、REFLECT",or"SYMMETRIC" を表す. nameはこのノードの名前です constant_value=0
2 D塗りつぶしの例:
次に例を示します.
上図と結びつけてpadを整理します. tensorの次元がnであると、padの各行がtensorのある次元を充填する責任を負うため、padにはn行がある. は2次元においてpadの第1行がtensorの行を充填する、[1,1]の第1要素がtensorの上に1行充填され、第2要素がtensorの下に1行充填することを示す. は2次元においてpadの2行目にtensorの列を充填する、[2,2]の1番目の要素はtensorの左側に2列を充填する、2番目の要素はtensorの右側に2列を充填する. 2 2次元でtensorの周囲に定数を埋め込むにはconstant_value指定でいいです.
次に、もう一つの例を見て、「CONSTANT」、「REFLECT」、「METRIC」の3つの充填方式の違いを体得します.
明らかに、「CONSTANT」は一定の定数で充填されている.「REFLECT」はエッジを折り返して充填し、エッジは複製しない.SYMMETRIC」もエッジ部分を折り返して埋めますが、エッジをコピーします.
3 D塗りつぶしの例:
以上、2次元を塗りつぶすtensorの例ですが、次に3次元のtensor(テンソル)の塗りつぶしを見てみましょう.
まず、paddingsのshapeは充填するtensorによって決まります.shapeは[n,2]、nはtensorのrank(ランク)であり、ここでは3.
まず,テンソルを作成し,テンソルの次元は[2,3,4]であった.
最初のpaddingsは[[0,0],[1,1,],[2,2]]:最初の次元は充填されず、2番目の次元は上に1行、下に1行、3番目の次元は左右に2行ずつ充填される.充填後のサイズは[2,5,8]であった.
再検証のために,2番目のpaddingsを[[1,1],[0,0],[0,0]]に設定した.得られた結果input 2は第1次元のみに埋め込まれていることがわかる.充填後のtinput 2の大きいは[4,3,4]である.
公式サイトの説明とまとめ:
次に、公式APIが与えた関数の解釈を見てみましょう.上記のすべての例は、次の式に合致しています.
The padded size of each dimension D of the output is:(充填後のテンソルの各次元出力サイズ)
`paddings[D, 0] + tensor.dim_size(D) + paddings[D, 1]`. 理解できなくても大丈夫です.
充填モードがエッジ反転の2つの場合、paddingsのサイズにも一定の制限がある.最も基本的な原則は、充填するtensorについては、少なくともこれらの要素をコピーして充填する前に、これらの要素を持っていなければなりません.
関数のプロトタイプ:
2 D塗りつぶしの例:
3 D塗りつぶしの例:
公式サイトの説明とまとめ:
本文は主にTensorFlowの公式英語ドキュメントから整理した.そして2つのブログを参考にして、ブロガーがカタツムリに乗って前に走ったtf.pad関数機能紹介とブロガーcaicaiatnbuの[TensorFlow学習ノート-08]tf.pad関数ソースコード解析侵入.
tf.pad()関数は主にテンソルを各次元に埋め込む
関数のプロトタイプ:
def pad(tensor,paddings,mode="CONSTANT",name=None,constant_value=0):関数パラメータ:
2 D塗りつぶしの例:
次に例を示します.
import tensorflow as tf
input= tf.constant([[1, 2, 3], [4, 5, 6]])
paddings = tf.constant([[1, 1,], [2, 2]])
# 'constant_values' is 0.
# rank of 't' is 2.
input1=tf.pad(input, paddings, "CONSTANT")
input2=tf.pad(input, paddings, "CONSTANT",constant_values=8)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print("input:
" ,sess.run(input))
print("input1:
",sess.run(input1))
print("input2:
",sess.run(input2))
#print(sess.run(input2))
'''
input:
[[1 2 3]
[4 5 6]]
input1:
[[0 0 0 0 0 0 0]
[0 0 1 2 3 0 0]
[0 0 4 5 6 0 0]
[0 0 0 0 0 0 0]]
input2:
[[8 8 8 8 8 8 8]
[8 8 1 2 3 8 8]
[8 8 4 5 6 8 8]
[8 8 8 8 8 8 8]]
'''
上図と結びつけてpadを整理します.
次に、もう一つの例を見て、「CONSTANT」、「REFLECT」、「METRIC」の3つの充填方式の違いを体得します.
import tensorflow as tf
input= tf.constant([[1, 2, 3], [4, 5, 6]])
paddings = tf.constant([[1, 1,], [2, 2]])
# 'constant_values' is 0.
# rank of 't' is 2.
input1=tf.pad(input, paddings, "CONSTANT")
input2=tf.pad(input, paddings, "REFLECT")
#REFLECT , ( ), ( )
input3=tf.pad(input, paddings, "SYMMETRIC")
#SYMMETRIC , ( ) ,
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print("input1:
" ,sess.run(input1))
print("input2:
",sess.run(input2))
print("input3:
",sess.run(input3))
'''
input1:
[[0 0 0 0 0 0 0]
[0 0 1 2 3 0 0]
[0 0 4 5 6 0 0]
[0 0 0 0 0 0 0]]
input2:
[[6 5 4 5 6 5 4]
[3 2 1 2 3 2 1]
[6 5 4 5 6 5 4]
[3 2 1 2 3 2 1]]
input3:
[[2 1 1 2 3 3 2]
[2 1 1 2 3 3 2]
[5 4 4 5 6 6 5]
[5 4 4 5 6 6 5]]
'''
明らかに、「CONSTANT」は一定の定数で充填されている.「REFLECT」はエッジを折り返して充填し、エッジは複製しない.SYMMETRIC」もエッジ部分を折り返して埋めますが、エッジをコピーします.
3 D塗りつぶしの例:
以上、2次元を塗りつぶすtensorの例ですが、次に3次元のtensor(テンソル)の塗りつぶしを見てみましょう.
import tensorflow as tf
input= tf.Variable(tf.ones([2,3,4]))
paddings = tf.constant([[0,0],[1, 1,], [2, 2]])
paddings2=tf.constant([[1, 1], [0, 0], [0, 0]])
input1=tf.pad(input, paddings, "CONSTANT")
input2=tf.pad(input, paddings2, "CONSTANT")
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print("input:
" ,sess.run(input))
print("input1:
",sess.run(input1))
print("input2:
" ,sess.run(input2))
'''
input:
[[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]]
paddings [[0,0],[1, 1,], [2, 2]]: ,
, 。 [2,5,8]。
input1:
[[[0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 1. 1. 1. 1. 0. 0.]
[0. 0. 1. 1. 1. 1. 0. 0.]
[0. 0. 1. 1. 1. 1. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0.]]
[[0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 1. 1. 1. 1. 0. 0.]
[0. 0. 1. 1. 1. 1. 0. 0.]
[0. 0. 1. 1. 1. 1. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0.]]]
, paddings [[1, 1], [0, 0], [0, 0]]。
input2 。 tinput2 [4,3,4].
input2:
[[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]]
'''
まず、paddingsのshapeは充填するtensorによって決まります.shapeは[n,2]、nはtensorのrank(ランク)であり、ここでは3.
まず,テンソルを作成し,テンソルの次元は[2,3,4]であった.
最初のpaddingsは[[0,0],[1,1,],[2,2]]:最初の次元は充填されず、2番目の次元は上に1行、下に1行、3番目の次元は左右に2行ずつ充填される.充填後のサイズは[2,5,8]であった.
再検証のために,2番目のpaddingsを[[1,1],[0,0],[0,0]]に設定した.得られた結果input 2は第1次元のみに埋め込まれていることがわかる.充填後のtinput 2の大きいは[4,3,4]である.
公式サイトの説明とまとめ:
次に、公式APIが与えた関数の解釈を見てみましょう.上記のすべての例は、次の式に合致しています.
The padded size of each dimension D of the output is:(充填後のテンソルの各次元出力サイズ)
`paddings[D, 0] + tensor.dim_size(D) + paddings[D, 1]`. 理解できなくても大丈夫です.
充填モードがエッジ反転の2つの場合、paddingsのサイズにも一定の制限がある.最も基本的な原則は、充填するtensorについては、少なくともこれらの要素をコピーして充填する前に、これらの要素を持っていなければなりません.
def pad(tensor, paddings, mode="CONSTANT", name=None, constant_values=0): # pylint: disable=invalid-name
"""Pads a tensor.
This operation pads a `tensor` according to the `paddings` you specify.
`paddings` is an integer tensor with shape `[n, 2]`, where n is the rank of
`tensor`. For each dimension D of `input`, `paddings[D, 0]` indicates how
many values to add before the contents of `tensor` in that dimension, and
`paddings[D, 1]` indicates how many values to add after the contents of
`tensor` in that dimension. If `mode` is "REFLECT" then both `paddings[D, 0]`
and `paddings[D, 1]` must be no greater than `tensor.dim_size(D) - 1`. If
`mode` is "SYMMETRIC" then both `paddings[D, 0]` and `paddings[D, 1]` must be
no greater than `tensor.dim_size(D)`.
The padded size of each dimension D of the output is:
`paddings[D, 0] + tensor.dim_size(D) + paddings[D, 1]`
For example:
```python
t = tf.constant([[1, 2, 3], [4, 5, 6]])
paddings = tf.constant([[1, 1,], [2, 2]])
# 'constant_values' is 0.
# rank of 't' is 2.
tf.pad(t, paddings, "CONSTANT") # [[0, 0, 0, 0, 0, 0, 0],
# [0, 0, 1, 2, 3, 0, 0],
# [0, 0, 4, 5, 6, 0, 0],
# [0, 0, 0, 0, 0, 0, 0]]
tf.pad(t, paddings, "REFLECT") # [[6, 5, 4, 5, 6, 5, 4],
# [3, 2, 1, 2, 3, 2, 1],
# [6, 5, 4, 5, 6, 5, 4],
# [3, 2, 1, 2, 3, 2, 1]]
tf.pad(t, paddings, "SYMMETRIC") # [[2, 1, 1, 2, 3, 3, 2],
# [2, 1, 1, 2, 3, 3, 2],
# [5, 4, 4, 5, 6, 6, 5],
# [5, 4, 4, 5, 6, 6, 5]]
```
Args:
tensor: A `Tensor`.
paddings: A `Tensor` of type `int32`.
mode: One of "CONSTANT", "REFLECT", or "SYMMETRIC" (case-insensitive)
name: A name for the operation (optional).
constant_values: In "CONSTANT" mode, the scalar pad value to use. Must be
same type as `tensor`.
Returns:
A `Tensor`. Has the same type as `tensor`.
Raises:
ValueError: When mode is not one of "CONSTANT", "REFLECT", or "SYMMETRIC".
"""