python数值运算m op n_自定义ano Op进行数值积分

我试图编写一个自定义的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。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值