我需要通过scan多次执行一个Theano函数,以便将代价函数求和并在梯度计算中使用。虽然我熟悉深度学习教程中的此类操作,但我的数据切片和其他一些复杂性意味着我需要以稍微不同的方式进行操作。 以下是我尝试做的事情的大大简化版本。
tn = testnet()
cost = tn.single_cost( )
x = theano.shared(numpy.asarray([7.1,2.2,3.4], dtype='float32'))
index = T.lscalar('index')
test_fn = theano.function(inputs=[index], outputs=cost,
givens={tn.x:x[index:index+1]} )
def step(curr):
return T.constant( test_fn( curr ) )
outs,_ = theano.scan(step, T.arange(2))
out_fn = theano.function(inputs=[], outputs=outs)
print out_fn()
在扫描函数中,对test_fn(curr)的调用出现错误... 期望一个类似数组的对象,但发现一个变量:你可能正在尝试在(可能共享的)变量而不是数字数组上调用函数?')
即使我传递一个值数组而不是将T.arrange(2)放在原处,我仍然会收到相同的错误。在扫描函数中是否不能调用函数?
总的来说,我想知道是否有一种方法可以使用一系列索引调用这样的函数,以便输出可以输入到T.grad()计算中(没有显示)。