Hi!
I am getting started to work with BayesFlow on the dev
branch (latest commit 8210610). Sorry for all the questions!
I am trying to load a saved approximator model via keras.saving.load_model("approximator.keras")
and sample from it. However, I encounter an error when calling .sample()
Here’s an example based on the linear regression notebook:
import os
if "KERAS_BACKEND" not in os.environ:
# set this to "torch", "tensorflow", or "jax"
os.environ["KERAS_BACKEND"] = "torch"
import bayesflow as bf
import keras
import numpy as np
def prior():
# beta: regression coefficients (intercept, slope)
beta = np.random.normal([2, 0], [3, 1])
return dict(beta=beta)
def likelihood(beta):
# x: predictor variable
x = np.random.normal(0, 1, size=10)
# y: response variable
y = np.random.normal(beta[0] + beta[1] * x, size=10)
return dict(y=y, x=x)
simulator = bf.simulators.make_simulator([prior, likelihood])
adapter = (
bf.Adapter()
.as_set(["x", "y"])
.standardize()
.concatenate(["beta"], into="inference_variables")
.concatenate(["x", "y"], into="summary_variables")
)
inference_network = bf.networks.FlowMatching()
summary_network = bf.networks.DeepSet(depth=2)
approximator = bf.ContinuousApproximator(
inference_network=inference_network,
summary_network=summary_network,
adapter=adapter,
)
epochs = 1
num_batches = 1
batch_size = 8
optimizer = keras.optimizers.Adam(learning_rate=5e-4, clipnorm=1.0)
approximator.compile(optimizer=optimizer)
history = approximator.fit(
epochs=epochs,
num_batches=num_batches,
batch_size=batch_size,
simulator=simulator,
)
# Save and reload the model
approximator.save("approximator.keras")
loaded_approximator = keras.saving.load_model("approximator.keras")
# Try sampling
num_samples = 1000
val_sims = simulator.sample(200)
conditions = {k: v for k, v in val_sims.items() if k != "beta"}
pdraws = loaded_approximator.sample(conditions=conditions, num_samples=num_samples)
But I get this error message:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
File /data/homes/reiser/projects/bayesflow/issue.py:63
60 conditions = {k: v for k, v in val_sims.items() if k != "beta"}
62 # obtain num_samples samples of the parameter posterior for every valididation dataset
---> 63 pdraws = loaded_approximator.sample(conditions=conditions, num_samples=num_samples)
File ~/projects/bayesflow/bayesflow/approximators/continuous_approximator.py:142, in ContinuousApproximator.sample(self, num_samples, conditions, split, **kwargs)
134 def sample(
135 self,
136 *,
(...)
140 **kwargs,
141 ) -> dict[str, np.ndarray]:
--> 142 conditions = self.adapter(conditions, strict=False, stage="inference", **kwargs)
143 conditions = keras.tree.map_structure(keras.ops.convert_to_tensor, conditions)
144 conditions = {"inference_variables": self._sample(num_samples=num_samples, **conditions, **kwargs)}
File ~/projects/bayesflow/bayesflow/adapters/adapter.py:76, in Adapter.__call__(self, data, inverse, **kwargs)
73 if inverse:
74 return self.inverse(data, **kwargs)
---> 76 return self.forward(data, **kwargs)
File ~/projects/bayesflow/bayesflow/adapters/adapter.py:60, in Adapter.forward(self, data, **kwargs)
57 data = data.copy()
...
---> 57 raise ValueError("Cannot call `forward` with `strict=False` before calling `forward` with `strict=True`.")
59 # copy to avoid side effects
60 data = data.copy()
ValueError: Cannot call `forward` with `strict=False` before calling `forward` with `strict=True`.
It seems like the adapter in loaded_approximator
is not properly initialized after loading the model.
What would be the correct way to load the trained approximator model?
Thank you!