Hi, I’m using pyro to optimize my agent model, below is my code:

X = data_1[‘params’] #130×3

Cp_E = data_1[‘Cp_E’] #the obs, which is 400×1

Y = data_1[‘Cp_M’] #130×400

X = torch.tensor(X, dtype=torch.float)

Y = torch.tensor(Y, dtype=torch.float)

Cp_E = torch.tensor(Cp_E, dtype=torch.float)

gaussian=GaussianProcessRegressor()

fiting=gaussian.fit(X, Y)

r1 = 0.

r2 = 0.

r3 = 0.

def model(r1, r2, r3):

beta2 = pyro.sample(“beta2”, dist.Uniform(r1, 0.5))

betaStar = pyro.sample(“betaStar”, dist.Uniform(r2, 0.5))

a1 = pyro.sample(“a1”, dist.Uniform(r3, 1))

Z = np.array([beta2, betaStar, a1])

YX=gaussian.predict(Z.reshape(1, -1))

#the YX has 400 numbers, which is 400×1

YX = pyro.param(“YX”, torch.tensor(YX))

return YX

conditioned_model = pyro.condition(model, data={“YX”: Cp_E})

#the Cp_E is the observed value, which is 400×1

def guide(r1, r2, r3):

mean1 = pyro.param(“mean1”, torch.tensor(0.08))

mean2 = pyro.param(“mean2”, torch.tensor(0.09))

mean3 = pyro.param(“mean3”, torch.tensor(0.31))

va1 = pyro.param(“va1”, torch.tensor(1.), constraint=constraints.positive)

va2 = pyro.param(“va2”, torch.tensor(1.), constraint=constraints.positive)

va3 = pyro.param(“va3”, torch.tensor(1.), constraint=constraints.positive)

beta2 = pyro.sample(“beta2”, dist.Normal(mean1, va1))

betaStar = pyro.sample(“betaStar”, dist.Normal(mean2, va2))

a1 = pyro.sample(“a1”, dist.Normal(mean3, va3))

from pyro.infer import SVI, Trace_ELBO

svi = SVI(model=conditioned_model, guide=guide, optim=Adam({“lr”: .001, “betas”: (0.95, 0.999)}), loss=Trace_ELBO())

losses, beta2, betaStar, a1 = [], [], [], []

num_steps = 5000

for t in range(num_steps):

losses.append(svi.step(r1, r2, r3))

beta2.append(pyro.param(“mean1”).item())

betaStar.append(pyro.param(“mean2”).item())

a1.append(pyro.param(“mean3”).item())

The problem is the “mean1”, “mean2” and “mean3” have the same value in these 5000 steps, and the losses are all inf.

But when I make the model as:

r1 = 0.0828

r2 = 0.09

r3 = 0.31

def model(r1, r2, r3):

beta2 = pyro.sample(“beta2”, dist.Normal(r1, 1))

betaStar = pyro.sample(“betaStar”, dist.Normal(r2, 1))

a1 = pyro.sample(“a1”, dist.Normal(r3, 1))

Z = np.array([beta2, betaStar, a1])

YX=gaussian.predict(Z.reshape(1, -1))

YX = pyro.param(“YX”, torch.tensor(YX))

return YX

the losses are falling, the value of “mean” also changed, but did not achieve the optimized effect.

Actually I also want to real-time monitor the changes of “beta2”, “betaStar” and “a1” at each step, but I can’t get them by pyro.get_param_store().items(), so I just monitor the mean value of these parameters.

My problem has not been solved yet, I would like to ask any suggestions, thanks in advance.