効率的にboolを作成して、aまたはbを返すかどうかを判断する方法はありますか?
はい、あなたができる
cond * a + (1-cond) * b
cond
は(N, M)
形状に放送されます。
これは理論上のメモリ帯域幅に近い値にする必要があります。この操作では約N*M
個の要素を読み取り、N*M
と書く必要があります。
代わりに、2*N*M
と読みますが、条件付きロジックを削除します。
(私は私の前にTheanoを持っていないので、私はそれがT.switch
よりも高速ですが、それは恋愛小説家であるべきである場合。また、私は同じdtype
にcond
をキャストしてみたいことを確認していませんa
とb
)
としてあなたはインプレース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)
それは、または高速であってもなくてもよいトン最初のアプローチは、N
、M
と他の要因に依存します。
答えてくれてありがとう、私はそれを試してみよう!理論的限界についての興味深い考え。私は大きな読み込みと書き込みを避けることができると思います。最も頻繁に 'a'が返す正しい値であり、メソッドが' a'を直接変更するのは大丈夫です。与えられた行に対して 'b'の時間の5%だけが返されると仮定すると、変更を必要とする行で' a'を直接変更することでより良い性能を得ることはできませんでしたか? – pir
@pirあなたはCPUまたはGPUを最適化していますか?典型的なN、N、dtypeは何ですか? – MaxB
@pirまた、NNやグラデーションが必要な部分ですか? – MaxB