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塗りつぶしの例:
    次に例を示します.
    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を整理します.
  • 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つの充填方式の違いを体得します.
    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".
      """