1

私がやりたいことを達成する次のコードがあります。しかし、For ループを回避することでそれを行うより良い方法があるかどうか疑問に思っています。これらの操作を何度も呼び出すため、ここではパフォーマンスが重要です。

「スキャン」と「関数」を使用することで改善できると思いますが、それが明らかなほど Theano の経験が十分ではありません。すべてを theano.function の中に入れようとしましたが、うまくいきませんでした。

import theano
import theano.tensor as t
import numpy as np

m=9
n=9
dim=4
W=np.random.random((m,dim))
Y=np.random.random((n,dim))
I=np.random.randint(0,2,(n,m))
I=I.astype(int)

U=theano.shared(np.zeros((n,dim)))

for i in range(n):
    Ui=np.zeros(dim)
    for k in range(m):
        Ui+=t.dot(I[i,k],W[k,:])
    U=t.set_subtensor(U[i,:],Ui/I[i,:].sum())

U+=Y

ちなみに、これは制約付き確率行列因数分解 (Salakhutdinov と Mnih による論文の式 7) の実装です。私はpymc3でそれをやっているので、「W」と「Y」は本当に確率的なpymc3テンソルです(これは単なるtheanoテンソルだと思います)。

ありがとう!

4

1 に答える 1

2

コードをベクトル化する方法を理解する必要があります。例えば:

Ui=np.zeros(dim)
for k in range(m):
    Ui+=t.dot(I[i,k],W[k,:])

次のように実装できます。

Ui = I[None, i] * W

numpy ブロードキャストで学習します。これは非常に強力な考え方であり、より少ないメモリでより高速に計算を実行します。これは、NumPy および Theano コードで機能します。http://deeplearning.net/software/theano/tutorial/numpy.html#broadcasting

これは、さらに高速化すると思われる他の場所で実行できます。

于 2015-06-02T01:35:11.793 に答える