MATMUL

2017-03-08 5 views
4

私は私が何をしたいのか(1000, 10, 40)MATMUL

を想定し、(1000, 50, 10)
Fy形状(num, N, h)を想定し、(1, 20, 40, 50)
Fx形状(num, w, N)を想定し、3テンソル
Xに形状(1, c, h, w)を持っているがmatmulFy * (X * Fx)*を意味しています)
X * Fx(num, c, h, N)(1000, 20, 40, 10)
Fy * (X * Fx)形状(num, c, N, N)、より良い方法を探してみてください 、私はそれを
を行うためにtf.tiletf.expand_dimsを使用していますが、私はそれが多くのメモリを使用すると思います(tileコピーデータは右?)、および遅い
(1000, 20, 10, 10)

を想定より速く、がmythical einsumため

# X: (1, c, h, w) 
# Fx: (num, w, N) 
# Fy: (num, N, h) 

X = tf.tile(X, [tf.shape(Fx)[0], 1, 1, 1]) # (num, c, h, w) 
Fx_ex = tf.expand_dims(Fx, axis=1) # (num, 1, w, N) 
Fx_ex = tf.tile(Fx_ex, [1, c, 1, 1]) # (num, c, w, N) 
tmp = tf.matmul(X, Fxt_ex) # (num, c, h, N) 

Fy_ex = tf.expand_dims(Fy, axis=1) # (num, 1, N, h) 
Fy_ex = tf.tile(Fy_ex, [1, c, 1, 1]) # (num, c, N, h) 
res = tf.matmul(Fy_ex, tmp) # (num, c, N, N) 

答えて

2

ケースを達成するために、小さなメモリを使用することを、私は推測する:

のように tfで、ほぼ同じように機能すべきことだ
>>> import numpy as np 
>>> X = np.random.rand(1, 20, 40, 50) 
>>> Fx = np.random.rand(100, 50, 10) 
>>> Fy = np.random.rand(100, 10, 40) 
>>> np.einsum('nMh,uchw,nwN->ncMN', Fy, X, Fx).shape 
(100, 20, 10, 10) 

(大文字のインデックスを使用しては、いくつかのtfバージョンでは許可されていない、私は見ました)。これは前に表記法を見たことがないなら、これは確かに判読不可能な正規表現を超えています。

+0

はい、私はこれまでにこれを見たことがありませんでした。理解するのが少し難しく、アイデアを理解するためにひねります – xxi

+0

awwwwwesome、それは巨大なスピードの改善、多くのありがとう – xxi

0

otheroneは
興味を持って私は@phgの答えは多分もっとあるのでNone
のでtensorflowのR1.0でtf.einsumは、エラーが発生します
を動作しますが、つまり、私の場合numhwは動的であり、中に思うかもしれについて1つのテンソル幸い

で1つのNone形状よりも、複数のNone SHAがあるという状況を扱うことができるようだissuepull request
があります
源から(masterブランチ)を構築する必要があり
をPE私は再ビルドtensorflowところで

後に結果を報告します、tf.einsumに小文字のみ

レポート
はい、最新バージョンを受け入れますテンソルフロー(マスターブランチ)はtf.einsum
の動的形状を受け入れ、tf.einsumを使用した後には驚異的な速度向上です。本当に素晴らしいです

関連する問題