2017-05-17 11 views
7

IはabMが非常に大きいことと(N, M)数値テンソルであるがcondは、(N,1) BOOLテンソルであり、次のコードTheanoスイッチ行方向効率

output = T.switch(cond, a, b) 

を有します。条件は行ごとに動作します。

T.repeat()condで実行すると簡単にスイッチを動作させることができますが、これはかなり遅いです。どのように私は効率的にboolを作ることができる方法はありますcondaまたはbが返される必要がありますか?

答えて

3

効率的にboolを作成して、aまたはbを返すかどうかを判断する方法はありますか?

はい、あなたができる

cond * a + (1-cond) * b 

cond(N, M)形状に放送されます。

これは理論上のメモリ帯域幅に近い値にする必要があります。この操作では約N*M個の要素を読み取り、N*Mと書く必要があります。

代わりに、2*N*Mと読みますが、条件付きロジックを削除します。

(私は私の前にTheanoを持っていないので、私はそれがT.switchよりも高速ですが、それは恋愛小説家であるべきである場合。また、私は同じdtypecondをキャストしてみたいことを確認していませんab


としてあなたはインプレースaを更新したい場合は、T.set_subtensorを使用してそれを行うことができます。

a = np.random.uniform(size=(N, M)).astype(np.float32) 
b = np.random.uniform(size=(N, M)).astype(np.float32) 

a = theano.shared(a) 
b = theano.shared(b) 

c = T.vector() # mostly 0, presumably (1-cond) 

nz = T.nonzero(c) 

s = T.set_subtensor(a[nz], b[nz]) 
fn = theano.function([c], [], updates=[(a, s)]) 

... 

fn(1-cond) 

それは、または高速であってもなくてもよいトン最初のアプローチは、NMと他の要因に依存します。

+0

答えてくれてありがとう、私はそれを試してみよう!理論的限界についての興味深い考え。私は大きな読み込みと書き込みを避けることができると思います。最も頻繁に 'a'が返す正しい値であり、メソッドが' a'を直接変更するのは大丈夫です。与えられた行に対して 'b'の時間の5%だけが返されると仮定すると、変更を必要とする行で' a'を直接変更することでより良い性能を得ることはできませんでしたか? – pir

+0

@pirあなたはCPUまたはGPUを最適化していますか?典型的なN、N、dtypeは何ですか? – MaxB

+0

@pirまた、NNやグラデーションが必要な部分ですか? – MaxB

関連する問題