Hi everyone, I am struggling with this problem for more than a week now and I will appreciate ANY help and suggestions.
I am trying to implement this graphical model:
My implementation is:
def model(data): p = pyro.sample('p', dist.Beta(1, 1)) label_axis = pyro.plate("label_axis", data.shape, dim=-3) f_axis = pyro.plate("f_axis", data.shape, dim=-2) with label_axis: l = pyro.sample('l', dist.Bernoulli(p)) with f_axis: e = pyro.sample('e', dist.Beta(1, 10)) with label_axis, f_axis: f = pyro.sample('f', dist.Bernoulli(1-e), obs=data) f = l*f + (1-l)*(1-f) return f
However, this doesn’t seem to be right to me. The problem is “f”. Since its distribution is different from Bernoulli. To sample from f, I used a sample from a Bernoulli distribution and then changed the sampled value if l=0. But I don’t think that this would change the value that Pyro stores behind the scene for “f”. This would be a problem when it’s inferencing, right?
I wanted to use iterative plates instead of vectorized one, to be able to use control statements inside my plate. But apparently, this is not possible since I am reusing plates.
How can I correctly implement this PGM? Do I need to write a custom distribution? Or can I hack Pyro and change the stored value for “f” myself? Any type of help is appreciated! Cheers!