Hi,
I am trying to write a simple mixture model, but running into an error:
import pyro, numpy as np, torch, pyro.distributions as dist, torch.nn as nn
from pyro.optim import Adam
from pyro.infer import SVI, Trace_ELBO
from torch.autograd import Variable
import torch.distributions.constraints as constraints
data_y= [1.0, 1.0,2.0,100.0,101.0,120.0,4.0,2.0,1.0]
data_y = [torch.tensor(x) for x in data_y]
p=2
pyro.enable_validation(True)
def model(data_y):
mu = pyro.sample("mu", dist.Normal(0*torch.ones(p), 1*torch.ones(p)))
sigma = pyro.sample("sigma", dist.Normal(0*torch.ones(p), 1*torch.ones(p)))
theta = pyro.sample("theta", dist.Dirichlet(torch.ones(p)))
print(mu)
cat = pyro.sample("cat", dist.Categorical(theta))
pyro.sample("obs", dist.Normal(mu[cat], sigma[cat]), obs=data_y)
def guide(data_y):
mu_mu = pyro.param("mu_q", torch.ones(p))
mu_sigma = pyro.param("mu_sigma", torch.ones(p), constraint=constraints.positive)
mu = pyro.sample("mu", dist.Normal(mu_mu, mu_sigma))
print(mu)
sigma_mu = pyro.param("sigma_q", torch.ones(p), constraint=constraints.positive)
sigma_sigma = pyro.param("sigma_sigma", torch.ones(p), constraint=constraints.positive)
sigma = pyro.sample("sigma", dist.Normal(sigma_mu, sigma_sigma))
theta_mu = pyro.param("theta_q", torch.ones(p)/p, constraint=constraints.simplex)
theta = pyro.sample("theta", dist.Dirichlet(theta_mu))
pyro.sample("cat", dist.Categorical(theta))
optim = Adam({'lr': 0.001})
svi = SVI(model, guide, optim, loss=Trace_ELBO())
for i in range(100):
loss = svi.step(data_y)
if ((i % 100) == 0):
print((loss / float(len(data_y))))
for name in pyro.get_param_store().get_all_param_names():
print(name)
print(pyro.param(name))
It prints the error:
tensor([ 1.1412, -1.1431], grad_fn=<ThAddBackward>)
tensor([ 1.1412, -1.1431], grad_fn=<ThAddBackward>)
Traceback (most recent call last):
File "/usr/local/lib/python3.6/dist-packages/pyro/poutine/trace_struct.py", line 249, in compute_log_prob
site["log_prob"]
KeyError: 'log_prob'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "test.py", line 44, in <module>
loss = svi.step(data_y)
File "/usr/local/lib/python3.6/dist-packages/pyro/infer/svi.py", line 75, in step
loss = self.loss_and_grads(self.model, self.guide, *args, **kwargs)
File "/usr/local/lib/python3.6/dist-packages/pyro/infer/trace_elbo.py", line 107, in loss_and_grads
for model_trace, guide_trace in self._get_traces(model, guide, *args, **kwargs):
File "/usr/local/libs/python3.6/dist-packages/pyro/infer/trace_elbo.py", line 68, in _get_traces
model_trace.compute_log_prob()
File "/usr/local/lib/python3.6/dist-packages/pyro/poutine/trace_struct.py", line 252, in compute_log_prob
site_log_p = site["fn"].log_prob(site["value"], *args, **kwargs)
File "/usr/local/lib/python3.6/dist-packages/torch/distributions/normal.py", line 63, in log_prob
self._validate_sample(value)
File "/usr/local/lib/python3.6/dist-packages/torch/distributions/distribution.py", line 206, in _validate_sample
raise ValueError('The value argument to log_prob must be a Tensor')
ValueError: The value argument to log_prob must be a Tensor
Am i missing something here? Please suggest something
i am using Python 3.6 and Pyro 0.2.1