改进Theano for循环的性能



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

我认为它可以通过使用"scan"one_answers"function"来改进,但我对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张量(我相信它们就是ano张量)

谢谢!

您需要了解如何向量化您的代码。例如:

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广播

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

最新更新