将Theano.scan与共享变量一起使用

时间:2013-05-24 15:49:48

标签: python theano

我想计算Theano中两个数组的sumproduct。两个数组都被声明为共享变量,并且是先前计算的结果。阅读tutorial,我发现如何使用扫描来计算我想要的'普通'张量数组,但是当我尝试将代码调整为共享数组时,我得到了错误消息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)

1 个答案:

答案 0 :(得分:7)

您需要将编译行更改为:

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

theano.function()总是需要一个输入列表。如果函数采用0输入,就像在这种情况下,您需要为输入提供一个空列表。