提高 Theano for 循环的性能
Improving performance of a Theano for loop
我有以下代码可以完成我想做的事情。但我想知道是否有更好的方法来避免 For 循环。性能在这里很重要,因为我多次调用这些操作。
我认为可以通过使用 "scan" 和 "function" 来改进它,但是我对 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 张量)。
谢谢!
您需要了解如何向量化您的代码。例如:
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
这可以在其他地方完成,我认为可以加快速度。
我有以下代码可以完成我想做的事情。但我想知道是否有更好的方法来避免 For 循环。性能在这里很重要,因为我多次调用这些操作。
我认为可以通过使用 "scan" 和 "function" 来改进它,但是我对 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 张量)。
谢谢!
您需要了解如何向量化您的代码。例如:
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
这可以在其他地方完成,我认为可以加快速度。