2016-12-20 13 views
0

私は2つのテンソル形状N x D1とM x D2を持ちます。ここで、D1> D2であり、それぞれXとYと呼ばれます。私の仕事では、Xは入力として機能し、Yはフィルタとして機能します。Tensorflow畳み込みを用いたスライディング内積

Iは、X M×(D1-D2 + 1)のような形状の行列Pを計算するN:私は、forループを作成し、手動でYをスライドし、内積を計算することができる

P[0,0,0] = dot(X[0,0:D2], Y[0,:]) 
P[0,0,1] = dot(X[0,1:D2+1], Y[0,:]) 
... 
P[N-1,M-1,D1-D2] = dot(X[N-1,D1-D2:D1], Y[M-1,:]) 

。 しかし、私は相関演算子を使うのが好きです。 私が知っているように、tensorflowには相関演算子(https://www.tensorflow.org/versions/master/api_docs/python/nn/convolution)が実装されていますが、入力とフィルタとしてどのようにテンソルを使うことができるのか分かりません。

答えて

0

tf.nn.conv2d(入力、フィルタ、進歩、パディング、use_cudnn_on_gpu =なし、DATA_FORMAT =なし、名前=なし)

あなたのケースでは、私は1に進歩を設定し、SAMEにパディングと思います。

tf.nn.conv2d(X、Y、進歩= 1、パディング= SAME)

+0

私はconv2dが私が望むものを与えるとは思わない。 直感的に言えば、私はYのすべての行をXのすべての行と畳み込むことです。私はXとYのすべての行をループして畳み込みを行うことでそれを行うことができます。私はループ、スライス、ペアワイズ乗算(これはうまくいっている)のためにトリックを行うこともできます。それにもかかわらず、私はそこにもっと良い方法があるのか​​分からない。 – minhduc

0

はい、あなたは(tf.nn.conv2d実際に使用することができます)、しかし、あなたは、バッチおよびチャネルの両方の次元を追加する必要があります。

X = tf.expand_dims(tf.expand_dims(X,0),-1) 
# X.shape [batch=1, in_height, in_width, in_channels=1] 
Y = tf.expand_dims(tf.expand_dims(Y,-1),-1) 
# Y.shape = [filter_height, filter_width, in_channels=1, out_channels=1] 

# Convolution (actually correlation, see doc of conv2d) 
xcorr = tf.nn.conv2d(X, Y, padding="VALID", strides=[1, 1, 1, 1]) 
# Padding should be VALID, since you've already padded your input 

CAVEAT:しかし、tf.nn.conv2dはバッチ次元上で常に同じフィルタを使用していますので、あなたは、信号のバッチのために、このアプローチを推定することはできませんし、私の理解から、あなたはそれを変更したいです。

関連する問題