BayesFlow is a Python library for simulation-based Amortized Bayesian Inference with neural networks. It provides users and researchers with:
- A user-friendly API for rapid Bayesian workflows
- A rich collection of neural network architectures
- Multi-backend support via Keras3: You can use PyTorch, TensorFlow, or JAX
BayesFlow (version 2+) is designed to be a flexible and efficient tool that enables rapid statistical inference fueled by continuous progress in generative AI and Bayesian inference.

A cornerstone idea of amortized Bayesian inference is to employ generative neural networks for parameter estimation, model comparison, and model validation when working with intractable simulators whose behavior as a whole is too complex to be described analytically.
Using the high-level interface is easy, as demonstrated by the minimal working example below:
import bayesflow as bf
workflow = bf.BasicWorkflow(
inference_network=bf.networks.FlowMatching(),
summary_network=bf.networks.TimeSeriesTransformer(),
inference_variables=["parameters"],
summary_variables=["observables"],
simulator=bf.simulators.SIR()
)
history = workflow.fit_online(epochs=50, batch_size=32, num_batches_per_epoch=500)
diagnostics = workflow.plot_default_diagnostics(test_data=300)
For an in-depth exposition, check out our walkthrough notebooks below.
- Linear regression starter example
- From ABC to BayesFlow
- Two moons starter example
- Rapid iteration with point estimators
- SIR model with custom summary network
- Bayesian experimental design
- Simple model comparison example
More tutorials are always welcome! Please consider making a pull request if you have a cool application that you want to contribute.
BayesFlow is available to install via pip:
pip install bayesflow
To use BayesFlow, you will also need to install one of the following machine learning backends. Note that BayesFlow will not run without a backend.
If you don't know which backend to use, we recommend JAX as it is currently the fastest backend.
Once installed, set the backend environment variable as required by keras. For example, inside your Python script write:
import os
os.environ["KERAS_BACKEND"] = "jax"
import bayesflow
If you use conda, you can alternatively set this individually for each environment in your terminal. For example:
conda env config vars set KERAS_BACKEND=jax
Or just plainly set the environment variable in your shell:
export KERAS_BACKEND=jax
This way, you also don't have to manually set the backend every time you are starting Python to use BayesFlow.
Caution: Some development environments (e.g., VSCode or PyCharm) can silently overwrite environment variables. If you have set your backend as an environment variable and you still get keras-related import errors when loading BayesFlow, these IDE shenanigans might be the culprit. Try setting the keras backend in your Python script via import os; os.environ["KERAS_BACKEND"] = "<YOUR-BACKEND>"
.
If you want to contribute to BayesFlow, we recommend installing it from source, see CONTRIBUTING.md for more details.
If you encounter any issues, please don't hesitate to open an issue here on Github or ask questions on our Discourse Forums.
Documentation is available at https://bayesflow.org. Please use the BayesFlow Forums for any BayesFlow-related questions and discussions, and GitHub Issues for bug reports and feature requests.
You can cite BayesFlow along the lines of:
- We approximated the posterior using neural posterior estimation (NPE) with learned summary statistics (Radev et al., 2020), as implemented in the BayesFlow framework for amortized Bayesian inference (Radev et al., 2023a).
- We approximated the likelihood using neural likelihood estimation (NLE) without hand-crafted summary statistics (Papamakarios et al., 2019), leveraging its implementation in BayesFlow for efficient and flexible inference.
- Radev, S. T., Schmitt, M., Schumacher, L., Elsemüller, L., Pratz, V., Schälte, Y., Köthe, U., & Bürkner, P.-C. (2023a). BayesFlow: Amortized Bayesian workflows with neural networks. The Journal of Open Source Software, 8(89), 5702.(arXiv)(JOSS)
- Radev, S. T., Mertens, U. K., Voss, A., Ardizzone, L., Köthe, U. (2020). BayesFlow: Learning complex stochastic models with invertible neural networks. IEEE Transactions on Neural Networks and Learning Systems, 33(4), 1452-1466. (arXiv)(IEEE TNNLS)
- Radev, S. T., Schmitt, M., Pratz, V., Picchini, U., Köthe, U., & Bürkner, P.-C. (2023b). JANA: Jointly amortized neural approximation of complex Bayesian models. Proceedings of the Thirty-Ninth Conference on Uncertainty in Artificial Intelligence, 216, 1695-1706. (arXiv)(PMLR)
BibTeX:
@article{bayesflow_2023_software,
title = {{BayesFlow}: Amortized {B}ayesian workflows with neural networks},
author = {Radev, Stefan T. and Schmitt, Marvin and Schumacher, Lukas and Elsemüller, Lasse and Pratz, Valentin and Schälte, Yannik and Köthe, Ullrich and Bürkner, Paul-Christian},
journal = {Journal of Open Source Software},
volume = {8},
number = {89},
pages = {5702},
year = {2023}
}
@article{bayesflow_2020_original,
title = {{BayesFlow}: Learning complex stochastic models with invertible neural networks},
author = {Radev, Stefan T. and Mertens, Ulf K. and Voss, Andreas and Ardizzone, Lynton and K{\"o}the, Ullrich},
journal = {IEEE transactions on neural networks and learning systems},
volume = {33},
number = {4},
pages = {1452--1466},
year = {2020}
}
@inproceedings{bayesflow_2023_jana,
title = {{JANA}: Jointly amortized neural approximation of complex {B}ayesian models},
author = {Radev, Stefan T. and Schmitt, Marvin and Pratz, Valentin and Picchini, Umberto and K\"othe, Ullrich and B\"urkner, Paul-Christian},
booktitle = {Proceedings of the Thirty-Ninth Conference on Uncertainty in Artificial Intelligence},
pages = {1695--1706},
year = {2023},
volume = {216},
series = {Proceedings of Machine Learning Research},
publisher = {PMLR}
}
Question: I am starting with Bayesflow, which backend should I use?
Answer: We recommend JAX as it is currently the fastest backend.
Question:
I am getting ModuleNotFoundError: No module named 'tensorflow'
when I try to import BayesFlow.
Answer: One of these applies:
-
You want to use tensorflow as your backend, but you have not installed it. See here.
-
You want to use a backend other than tensorflow, but have not set the environment variable correctly. See here.
-
You have set the environment variable, but it is not being picked up by Python. This can happen silently in some development environments (e.g., VSCode or PyCharm). Try setting the backend as shown here in your Python script via
os.environ
.
Question: What is the difference between Bayesflow 2.0+ and previous versions?
Answer: BayesFlow 2.0+ is a complete rewrite of the library. It shares the same overall goals with previous versions, but has much better modularity and extensibility. What is more, the new BayesFlow has multi-backend support via Keras3, while the old version was based on TensorFlow.
Question: I still need the old BayesFlow for some of my projects. How can I install it?
Answer:
You can find and install the old Bayesflow version via the stable-legacy
branch on GitHub.
If you are interested in a curated list of resources, including reviews, software, papers, and other resources related to amortized inference, feel free to explore our community-driven list.
This project is currently managed by researchers from Rensselaer Polytechnic Institute, TU Dortmund University, and Heidelberg University. It is partially funded by the Deutsche Forschungsgemeinschaft (DFG, German Research Foundation) Projects 528702768 and 508399956. The project is further supported by Germany's Excellence Strategy -- EXC-2075 - 390740016 (Stuttgart Cluster of Excellence SimTech) and EXC-2181 - 390900948 (Heidelberg Cluster of Excellence STRUCTURES), the collaborative research cluster TRR 391 – 520388526, as well as the Informatics for Life initiative funded by the Klaus Tschira Foundation.