Использование Theano.scan с общими переменными

Я хочу вычислить sumproduct двух массивов в Theano . Оба массива объявлены как общие переменные и являются результатом предыдущих вычислений. Прочитав руководство, я узнал, как использовать сканирование для вычисления того, что я хочу, используя «обычные» тензорные массивы, но когда я попытался адаптировать код к общим массивам, я получил сообщение об ошибке TypeError: function() takes at least 1 argument (1 given). (См. пример минимального рабочего кода ниже)

Где ошибка в моем коде? Где мое заблуждение? Я также открыт для другого подхода к решению моей проблемы.

Как правило, я бы предпочел версию, которая напрямую использует общие переменные, потому что, по моему мнению, преобразование массивов сначала обратно в массивы Numpy, а затем снова передача их в Theano было бы расточительным.

Сообщение об ошибке, создающее код sumproduct с использованием общих переменных:

import theano
import theano.tensor as T
import numpy

a1 = [1,2,4]
a2 = [3,4,5]

Ta1_shared = theano.shared(numpy.array(a1))
Ta2_shared = theano.shared(numpy.array(a2))

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, Ta2_shared])
Tsumprod_result = Tsumprod_result[-1]

Tsumprod = theano.function(outputs=Tsumprod_result)
print Tsumprod()

Сообщение об ошибке:

TypeError: function() takes at least 1 argument (1 given)

Рабочий код sumproduct с использованием частных переменных:

import theano
import theano.tensor as T
import numpy

a1 = [1, 2, 4]
a2 = [3, 4, 5]   

Ta1 = theano.tensor.vector("a1")
Ta2 = theano.tensor.vector("coefficients")
outputs_info = T.as_tensor_variable(numpy.asarray(0, 'float64'))

Tsumprod_result, updates = theano.scan(fn=lambda Ta1, Ta2, prior_value:
                                       prior_value + Ta1 * Ta2,
                                       outputs_info=outputs_info,
                                       sequences=[Ta1, Ta2])
Tsumprod_result = Tsumprod_result[-1]

Tsumprod = theano.function(inputs=[Ta1, Ta2], outputs=Tsumprod_result)
print Tsumprod(a1, a2)

person Framester    schedule 24.05.2013    source источник


Ответы (1)


Вам нужно изменить строку компиляции на эту:

Tsumprod = theano.function([], outputs=Tsumprod_result)

theano.function() всегда нужен список входных данных. Если функция принимает 0 входных данных, как в этом случае, вам нужно указать пустой список для входных данных.

person nouiz    schedule 28.05.2013