Улучшение производительности цикла Theano for

У меня есть следующий код, который выполняет то, что я хочу сделать. Но мне интересно, есть ли лучший способ сделать это, избегая циклов 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

Кстати, это реализация вероятностной матричной факторизации с ограничениями (уравнение 7 в статье Салахутдинова и Мниха). Я делаю это с pymc3, поэтому «W» и «Y» действительно являются стохастическими тензорами pymc3 (которые, как я считаю, являются просто тензорами теано).

Спасибо!


person hermeneutics    schedule 28.05.2015    source источник


Ответы (1)


Вам нужно понять, как векторизовать свой код. Например:

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

Это можно сделать в другом месте, я думаю, чтобы ускорить его еще больше.

person nouiz    schedule 02.06.2015