TypeError:MaxAndArgmax需要一个任意/自定义分布函数的常量轴

时间:2016-01-14 17:53:02

标签: theano pymc pymc3

我正在尝试定义一个非常复杂的多变量,连续,自定义/任意分布函数,并使用NUTS从中进行采样。我这样做时收到以下错误:

ERROR (theano.gof.opt): SeqOptimizer apply <theano.scan_module.scan_opt.PushOutNonSeqScan object at 0x000000000AC0E390>

ERROR:theano.gof.opt:SeqOptimizer apply <theano.scan_module.scan_opt.PushOutNonSeqScan object at 0x000000000AC0E390>

ERROR (theano.gof.opt): Traceback:
ERROR:theano.gof.opt:Traceback:

ERROR (theano.gof.opt): Traceback (most recent call last):
  File "C:\Anaconda\envs\py3conda\lib\site-packages\theano\gof\opt.py", line 196, in apply
    sub_prof = optimizer.optimize(fgraph)
  File "C:\Anaconda\envs\py3conda\lib\site-packages\theano\gof\opt.py", line 82, in optimize
    ret = self.apply(fgraph, *args, **kwargs)
  File "C:\Anaconda\envs\py3conda\lib\site-packages\theano\scan_module\scan_opt.py", line 216, in apply
    self.process_node(fgraph, node)
  File "C:\Anaconda\envs\py3conda\lib\site-packages\theano\scan_module\scan_opt.py", line 282, in process_node
    **dict(return_list=True))[0].owner
  File "C:\Anaconda\envs\py3conda\lib\site-packages\theano\gof\op.py", line 507, 
in __call__
    node = self.make_node(*inputs, **kwargs)
  File "C:\Anaconda\envs\py3conda\lib\site-packages\theano\tensor\basic.py", line 1252, in make_node
    raise TypeError("MaxAndArgmax needs a constant axis")

TypeError: MaxAndArgmax needs a constant axis

我确保自定义logp函数的输出是一个theano变量标量,并且在我的自定义分发声明之外,我能够成功编译一个返回logp的theano函数,然后还有关于它的渐变多变量输入。我的自定义分发函数不使用扫描操作,它似乎在生成上述错误中起作用。关于扫描操作,我也会收到推断形状警告(我可以在此处跟踪该错误消息)。

根据我所做的研究,在我看来,问题可能来自NUTS对粗麻布的计算,但我不确定。我对pymc3和theano没有经验,所以非常感谢这里的任何见解。

谢谢!

亚历

更新:

我现在相当确信粗麻布导致了这个错误,所以这变得更像是aano问题而不是pymc3问题。我能够通过完全评估pymc3之外的theano.gradient.hessian()函数来测试这一点,并且我收到了完全相同的错误。此外,类似于issue,我使用tensor.min()来评估导致上述错误的似然函数。但是,我用sum()替换min()来进行双重检查,而theano仍然无法编译我的函数但是没有抛出错误(刚刚被阻止)......但仅限于gpu。仍然保持&#34;假&#34; sum()操作在那里,粗麻布在我的cpu上成功评估。无论如何,我认为我的似然函数在连续性和凸性方面存在问题,因此不会沿着这条路走下去。

0 个答案:

没有答案