【TensorFlow】tf.nn.conv2d_Transposeはどのように逆ボリュームを実現しますか?


三ヶ月も更新してないよ、帰ってきたらもっと~~
csdnでは主にいくつかのcoding過程で出会った関数,問題,解決策について述べる.実践に偏る.
また、理論的なものを見たいなら、私の知っているホームページを追加してください.
csdn私信はほとんど読まず、問題があればメールボックスを送ることができます[email protected]あるいは私信を知っていて、私が最初に皆さんに返事するのを見て
前の文章でパラメータの位置の質問をしてくれた人がいて、ありがとうございました.以前私が使っていたtensorflowバージョンは0.8で、1.0を大きく変更した後、多くのパラメータが位置を交換したので、バージョンを1.1.0 rc 1に更新しました.コードを見るときはバージョンの問題に注意してください.
/*******************************************************************************************************************************************************/
今日はTensorflowの中の反ボリューム操作を紹介します.ネット上の反ボリュームの使い方の紹介は少ないので、このチュートリアルが皆さんに役に立つことを望んでいます.
この論文から反ボリューム:Deconvolutional Networks、興味のある学生は自分で理解します
まず、反ボリュームをどのように理解しても、反ボリューム操作はボリュームの逆方向であることを常に覚えておいてください.
もしあなたがいつでも上で強調した重点を覚えているならば、あなたは基本的に大半を理解して、次にいくつかの関数の紹介を通じてみんなのためにこの観念を強化します
conv2d_transpose(value, filter, output_shape, strides, padding="SAME", data_format="NHWC", name=None)
  name          name,            :      value:            ,      Tensor      filter:   ,      Tensor,  [filter_height, filter_width, out_channels, in_channels]   shape,     [      ,      ,     ,     ]      output_shape:        shape,                    ,             ?               strides:             ,         ,  4      padding:string    ,   "SAME","VALID"    ,                   data_format:string    ,'NHWC' 'NCHW'    ,  tensorflow         ,    value       。'NHWC' tensorflow       [batch, height, width, in_channels],'NCHW' Theano     ,[batch, in_channels,height, width],      'NHWC'              ,         :http://blog.csdn.net/mao_xiao_feng/article/details/53444333            3    
x1 = tf.constant(1.0, shape=[1,3,3,1])
kernel = tf.constant(1.0, shape=[3,3,3,1])
らないで! ボリューム を するのではなく、
x2 = tf.constant(1.0, shape=[1,6,6,3])
x3 = tf.constant(1.0, shape=[1,5,5,3])
x 2が6であることをさらに します.×6の3チャネル 、x 3は5×5の3 が し、 にx 3に して1 のボリューム
y2 = tf.nn.conv2d(x3, kernel, strides=[1,2,2,1], padding="SAME")
を うので、 ってきたy 2は1 の であり、ボリューム を すれば、y 2が[1,3,3,1]のTensorであることが にわかり、y 2の は の りである:
[[[[ 12.]
   [ 18.]
   [ 12.]]

  [[ 18.]
   [ 27.]
   [ 18.]]

  [[ 12.]
   [ 18.]
   [ 12.]]]]
         !tf.nn.conv2d  filter  , [filter_height, filter_width, in_channels, out_channels]   , tf.nn.conv2d_transpose  filter  , [filter_height, filter_width, out_channels,in_channels]   ,  in_channels out_channels    !        ,           
y 2がボリューム の り である 、 たちはもちろんそれを ボリューム することができ、 ボリューム が ってきたTensor、x 3のshapeと じ( ではありませんが、 み みの なので)
y3 = tf.nn.conv2d_transpose(y2,kernel,output_shape=[1,5,5,3], strides=[1,2,2,1],padding="SAME")
が いはずですが、 ってきたy 3はやはり[1,5,5,3]のTensorで、 は の りです:
[[[[ 12.  12.  12.]
   [ 30.  30.  30.]
   [ 18.  18.  18.]
   [ 30.  30.  30.]
   [ 12.  12.  12.]]

  [[ 30.  30.  30.]
   [ 75.  75.  75.]
   [ 45.  45.  45.]
   [ 75.  75.  75.]
   [ 30.  30.  30.]]

  [[ 18.  18.  18.]
   [ 45.  45.  45.]
   [ 27.  27.  27.]
   [ 45.  45.  45.]
   [ 18.  18.  18.]]

  [[ 30.  30.  30.]
   [ 75.  75.  75.]
   [ 45.  45.  45.]
   [ 75.  75.  75.]
   [ 30.  30.  30.]]

  [[ 12.  12.  12.]
   [ 30.  30.  30.]
   [ 18.  18.  18.]
   [ 30.  30.  30.]
   [ 12.  12.  12.]]]]
この はどのように られたのですか?1 の で することができて、 の : きの の は て、tf.nn.conv2d_transposeのoutput_shapeは なようですが、 、ボリュームコア、ステップ が らかに サイズを すことができることを ったので、なぜoutput_を するのかshapeは?
y4 = tf.nn.conv2d(x2, kernel, strides=[1,2,2,1], padding="SAME")
のx 2も み み、shapeが[1,3,3,1]のy 4を ると、
[[[[ 27.]
   [ 27.]
   [ 18.]]

  [[ 27.]
   [ 27.]
   [ 18.]]

  [[ 18.]
   [ 18.]
   [ 12.]]]]
[1,6,6,3]と[1,5,5,3]の が み まれて じ きさになり、[1,3,3,1] に ると、[1,3,3,1]の が み まれて が られるのでしょうか. つの が した.ここではoutput_を しますshapeは があるので、もちろん にoutput_を しますshapeは されていません.
y5 = tf.nn.conv2d_transpose(x1,kernel,output_shape=[1,10,10,3],strides=[1,2,2,1],padding="SAME")

がstrideが2の 、1の も です.ボリュームコアが より きい 、デフォルトはVALID (SAMEでは がありません)で を してください.
import tensorflow as tf

x1 = tf.constant(1.0, shape=[1,3,3,1])

x2 = tf.constant(1.0, shape=[1,6,6,3])

x3 = tf.constant(1.0, shape=[1,5,5,3])

kernel = tf.constant(1.0, shape=[3,3,3,1])



y1 = tf.nn.conv2d_transpose(x1,kernel,output_shape=[1,6,6,3],
    strides=[1,2,2,1],padding="SAME")

y2 = tf.nn.conv2d(x3, kernel, strides=[1,2,2,1], padding="SAME")

y3 = tf.nn.conv2d_transpose(y2,kernel,output_shape=[1,5,5,3],
    strides=[1,2,2,1],padding="SAME")

y4 = tf.nn.conv2d(x2, kernel, strides=[1,2,2,1], padding="SAME")

'''
Wrong!!This is impossible
y5 = tf.nn.conv2d_transpose(x1,kernel,output_shape=[1,10,10,3],strides=[1,2,2,1],padding="SAME")
'''
sess = tf.Session()
tf.global_variables_initializer().run(session=sess)
x1_decov, x3_cov, y2_decov, x2_cov=sess.run([y1,y2,y3,y4])
print(x1_decov.shape)
print(x3_cov.shape)
print(y2_decov.shape)
print(x2_cov.shape)