Чтобы ускорить мой код, я конвертирую многомерную функцию суммарного произведения из Python в Theano. Мой код Theano дает тот же результат, но вычисляет результат только для одного измерения за раз, так что мне приходится использовать цикл Python for для получения конечного результата. Я предполагаю, что это сделает код медленным, потому что Theano не может оптимизировать использование памяти и передачу (для графического процессора) между несколькими вызовами функций. Или это неверное предположение?
Итак, как мне изменить код Theano, чтобы sumprod вычислялся за один вызов функции?
Оригинальная функция Python:
def sumprod(a1, a2):
"""Sum the element-wise products of the `a1` and `a2`."""
result = numpy.zeros_like(a1[0])
for i, j in zip(a1, a2):
result += i*j
return result
Для следующего ввода
a1 = ([1, 2, 4], [5, 6, 7])
a2 = ([1, 2, 4], [5, 6, 7])
вывод будет: [ 26. 40. 65.]
, то есть 1*1 + 5*5, 2*2 + 6*6 и 4*4 + 7*7
Theano-версия кода:
import theano
import theano.tensor as T
import numpy
a1 = ([1, 2, 4], [5, 6, 7])
a2 = ([1, 2, 4], [5, 6, 7])
# wanted result: [ 26. 40. 65.]
# that is 1*1 + 5*5, 2*2 + 6*6 and 4*4 + 7*7
Tk = T.iscalar('Tk')
Ta1_shared = theano.shared(numpy.array(a1).T)
Ta2_shared = theano.shared(numpy.array(a2).T)
outputs_info = T.as_tensor_variable(numpy.asarray(0, 'float64'))
Tsumprod_result, updates = theano.scan(fn=lambda Ta1_shared, Ta2_shared, prior_value:
prior_value + Ta1_shared * Ta2_shared,
outputs_info=outputs_info,
sequences=[Ta1_shared[Tk], Ta2_shared[Tk]])
Tsumprod_result = Tsumprod_result[-1]
Tsumprod = theano.function([Tk], outputs=Tsumprod_result)
result = numpy.zeros_like(a1[0])
for i in range(len(a1[0])):
result[i] = Tsumprod(i)
print result