首页 > 解决方案 > 使用 PyMC3 时出现 Theano 错误:theano.gof.fg.MissingInputError

问题描述

我正在生成一些(嘈杂的)数据点(y),其中一些已知参数(m,c)表示直线方程。使用基于采样的贝叶斯方法,我现在想知道数据中参数 (m,c) 的真实值。因此,我使用 DE Metropolis (PyMC3) 来估计真实参数。

我收到 theano 错误theano.gof.fg.MissingInputError: Input 0 of the graph (indices start from 0), used to compute sigmoid(c_interval__), was not provided and not given a value.

Theano 版本:1.0.4

PyMC3 版本:3.9.1

import matplotlib.pyplot as plt
import numpy as np
import arviz as az
import pymc3
import theano.tensor as tt
from theano.compile.ops import as_op

plt.style.use("ggplot")

# define a theano Op for our likelihood function
class LogLike(tt.Op):
    itypes = [tt.dvector] # expects a vector of parameter values when called
    otypes = [tt.dscalar] # outputs a single scalar value (the log likelihood)

    def __init__(self, loglike, data, x, sigma):
        # add inputs as class attributes
        self.likelihood = loglike
        self.data = data
        self.x = x
        self.sigma = sigma

    def perform(self, node, inputs, outputs):
        # the method that is used when calling the Op
        theta, = inputs  # this will contain my variables

        # call the log-likelihood function
        logl = self.likelihood(theta, self.x, self.data, self.sigma)

        outputs[0][0] = np.array(logl) # output the log-likelihood


def my_model(theta, x):
    y = theta[0]*x + theta[1]
    return y

def my_loglike(theta, x, data, sigma):
    model = my_model(theta, x)
    ll = -(0.5/sigma**2)*np.sum((data - model)**2)
    return ll


# set up our data
N = 10  # number of data points
sigma = 1.  # standard deviation of noise
x = np.linspace(0., 9., N)

mtrue = 0.4  # true gradient
ctrue = 3.   # true y-intercept

truemodel = my_model([mtrue, ctrue], x)

# make data
np.random.seed(716742)  # set random seed, so the data is reproducible each time
data = sigma*np.random.randn(N) + truemodel
print(data)

ndraws = 3000  # number of draws from the distribution

# create our Op
logl = LogLike(my_loglike, data, x, sigma)

# use PyMC3 to sampler from log-likelihood
with pymc3.Model():
    # uniform priors on m and c
    m = pymc3.Uniform('m', lower=-10., upper=10.)
    c = pymc3.Uniform('c', lower=-10., upper=10.)

    # convert m and c to a tensor vector
    theta = tt.as_tensor_variable([m, c])

    # use a DensityDist (use a lamdba function to "call" the Op)
    pymc3.DensityDist('likelihood', lambda v: logl(v), observed={'v': theta})

    step = pymc3.DEMetropolis()
    trace = pymc3.sample(ndraws, step)

# plot the traces
axes = az.plot_trace(trace)
fig = axes.ravel()[0].figure
fig.savefig('./trace_plots.png')

在这里找到完整的跟踪:

Population sampling (4 chains)
DEMetropolis: [c, m]
Attempting to parallelize chains to all cores. You can turn this off with `pm.sample(cores=1)`.
Population parallelization failed. Falling back to sequential stepping of chains.---------------------| 0.00% [0/4 00:00<00:00]
Sampling 4 chains for 0 tune and 4_000 draw iterations (0 + 16_000 draws total) took 5 seconds.███████| 100.00% [4000/4000 00:04<00:00]
Traceback (most recent call last):
  File "test.py", line 75, in <module>
    trace = pymc3.sample(ndraws, step)
  File "/home/csl_user/.local/lib/python3.7/site-packages/pymc3/sampling.py", line 599, in sample
    idata = arviz.from_pymc3(trace, **ikwargs)
  File "/home/csl_user/.local/lib/python3.7/site-packages/arviz/data/io_pymc3.py", line 531, in from_pymc3
    save_warmup=save_warmup,
  File "/home/csl_user/.local/lib/python3.7/site-packages/arviz/data/io_pymc3.py", line 159, in __init__
    self.observations, self.multi_observations = self.find_observations()
  File "/home/csl_user/.local/lib/python3.7/site-packages/arviz/data/io_pymc3.py", line 172, in find_observations
    multi_observations[key] = val.eval() if hasattr(val, "eval") else val
  File "/home/csl_user/.local/lib/python3.7/site-packages/theano/gof/graph.py", line 522, in eval
    self._fn_cache[inputs] = theano.function(inputs, self)
  File "/home/csl_user/.local/lib/python3.7/site-packages/theano/compile/function.py", line 317, in function
    output_keys=output_keys)
  File "/home/csl_user/.local/lib/python3.7/site-packages/theano/compile/pfunc.py", line 486, in pfunc
    output_keys=output_keys)
  File "/home/csl_user/.local/lib/python3.7/site-packages/theano/compile/function_module.py", line 1839, in orig_function
    name=name)
  File "/home/csl_user/.local/lib/python3.7/site-packages/theano/compile/function_module.py", line 1487, in __init__
    accept_inplace)
  File "/home/csl_user/.local/lib/python3.7/site-packages/theano/compile/function_module.py", line 181, in std_fgraph
    update_mapping=update_mapping)
  File "/home/csl_user/.local/lib/python3.7/site-packages/theano/gof/fg.py", line 175, in __init__
    self.__import_r__(output, reason="init")
  File "/home/csl_user/.local/lib/python3.7/site-packages/theano/gof/fg.py", line 346, in __import_r__
    self.__import__(variable.owner, reason=reason)
  File "/home/csl_user/.local/lib/python3.7/site-packages/theano/gof/fg.py", line 391, in __import__
    raise MissingInputError(error_msg, variable=r)
theano.gof.fg.MissingInputError: Input 0 of the graph (indices start from 0), used to compute sigmoid(c_interval__), was not provided and not given a value. Use the Theano flag exception_verbosity='high', for more information on this error.

标签: python-3.xtheanopymc3

解决方案


在按照示例如何从此处找到的黑盒可能性中进行采样时,我遇到了同样的问题: https ://docs.pymc.io/notebooks/blackbox_external_likelihood.html

这似乎是一个版本问题。我在 Manjaro Linux 上,还使用 ​​python 3.8 运行了 theano 1.0.4 和 pymc3 3.9。我可以通过降级到 python 3.7 和 pymc3 3.8 来解决这个问题并使代码正常工作。这似乎是 python 3.8 的问题,因为简单地降级 pymc3 并没有解决我的问题。我远不是 pymc3 的专家,所以我没有解决方案如何使用最新版本解决这个问题,但现在降级使我的模拟运行。

希望这可以帮助。

编辑:开发人员似乎意识到了这一点,他们的 github 页面上有一个未解决的问题

https://github.com/pymc-devs/pymc3/issues/4002


推荐阅读