提高Theano for循环的性能

时间:2015-05-28 21:41:30

标签: for-loop theano pymc3

我有以下代码来完成我想要做的事情。但我想知道是否有更好的方法通过避免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张量)。

谢谢!

1 个答案:

答案 0 :(得分: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

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