无法在Theano的slinalg.ExpmGrad中定义一个函数

时间:2016-12-01 22:16:42

标签: gradient theano

我正在尝试使用Theano中内置的ExpmGrad功能。 但是,当我在theano.function中定义ExpmGrad时,我收到一条错误消息,指出输出必须是theano变量。

我不确定使用此ExpmGrad函数的正确方法究竟应该是什么,因为我没有找到任何在线使用的示例。

这就是我的尝试:

import theano
from theano.tensor import T
J1 = T.dscalar('J1')
H = np.arange(16).reshape(4, 4) * J1
gJ = theano.tensor.slinalg.ExpmGrad(H)
f = theano.function([J1], gJ)

这是我得到的错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-122-2e2976e72a77> in <module>()
      4 # gJ = theano.gradient.jacobian(H[0], J1)
      5 gJ = theano.tensor.slinalg.ExpmGrad(H)
----> 6 f = theano.function([J1], gJ)

//anaconda/lib/python3.5/site-packages/theano/compile/function.py in function(inputs, outputs, mode, updates, givens, no_default_updates, accept_inplace, name, rebuild_strict, allow_input_downcast, profile, on_unused_input)
    318                    on_unused_input=on_unused_input,
    319                    profile=profile,
--> 320                    output_keys=output_keys)
    321     # We need to add the flag check_aliased inputs if we have any mutable or
    322     # borrowed used defined inputs

//anaconda/lib/python3.5/site-packages/theano/compile/pfunc.py in pfunc(params, outputs, mode, updates, givens, no_default_updates, accept_inplace, name, rebuild_strict, allow_input_downcast, profile, on_unused_input, output_keys)
    440                                          rebuild_strict=rebuild_strict,
    441                                          copy_inputs_over=True,
--> 442                                          no_default_updates=no_default_updates)
    443     # extracting the arguments
    444     input_variables, cloned_extended_outputs, other_stuff = output_vars

//anaconda/lib/python3.5/site-packages/theano/compile/pfunc.py in rebuild_collect_shared(outputs, inputs, replace, updates, rebuild_strict, copy_inputs_over, no_default_updates)
    225                 raise TypeError('Outputs must be theano Variable or '
    226                                 'Out instances. Received ' + str(v) +
--> 227                                 ' of type ' + str(type(v)))
    228             # computed_list.append(cloned_v)
    229     else:

TypeError: Outputs must be theano Variable or Out instances. Received ExpmGrad of type <class 'theano.tensor.slinalg.ExpmGrad'>

我做错了什么?

1 个答案:

答案 0 :(得分:1)

ExpmGrad不是函数,它是theano.Op的子类。 “调用”类只会创建一个Op实例,而不是你想要的结果。

要正确使用它,您应该将Op作为仿函数实例化以使用它:

expm_grad = theano.tensor.slinalg.ExpmGrad()
gJ = expm_grad(H, gw)

对于上面的代码,您需要正确定义gw参数,这是上游渐变。

注意:渐变操作通常不能直接使用,建议使用theano.grad间接使用它

J1 = T.dscalar('J1')
H = np.arange(16).reshape(4, 4) * J1
expH = theano.tensor.slinalg.expm(H)
e = some_scalar_function(expH)
gJ = theano.grad(e, J1)
f = theano.function([J1], gJ)