我试图编写一个自定义的Theano操作,它在数值上集成两个值之间的函数。Op是PyMC3的自定义似然函数,涉及一些积分的数值计算。我不能简单地使用@as_op decorator,因为我需要使用HMC来执行MCMC步骤。任何帮助都将不胜感激,因为这个问题似乎已经出现了好几次,但从未得到解决(例如https://stackoverflow.com/questions/36853015/using-theano-with-numerical-integration,Theano: implementing an integral function)。在
很明显,一个解决方案是在Theano中编写一个数值积分器,但是如果已经有非常好的积分器,例如通过整合. 在
为了将此作为一个最小的例子,让我们尝试在一个操作内部集成一个介于0和1之间的函数。下面将在一个操作之外集成一个Theano函数,并在我的测试中生成正确的结果。在import theano
import theano.tensor as tt
from scipy.integrate import quad
x = tt.dscalar('x')
y = x**4 # integrand
f = theano.function([x], y)
print f(0)
print f(1)
ans = integrate.quad(f, 0, 1)[0]
print ans
然而,尝试在一个操作中进行集成似乎要困难得多。我目前的最大努力是:
^{pr2}$
这会产生以下错误:Traceback (most recent call last):
File "stackoverflow.py", line 35, in
out = f(inp)
File "/usr/local/lib/python2.7/dist-packages/theano/compile/function_module.py", line 871, in __call__
storage_map=getattr(self.fn, 'storage_map', None))
File "/usr/local/lib/python2.7/dist-packages/theano/gof/link.py", line 314, in raise_with_op
reraise(exc_type, exc_value, exc_trace)
File "/usr/local/lib/python2.7/dist-packages/theano/compile/function_module.py", line 859, in __call__
outputs = self.fn()
File "/usr/local/lib/python2.7/dist-packages/theano/gof/op.py", line 912, in rval
r = p(n, [x[0] for x in i], o)
File "stackoverflow.py", line 17, in perform
f_to_int = theano.function([x], x)
File "/usr/local/lib/python2.7/dist-packages/theano/compile/function.py", line 320, in function
output_keys=output_keys)
File "/usr/local/lib/python2.7/dist-packages/theano/compile/pfunc.py", line 390, in pfunc
for p in params]
File "/usr/local/lib/python2.7/dist-packages/theano/compile/pfunc.py", line 489, in _pfunc_param_to_in
raise TypeError('Unknown parameter type: %s' % type(param))
TypeError: Unknown parameter type:
Apply node that caused the error: IntOp(x)
Toposort index: 0
Inputs types: [TensorType(float64, matrix)]
Inputs shapes: [(2, 2)]
Inputs strides: [(16, 8)]
Inputs values: [array([[ 2., 4.],
[ 6., 8.]])]
Outputs clients: [['output']]
Backtrace when the node is created(use Theano flag traceback.limit=N to make it longer):
File "stackoverflow.py", line 30, in
y = intOp(x)
File "/usr/local/lib/python2.7/dist-packages/theano/gof/op.py", line 611, in __call__
node = self.make_node(*inputs, **kwargs)
File "stackoverflow.py", line 11, in make_node
return theano.Apply(self, [x], [x.type()])
HINT: Use the Theano flag 'exception_verbosity=high' for a debugprint and storage map footprint of this apply node.
我对此感到惊讶,尤其是TypeError,因为我以为我已经将output_storage变量转换成了一个张量,但它似乎认为它仍然是一个ndarray。在