For loop 提高Theano for循环的性能

For loop 提高Theano for循环的性能,for-loop,theano,pymc3,For Loop,Theano,Pymc3,我有以下代码来完成我想做的事情。但我想知道是否有更好的方法避免For循环。性能在这里很重要,因为我多次调用这些操作 我认为可以通过使用“扫描”和“功能”来改进它,但我对Theano的经验还不够丰富,无法让它对我来说是显而易见的。我确实试着把所有的东西都放在一个theano函数中,但是没有用 import theano import theano.tensor as t import numpy as np m=9 n=9 dim=4 W=np.random.random((m,dim)) Y=

我有以下代码来完成我想做的事情。但我想知道是否有更好的方法避免For循环。性能在这里很重要,因为我多次调用这些操作

我认为可以通过使用“扫描”和“功能”来改进它,但我对Theano的经验还不够丰富,无法让它对我来说是显而易见的。我确实试着把所有的东西都放在一个theano函数中,但是没有用

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张量)


谢谢

您需要了解如何对代码进行矢量化。例如:

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代码的工作

这可以在其他地方完成,我认为可以加快速度