フィーチャマップのペアのバッチ全体で2Dクロスコンボリューション(例えば、MATLABのhttps://www.mathworks.com/help/signal/ref/xcorr2.htmlのように)を実行する必要があります。明確にするためTensorflowにおけるバッチ相互相関
:
はX
はB x W1 x H1 x C
こととY
B x W2 x H2 x C
とします。
欲しい出力は、(我々が同じパディングとY
上を通過する「フィルタ」としてX
を治療すると仮定して)形状B x W2 x H2 x 1
である出力のi
1 x W2 x H2 x 1
番目のスライスがX[i,:,:,:]
とY[i,:,:,:]
例えば間の相互相関であります
tf.nn.conv2d(Y[i,:,:,:], X[i,:,:,:], [1,1,1,1], padding='SAME')
のようなものは、この動作を実現する効率的な方法はありますか?
注:X
は1 x W1 x H1 x C
であり、我々は各スライスB
でY
とそれをクロス相関したい場合、これは簡単です:
conv2d
を実装しているという事実を利用しています
cross_corr = tf.nn.conv2d(
Y, tf.transpose(X, perm[1,2,3,0], [1,1,1,1], padding='SAME')
小さなテンソルを本質的に転置後のフィルターとして扱うことができるという事実がある。 B
異なるフィルタのクロスコンボリューションを取る必要があるので、これは私の問題を解決しません。
多分conv3dは可能でしょうか?
注2:matconvnetのvl_nnconv
は、フィルタチャネルが入力チャネルを分割する場合にこれを行います。 Tensorflowには同等の機能がありますか?
答えてくれてありがとう、これが私が探しているものです。 'tf.expand_dims(inputs [0]、0)'を呼び出すと、ちょうど1つのコメント(私は元の答えにコメントするのに十分な担当者がいません)が、余分なディメンションを追加しませんか? tf.nn.conv2dの入力を5Dテンソルにしないでください(これは可能ですか?) また、万が一、これを実行しようとしましたか?マップ関数は実際にGPUで並列化されていますか? –
私は走ってみました、それは動作します。スピードについては、正直に考えていない。 基本的にマップ(4D、4D)は、各(3D、3D)スライス上に関数を適用します。基本的には「画像ごと」の関数です。 2つの 'tf.expand_dims'は、(3D、3D)を(4D、4D)に変換して、互いに絡み合っています。 最終的な結果は5Dテンソルですが、2次元が1に等しいので、最後にそれらを取り除きます。 (私は明確化のために私の元の答えをコメントしました) – Evariste