2017-11-04 10 views
0

出力テンソルの値をテンソルフローで取得したいと考えました。 第1層のカーネル形状はK [行、列、in_channel、out_channel]でした。 入力画像形状はP [バッチ、行、列、チャネル] であるが、私は最初の4つのカーネル値を取得しようと、それらはK[0, 0, 0, 0], K[0, 1, 0, 0], K[1, 0, 0, 0], K[1, 1, 0, 0].テンソルフローでのconv2dの出力は何ですか?

IはP[0, 0, 0, 0], P[0, 0, 1, 0], P[0, 1, 0, 0], P[0, 1, 1, 0].

Pythonコードは、ということである入力値があっ得ました「F = tf.nn.conv2d(P, K, stride=[1, 1, 1, 1], padding='SAME')"

コンソールは、私が40 conv_kernelを持っていた?これらの出力特徴マップの順序はどのような出力値(F[0, 0, 0, 0]) is not K[0, 0, 0, 0] * P[0, 0, 0, 0] + K[0, 1, 0, 0] * P[0, 0, 1, 0] + K[1, 0, 0, 0] * P[0, 1, 0, 0] + K[1, 1, 0, 0] * P[0, 1, 1, 0]

を示し、最初の出力は、第1によって計算されませんでした

答えて

1

入力値に問題があります。

conv2dは、入力テンソルの形状が[batch, in_height, in_width, in_channels]で、フィルタ/カーネルテンソルの形状が[filter_height, filter_width, in_channels, out_channels]であることを覚えておいてください。

実際にデータを再形成すると、結果は期待通りです(conv2dは相関を計算し、畳み込みは計算しません)。この例では

import tensorflow as tf 

K = tf.get_variable("K", shape=(4,4), initializer=tf.constant_initializer([ 
     [0, 0, 0, 0], 
     [0, 1, 0, 0], 
     [1, 0, 0, 0], 
     [1, 1, 0, 0] 
    ])) 

K = tf.reshape(K, (4,4,1,1)) 


P = tf.get_variable("P", shape=(4,4), initializer=tf.constant_initializer([ 
     [0, 0, 0, 0], 
     [0, 0, 1, 0], 
     [0, 1, 0, 0], 
     [0, 1, 1, 0] 
    ])) 

P = tf.reshape(P, (1,4,4,1)) 


F = tf.nn.conv2d(P, K, strides=[1, 1, 1, 1], padding='VALID') 
init = tf.global_variables_initializer() 
with tf.Session() as sess: 
    sess.run(init) 
    print(sess.run(F)) 

、Iは入力P(深さ1つの要素とバッチ)とフィルタP(入力深さ1と出力深さ1を有する4×4フィルタ)との間の相関を計算しています。

+0

私はキーを見つけました。この問題はパラメータパディング= 'SAME'によって引き起こされました。パディングでは、SAMEを使用すると入力テンソルをゼロより大きくすることができます。 –

+0

SAMEパディングは**出力**テンソルを入力テンソルほど大きくします。入力は計算前にタッチされません。また、私の答えがあなたの問題を解決した場合は、それを合格とマークすることを忘れないでください。 – nessuno

関連する問題