我正在尝试使用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'>
我做错了什么?
答案 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)