Ошибка Theano при использовании PyMC3: theano.gof.fg.MissingInputError - PullRequest
0 голосов
/ 08 июля 2020

Я генерирую некоторые (зашумленные) точки данных (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.

1 Ответ

0 голосов
/ 09 июля 2020
• 1000 Я использую Manjaro Linux, а также запускал theano 1.0.4 и pymc3 3.9, используя python 3.8. Я мог решить проблему и заставить код работать, понизив версию до python 3.7 и pymc3 3.8. Похоже, это проблема с python 3.8, поскольку простой переход на более раннюю версию pymc3 не решил проблему для меня. Я далек от эксперта в pymc3, поэтому у меня нет решения, как исправить эту проблему с помощью новейших версий, но сейчас при переходе на более раннюю версию мои симуляции запускаются.

Надеюсь, это поможет.

Изменить: разработчики, похоже, знают об этом, на их странице github есть открытая проблема

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

...