diff --git a/doc/links.rst b/doc/links.rst
index d773d1aec33e5f0a5f802b6934160a9bfe51c96c..2e4540828cdfa3ee4f2b9d729c38b44b2b9e2b58 100644
--- a/doc/links.rst
+++ b/doc/links.rst
@@ -21,3 +21,10 @@
 .. _PadChest: https://bimcv.cipf.es/bimcv-projects/padchest/
 .. _TBX11K: https://mmcheng.net/tb/
 .. _TBX11K_simplified: https://www.kaggle.com/datasets/vbookshelf/tbx11k-simplified
+
+.. models
+.. _imagenet: https://www.image-net.org
+.. _alexnet: https://en.wikipedia.org/wiki/AlexNet
+.. _alexnet_pytorch: https://pytorch.org/hub/pytorch_vision_alexnet/
+.. _densenet: https://arxiv.org/abs/1608.06993
+.. _densenet_pytorch: https://pytorch.org/hub/pytorch_vision_densenet/
diff --git a/pyproject.toml b/pyproject.toml
index 67bd370c5e8827b4d2e2a38e24db8ee3272057fb..f2de6fd46df9574bf29241d6fdf6515382474e00 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -71,7 +71,7 @@ ptbench = "ptbench.scripts.cli:cli"
 
 # models
 pasa = "ptbench.models.config.pasa"
-signs-to-tb = "ptbench.models.config.signs_to_tb"
+mlp = "ptbench.models.config.mlp"
 logistic-regression = "ptbench.models.config.logistic_regression"
 alexnet = "ptbench.models.config.alexnet"
 alexnet-pretrained = "ptbench.models.config.alexnet_pretrained"
diff --git a/src/ptbench/data/hivtb/datamodule.py b/src/ptbench/data/hivtb/datamodule.py
index 2f1dcb855033cc5bb182c571dad2d3e1932f6e82..2c68c85d54ca9d0369d5a3472cb816bc1859bc87 100644
--- a/src/ptbench/data/hivtb/datamodule.py
+++ b/src/ptbench/data/hivtb/datamodule.py
@@ -1,6 +1,11 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""HIV-TB dataset for computer-aided diagnosis (only BMP files)
+
+Database reference: [HIV-TB-2019]_
+"""
+
 
 import importlib.resources
 import os
diff --git a/src/ptbench/data/hivtb/fold_0.py b/src/ptbench/data/hivtb/fold_0.py
index 6919907d05c598567e376abbc7f6256de422d086..c8a11de17b265005b9bb209c8a7ca16e82f83064 100644
--- a/src/ptbench/data/hivtb/fold_0.py
+++ b/src/ptbench/data/hivtb/fold_0.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-0.json")
 """HIV-TB dataset for TB detection (cross validation fold 0).
 
+Database reference: [HIV-TB-2019]_
+
 See :py:class:`.hivtb.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-0.json")
diff --git a/src/ptbench/data/hivtb/fold_1.py b/src/ptbench/data/hivtb/fold_1.py
index 1f4b1dd05dfa9d1bb1265e083aa268fdad84bd60..3b2434e0762250518fd3bfd58fc13d14617a6d7e 100644
--- a/src/ptbench/data/hivtb/fold_1.py
+++ b/src/ptbench/data/hivtb/fold_1.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-1.json")
 """HIV-TB dataset for TB detection (cross validation fold 1).
 
+Database reference: [HIV-TB-2019]_
+
 See :py:class:`.hivtb.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-1.json")
diff --git a/src/ptbench/data/hivtb/fold_2.py b/src/ptbench/data/hivtb/fold_2.py
index 9c9fbe653b9d16e7a1884886a664560a8c7b50c4..ac95eca19a012d315d0b4c91a8afd0e8dedf69bb 100644
--- a/src/ptbench/data/hivtb/fold_2.py
+++ b/src/ptbench/data/hivtb/fold_2.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-2.json")
 """HIV-TB dataset for TB detection (cross validation fold 2).
 
+Database reference: [HIV-TB-2019]_
+
 See :py:class:`.hivtb.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-2.json")
diff --git a/src/ptbench/data/hivtb/fold_3.py b/src/ptbench/data/hivtb/fold_3.py
index ef07c5911afee96ebddcfc1778de93c5688618af..1d662e2773bcb9e511ae2478bf3525ef269d3ff4 100644
--- a/src/ptbench/data/hivtb/fold_3.py
+++ b/src/ptbench/data/hivtb/fold_3.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-3.json")
 """HIV-TB dataset for TB detection (cross validation fold 3).
 
+Database reference: [HIV-TB-2019]_
+
 See :py:class:`.hivtb.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-3.json")
diff --git a/src/ptbench/data/hivtb/fold_4.py b/src/ptbench/data/hivtb/fold_4.py
index 6683006d46bfd818184a8e483a182a058da4cdc9..1f59dcf53fae47a7d44d28beae581930df6f9201 100644
--- a/src/ptbench/data/hivtb/fold_4.py
+++ b/src/ptbench/data/hivtb/fold_4.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-4.json")
 """HIV-TB dataset for TB detection (cross validation fold 4).
 
+Database reference: [HIV-TB-2019]_
+
 See :py:class:`.hivtb.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-4.json")
diff --git a/src/ptbench/data/hivtb/fold_5.py b/src/ptbench/data/hivtb/fold_5.py
index cf67833ade85503f8f9d3322969c155fd98f1f6a..03170e280e35c77cffcb58919b5fadc1411f93c1 100644
--- a/src/ptbench/data/hivtb/fold_5.py
+++ b/src/ptbench/data/hivtb/fold_5.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-5.json")
 """HIV-TB dataset for TB detection (cross validation fold 5).
 
+Database reference: [HIV-TB-2019]_
+
 See :py:class:`.hivtb.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-5.json")
diff --git a/src/ptbench/data/hivtb/fold_6.py b/src/ptbench/data/hivtb/fold_6.py
index 94614fc4887046c671e4b395e070d4e38e5a7143..9950b0df32b299344d9df5e1df11c615b000dea9 100644
--- a/src/ptbench/data/hivtb/fold_6.py
+++ b/src/ptbench/data/hivtb/fold_6.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-6.json")
 """HIV-TB dataset for TB detection (cross validation fold 6).
 
+Database reference: [HIV-TB-2019]_
+
 See :py:class:`.hivtb.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-6.json")
diff --git a/src/ptbench/data/hivtb/fold_7.py b/src/ptbench/data/hivtb/fold_7.py
index 259446c884f32d1d4f2f0c0e748a448d62a756e4..043ef9decfaf0ebac356bdd59fbeae3e361b5e3b 100644
--- a/src/ptbench/data/hivtb/fold_7.py
+++ b/src/ptbench/data/hivtb/fold_7.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-7.json")
 """HIV-TB dataset for TB detection (cross validation fold 7).
 
+Database reference: [HIV-TB-2019]_
+
 See :py:class:`.hivtb.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-7.json")
diff --git a/src/ptbench/data/hivtb/fold_8.py b/src/ptbench/data/hivtb/fold_8.py
index d243db082cdbc758308cffd074a449e54529dfce..9aa80c5174725280e2a2fda667cc5010baae70ad 100644
--- a/src/ptbench/data/hivtb/fold_8.py
+++ b/src/ptbench/data/hivtb/fold_8.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-8.json")
 """HIV-TB dataset for TB detection (cross validation fold 8).
 
+Database reference: [HIV-TB-2019]_
+
 See :py:class:`.hivtb.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-8.json")
diff --git a/src/ptbench/data/hivtb/fold_9.py b/src/ptbench/data/hivtb/fold_9.py
index 340bc66169660a56f4007dac763414f2e0bf2eb4..94a38a15e01a05f9917f0d14a4fe1062b516ed6c 100644
--- a/src/ptbench/data/hivtb/fold_9.py
+++ b/src/ptbench/data/hivtb/fold_9.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-9.json")
 """HIV-TB dataset for TB detection (cross validation fold 9).
 
+Database reference: [HIV-TB-2019]_
+
 See :py:class:`.hivtb.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-9.json")
diff --git a/src/ptbench/data/indian/datamodule.py b/src/ptbench/data/indian/datamodule.py
index ee53da8045ba01d5434428665c64f1a830197b56..a17a0befefad3dd84934acc8990575fc0befbb45 100644
--- a/src/ptbench/data/indian/datamodule.py
+++ b/src/ptbench/data/indian/datamodule.py
@@ -1,6 +1,10 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Indian database for TB detection (a.k.a. Dataset A/Dataset B).
+
+Database reference: [INDIAN-2013]_
+"""
 
 import importlib.resources
 
@@ -19,13 +23,14 @@ def make_split(basename: str) -> DatabaseSplit:
 
 
 class DataModule(CachingDataModule):
-    """Indian collection dataset for computer-aided diagnosis.
+    """Indian database for TB detection (a.k.a. Dataset A/Dataset B).
 
     The Indian collection database has been established to foster research in
     computer-aided diagnosis of pulmonary diseases with a special focus on
     pulmonary tuberculosis (TB).  This database is also known as the "Database
     A/Database B" database.
 
+    * Database reference: [INDIAN-2013]_
     * Original images PNG, 8-bit grayscale, 1024 x 1024 pixels
     * Split reference: [INDIAN-2013]_ with 20% of train set for the validation set
 
diff --git a/src/ptbench/data/indian/default.py b/src/ptbench/data/indian/default.py
index 2b8a8fb25e09b85f372e854a2f2ce29bcdf56ddc..cd5c98bf6f4fe89a43a0e9a186230f48184edcef 100644
--- a/src/ptbench/data/indian/default.py
+++ b/src/ptbench/data/indian/default.py
@@ -1,6 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Indian database for TB detection (a.k.a. Dataset A/Dataset B).
+
+Database reference: [INDIAN-2013]_
+
+See :py:class:`.indian.datamodule.DataModule` for technical details.
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/indian/fold_0.py b/src/ptbench/data/indian/fold_0.py
index 635b542f70fe5d2a1733ce324dd0b5aa7c15dcb8..e316888dfe470098fe3f4404b101c6d256376cbf 100644
--- a/src/ptbench/data/indian/fold_0.py
+++ b/src/ptbench/data/indian/fold_0.py
@@ -1,12 +1,14 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-0.json")
 """Indian collection dataset for computer-aided diagnosis (cross validation
 fold 0).
 
+Database reference: [INDIAN-2013]_
+
 See :py:class:`.indian.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-0.json")
diff --git a/src/ptbench/data/indian/fold_1.py b/src/ptbench/data/indian/fold_1.py
index 5a3a0213717508854ed579b53620b7f4b57230b8..000a8410b9a18131a78ec08c5ab1c772ee6263ac 100644
--- a/src/ptbench/data/indian/fold_1.py
+++ b/src/ptbench/data/indian/fold_1.py
@@ -1,12 +1,14 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-1.json")
 """Indian collection dataset for computer-aided diagnosis (cross validation
 fold 1).
 
+Database reference: [INDIAN-2013]_
+
 See :py:class:`.indian.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-1.json")
diff --git a/src/ptbench/data/indian/fold_2.py b/src/ptbench/data/indian/fold_2.py
index cbf1aee45872a7af3434fa18b5241bc3251ab868..9f9152b3ba40d54d6feb4ececed049cd12e08705 100644
--- a/src/ptbench/data/indian/fold_2.py
+++ b/src/ptbench/data/indian/fold_2.py
@@ -1,12 +1,14 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-2.json")
 """Indian collection dataset for computer-aided diagnosis (cross validation
 fold 2).
 
+Database reference: [INDIAN-2013]_
+
 See :py:class:`.indian.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-2.json")
diff --git a/src/ptbench/data/indian/fold_3.py b/src/ptbench/data/indian/fold_3.py
index 369c952879249aba105feb35b50d232193433c6f..16475b98d6c44947ae7ef12a239be10e3a726730 100644
--- a/src/ptbench/data/indian/fold_3.py
+++ b/src/ptbench/data/indian/fold_3.py
@@ -1,12 +1,14 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-3.json")
 """Indian collection dataset for computer-aided diagnosis (cross validation
 fold 3).
 
+Database reference: [INDIAN-2013]_
+
 See :py:class:`.indian.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-3.json")
diff --git a/src/ptbench/data/indian/fold_4.py b/src/ptbench/data/indian/fold_4.py
index e9137b65946436acc291999b39b7ae060bbb10af..e2844b97da1f8bf1d11c9e09fb6f9851000a4c50 100644
--- a/src/ptbench/data/indian/fold_4.py
+++ b/src/ptbench/data/indian/fold_4.py
@@ -1,12 +1,14 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-4.json")
 """Indian collection dataset for computer-aided diagnosis (cross validation
 fold 4).
 
+Database reference: [INDIAN-2013]_
+
 See :py:class:`.indian.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-4.json")
diff --git a/src/ptbench/data/indian/fold_5.py b/src/ptbench/data/indian/fold_5.py
index d6f34d692f88aa23d5e61311eed454af95b9825d..ef5835281795dfada8d5c8159ca35b1608899531 100644
--- a/src/ptbench/data/indian/fold_5.py
+++ b/src/ptbench/data/indian/fold_5.py
@@ -1,12 +1,14 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-5.json")
 """Indian collection dataset for computer-aided diagnosis (cross validation
 fold 5).
 
+Database reference: [INDIAN-2013]_
+
 See :py:class:`.indian.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-5.json")
diff --git a/src/ptbench/data/indian/fold_6.py b/src/ptbench/data/indian/fold_6.py
index a293530d31af50b15e74e115551736f5883d3d23..59c168c5e4f9e2b32525707987f40744325077ec 100644
--- a/src/ptbench/data/indian/fold_6.py
+++ b/src/ptbench/data/indian/fold_6.py
@@ -1,12 +1,14 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-6.json")
 """Indian collection dataset for computer-aided diagnosis (cross validation
 fold 6).
 
+Database reference: [INDIAN-2013]_
+
 See :py:class:`.indian.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-6.json")
diff --git a/src/ptbench/data/indian/fold_7.py b/src/ptbench/data/indian/fold_7.py
index 22ea34390925f94eb3b14b73add96b10afd1d087..9eda09ad1a62330e169304a80ac356197ec2f42c 100644
--- a/src/ptbench/data/indian/fold_7.py
+++ b/src/ptbench/data/indian/fold_7.py
@@ -1,12 +1,14 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-7.json")
 """Indian collection dataset for computer-aided diagnosis (cross validation
 fold 7).
 
+Database reference: [INDIAN-2013]_
+
 See :py:class:`.indian.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-7.json")
diff --git a/src/ptbench/data/indian/fold_8.py b/src/ptbench/data/indian/fold_8.py
index 77cf20ee0c861ee5999d77592a787034ba7ac6b4..abc54bac7c6957c0df626a6e1f339cf2144e9081 100644
--- a/src/ptbench/data/indian/fold_8.py
+++ b/src/ptbench/data/indian/fold_8.py
@@ -1,12 +1,14 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-8.json")
 """Indian collection dataset for computer-aided diagnosis (cross validation
 fold 8).
 
+Database reference: [INDIAN-2013]_
+
 See :py:class:`.indian.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-8.json")
diff --git a/src/ptbench/data/indian/fold_9.py b/src/ptbench/data/indian/fold_9.py
index a0f881bc9a256e50d69669d66d5a95bea7a9a3c5..cb4aa6bea2754ad3ee4a94ec3d545a1885de534e 100644
--- a/src/ptbench/data/indian/fold_9.py
+++ b/src/ptbench/data/indian/fold_9.py
@@ -1,12 +1,14 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-9.json")
 """Indian collection dataset for computer-aided diagnosis (cross validation
 fold 9).
 
+Database reference: [INDIAN-2013]_
+
 See :py:class:`.indian.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-9.json")
diff --git a/src/ptbench/data/montgomery/datamodule.py b/src/ptbench/data/montgomery/datamodule.py
index f3ac8ffce2e95fc4446829b658233386a700f6a8..b5ed48dd10f3949f40917eac341037c6e3153194 100644
--- a/src/ptbench/data/montgomery/datamodule.py
+++ b/src/ptbench/data/montgomery/datamodule.py
@@ -1,6 +1,10 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Montgomery datamodule for TB detection.
+
+Database reference: [MONTGOMERY-SHENZHEN-2014]_
+"""
 
 import importlib.resources
 import os
diff --git a/src/ptbench/data/montgomery/default.py b/src/ptbench/data/montgomery/default.py
index 2b8a8fb25e09b85f372e854a2f2ce29bcdf56ddc..ad32e45b07345fab51f074d7811bf7e476ae4ad7 100644
--- a/src/ptbench/data/montgomery/default.py
+++ b/src/ptbench/data/montgomery/default.py
@@ -1,6 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Montgomery datamodule for TB detection.
+
+Database reference: [MONTGOMERY-SHENZHEN-2014]_
+
+See :py:class:`.montgomery.datamodule.DataModule` for technical details.
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/montgomery/fold_0.py b/src/ptbench/data/montgomery/fold_0.py
index a271fa0f8a1b00a4915d4c77c01d488419e8e2f2..7f842d598843781f66daa450f4100f7068dc6d41 100644
--- a/src/ptbench/data/montgomery/fold_0.py
+++ b/src/ptbench/data/montgomery/fold_0.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-0.json")
 """Montgomery datamodule for TB detection (cross validation fold 0).
 
+Database reference: [MONTGOMERY-SHENZHEN-2014]_
+
 See :py:class:`.montgomery.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-0.json")
diff --git a/src/ptbench/data/montgomery/fold_1.py b/src/ptbench/data/montgomery/fold_1.py
index 626cf2d0ac931e4ffee7dd2296392eff70bc9bcf..abdfbcf13f96f6ced741e73c27236cdd232bae9d 100644
--- a/src/ptbench/data/montgomery/fold_1.py
+++ b/src/ptbench/data/montgomery/fold_1.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-1.json")
 """Montgomery datamodule for TB detection (cross validation fold 1).
 
+Database reference: [MONTGOMERY-SHENZHEN-2014]_
+
 See :py:class:`.montgomery.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-1.json")
diff --git a/src/ptbench/data/montgomery/fold_2.py b/src/ptbench/data/montgomery/fold_2.py
index b6146d068959f5b0b9deee9bed151c5158623cda..8614cc00664e2569b3b1f28bd1bf43dbed37e6c7 100644
--- a/src/ptbench/data/montgomery/fold_2.py
+++ b/src/ptbench/data/montgomery/fold_2.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-2.json")
 """Montgomery datamodule for TB detection (cross validation fold 2).
 
+Database reference: [MONTGOMERY-SHENZHEN-2014]_
+
 See :py:class:`.montgomery.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-2.json")
diff --git a/src/ptbench/data/montgomery/fold_3.py b/src/ptbench/data/montgomery/fold_3.py
index f1b1c53eccd410b292da85fd129d61e48001e590..50ac23f5dc739c16a30d3c3ffc4b31cb5547b8ba 100644
--- a/src/ptbench/data/montgomery/fold_3.py
+++ b/src/ptbench/data/montgomery/fold_3.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-3.json")
 """Montgomery datamodule for TB detection (cross validation fold 3).
 
+Database reference: [MONTGOMERY-SHENZHEN-2014]_
+
 See :py:class:`.montgomery.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-3.json")
diff --git a/src/ptbench/data/montgomery/fold_4.py b/src/ptbench/data/montgomery/fold_4.py
index eaa5fd27b841c44ce202b3d07d96cd90ef523d84..c83e106087c9e2e429e70a3d21da37fbf05a9a0e 100644
--- a/src/ptbench/data/montgomery/fold_4.py
+++ b/src/ptbench/data/montgomery/fold_4.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-4.json")
 """Montgomery datamodule for TB detection (cross validation fold 4).
 
+Database reference: [MONTGOMERY-SHENZHEN-2014]_
+
 See :py:class:`.montgomery.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-4.json")
diff --git a/src/ptbench/data/montgomery/fold_5.py b/src/ptbench/data/montgomery/fold_5.py
index 142ae715356d4cfd83e7b628cddda25459e70e35..30b97b0352f228e99a3a5c3b3b6bfbcffad211b9 100644
--- a/src/ptbench/data/montgomery/fold_5.py
+++ b/src/ptbench/data/montgomery/fold_5.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-5.json")
 """Montgomery datamodule for TB detection (cross validation fold 5).
 
+Database reference: [MONTGOMERY-SHENZHEN-2014]_
+
 See :py:class:`.montgomery.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-5.json")
diff --git a/src/ptbench/data/montgomery/fold_6.py b/src/ptbench/data/montgomery/fold_6.py
index 715d9b84650b71923b391cbb85e02c77e5084132..86e35ca5d2787ab6585c339cb489fa09f4a43bc9 100644
--- a/src/ptbench/data/montgomery/fold_6.py
+++ b/src/ptbench/data/montgomery/fold_6.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-6.json")
 """Montgomery datamodule for TB detection (cross validation fold 6).
 
+Database reference: [MONTGOMERY-SHENZHEN-2014]_
+
 See :py:class:`.montgomery.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-6.json")
diff --git a/src/ptbench/data/montgomery/fold_7.py b/src/ptbench/data/montgomery/fold_7.py
index fc53e24ef3a927dc0c56d1f62780701529a0b1ae..9f0bd3da0c0b6c2be05b23a7d8cde71540972339 100644
--- a/src/ptbench/data/montgomery/fold_7.py
+++ b/src/ptbench/data/montgomery/fold_7.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-7.json")
 """Montgomery datamodule for TB detection (cross validation fold 7).
 
+Database reference: [MONTGOMERY-SHENZHEN-2014]_
+
 See :py:class:`.montgomery.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-7.json")
diff --git a/src/ptbench/data/montgomery/fold_8.py b/src/ptbench/data/montgomery/fold_8.py
index 2b917a6b46c494de3d08286bd5920fe03c35bc18..5ea2dfc903b552fa633e981f662d23c98d23ebb9 100644
--- a/src/ptbench/data/montgomery/fold_8.py
+++ b/src/ptbench/data/montgomery/fold_8.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-8.json")
 """Montgomery datamodule for TB detection (cross validation fold 8).
 
+Database reference: [MONTGOMERY-SHENZHEN-2014]_
+
 See :py:class:`.montgomery.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-8.json")
diff --git a/src/ptbench/data/montgomery/fold_9.py b/src/ptbench/data/montgomery/fold_9.py
index f404ace1c6b8f1ce4a18b68343298016f21f3b7d..41025b7327adc5cffdac4ad95e8592fae5c9d02b 100644
--- a/src/ptbench/data/montgomery/fold_9.py
+++ b/src/ptbench/data/montgomery/fold_9.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-9.json")
 """Montgomery datamodule for TB detection (cross validation fold 9).
 
+Database reference: [MONTGOMERY-SHENZHEN-2014]_
+
 See :py:class:`.montgomery.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-9.json")
diff --git a/src/ptbench/data/montgomery_shenzhen/default.py b/src/ptbench/data/montgomery_shenzhen/default.py
index c332f4be47fac3374bfb0841c3a2ebbe4e2a0932..5a9208f42e9e220c03e6a40c6ea28e672749ae06 100644
--- a/src/ptbench/data/montgomery_shenzhen/default.py
+++ b/src/ptbench/data/montgomery_shenzhen/default.py
@@ -1,12 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("default.json")
 """Aggregated datamodule composed of Montgomery and Shenzhen datasets (default
 split).
 
 See :py:class:`.montgomery_shenzhen.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("default.json")
diff --git a/src/ptbench/data/montgomery_shenzhen/fold_0.py b/src/ptbench/data/montgomery_shenzhen/fold_0.py
index f3e8ef02acb941787257ec145485e299ce5ae596..722876a6e370edccfb1fac1ff48dc7f51dc8c9dd 100644
--- a/src/ptbench/data/montgomery_shenzhen/fold_0.py
+++ b/src/ptbench/data/montgomery_shenzhen/fold_0.py
@@ -1,12 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-0.json")
 """Aggregated datamodule composed of Montgomery and Shenzhen datasets (cross
 validation fold 0).
 
 See :py:class:`.montgomery_shenzhen.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-0.json")
diff --git a/src/ptbench/data/montgomery_shenzhen/fold_1.py b/src/ptbench/data/montgomery_shenzhen/fold_1.py
index f6d73de3c2a180a23472914cc079ce93a8348a24..81ee4224eb4ad1977007a84cb7ba3a036688cc24 100644
--- a/src/ptbench/data/montgomery_shenzhen/fold_1.py
+++ b/src/ptbench/data/montgomery_shenzhen/fold_1.py
@@ -1,12 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-1.json")
 """Aggregated datamodule composed of Montgomery and Shenzhen datasets (cross
 validation fold 1).
 
 See :py:class:`.montgomery_shenzhen.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-1.json")
diff --git a/src/ptbench/data/montgomery_shenzhen/fold_2.py b/src/ptbench/data/montgomery_shenzhen/fold_2.py
index 9b9560528d1c293183959748f4f0c50f1242aabf..afd77ed3ce746d7341cff4c0c97620730a71bfad 100644
--- a/src/ptbench/data/montgomery_shenzhen/fold_2.py
+++ b/src/ptbench/data/montgomery_shenzhen/fold_2.py
@@ -1,12 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-2.json")
 """Aggregated datamodule composed of Montgomery and Shenzhen datasets (cross
 validation fold 2).
 
 See :py:class:`.montgomery_shenzhen.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-2.json")
diff --git a/src/ptbench/data/montgomery_shenzhen/fold_3.py b/src/ptbench/data/montgomery_shenzhen/fold_3.py
index 826e0abb50e9f15e84bd7ee544c32ce358063e99..cc1e48a5925e49b796e0619dd4738545a4dc7f1d 100644
--- a/src/ptbench/data/montgomery_shenzhen/fold_3.py
+++ b/src/ptbench/data/montgomery_shenzhen/fold_3.py
@@ -1,12 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-3.json")
 """Aggregated datamodule composed of Montgomery and Shenzhen datasets (cross
 validation fold 3).
 
 See :py:class:`.montgomery_shenzhen.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-3.json")
diff --git a/src/ptbench/data/montgomery_shenzhen/fold_4.py b/src/ptbench/data/montgomery_shenzhen/fold_4.py
index f7261a431690eedf7f970a0f95067b3cda1647cc..b20ba0e3f2780a78e5b034e1ae44dc51ed32365f 100644
--- a/src/ptbench/data/montgomery_shenzhen/fold_4.py
+++ b/src/ptbench/data/montgomery_shenzhen/fold_4.py
@@ -1,12 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-4.json")
 """Aggregated datamodule composed of Montgomery and Shenzhen datasets (cross
 validation fold 4).
 
 See :py:class:`.montgomery_shenzhen.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-4.json")
diff --git a/src/ptbench/data/montgomery_shenzhen/fold_5.py b/src/ptbench/data/montgomery_shenzhen/fold_5.py
index 7dfb6f9077ce98d8238bf7e7695b4d233e3d83a7..a521e26f70385db5d135c682181c560187e98ce5 100644
--- a/src/ptbench/data/montgomery_shenzhen/fold_5.py
+++ b/src/ptbench/data/montgomery_shenzhen/fold_5.py
@@ -1,12 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-5.json")
 """Aggregated datamodule composed of Montgomery and Shenzhen datasets (cross
 validation fold 5).
 
 See :py:class:`.montgomery_shenzhen.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-5.json")
diff --git a/src/ptbench/data/montgomery_shenzhen/fold_6.py b/src/ptbench/data/montgomery_shenzhen/fold_6.py
index 57f19130059efb743db6dd7127fb8ea6886edc2c..44454a52dd8d3bdcd0fd08f9f3c039a7c4384efe 100644
--- a/src/ptbench/data/montgomery_shenzhen/fold_6.py
+++ b/src/ptbench/data/montgomery_shenzhen/fold_6.py
@@ -1,12 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-6.json")
 """Aggregated datamodule composed of Montgomery and Shenzhen datasets (cross
 validation fold 6).
 
 See :py:class:`.montgomery_shenzhen.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-6.json")
diff --git a/src/ptbench/data/montgomery_shenzhen/fold_7.py b/src/ptbench/data/montgomery_shenzhen/fold_7.py
index 3fc7c8bfa135edc6e8f7c8e6b6e8a8adc056279d..95128328cb26e05db7e955688376146d1d384881 100644
--- a/src/ptbench/data/montgomery_shenzhen/fold_7.py
+++ b/src/ptbench/data/montgomery_shenzhen/fold_7.py
@@ -1,12 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-7.json")
 """Aggregated datamodule composed of Montgomery and Shenzhen datasets (cross
 validation fold 7).
 
 See :py:class:`.montgomery_shenzhen.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-7.json")
diff --git a/src/ptbench/data/montgomery_shenzhen/fold_8.py b/src/ptbench/data/montgomery_shenzhen/fold_8.py
index 7b631543deb1c925ef9d8f66a2e686256361510c..220ce854f2e6ca24697ee373c7b1fbfa4d33aa28 100644
--- a/src/ptbench/data/montgomery_shenzhen/fold_8.py
+++ b/src/ptbench/data/montgomery_shenzhen/fold_8.py
@@ -1,12 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-8.json")
 """Aggregated datamodule composed of Montgomery and Shenzhen datasets (cross
 validation fold 8).
 
 See :py:class:`.montgomery_shenzhen.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-8.json")
diff --git a/src/ptbench/data/montgomery_shenzhen/fold_9.py b/src/ptbench/data/montgomery_shenzhen/fold_9.py
index 565b71e7c2f3bb7cdc2f90234454b7c058c6af17..01fc7503cea99b2d598a221f0f8d30cd7c84fd24 100644
--- a/src/ptbench/data/montgomery_shenzhen/fold_9.py
+++ b/src/ptbench/data/montgomery_shenzhen/fold_9.py
@@ -1,12 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-9.json")
 """Aggregated datamodule composed of Montgomery and Shenzhen datasets (cross
 validation fold 9).
 
 See :py:class:`.montgomery_shenzhen.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-9.json")
diff --git a/src/ptbench/data/montgomery_shenzhen_indian/datamodule.py b/src/ptbench/data/montgomery_shenzhen_indian/datamodule.py
index 3c555a62a36512dd76bda26149d439e11ae1fac9..6df9a85033ac24cc8df42280cef986f770b8a0da 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian/datamodule.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian/datamodule.py
@@ -1,6 +1,8 @@
 # Copyright © 2022 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Aggregated datamodule composed of Montgomery, Shenzhen and Indian
+datasets."""
 
 from ..datamodule import ConcatDataModule
 from ..indian.datamodule import RawDataLoader as IndianLoader
diff --git a/src/ptbench/data/montgomery_shenzhen_indian/default.py b/src/ptbench/data/montgomery_shenzhen_indian/default.py
index e4a05f6365acfa6d3cd67d2e5d057013a34dca48..691885b11f73f17c4b0a4e27d32992dce9767aad 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian/default.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian/default.py
@@ -1,12 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("default.json")
 """Aggregated datamodule composed of Montgomery, Shenzhen and Indian datasets.
 
 See :py:class:`.montgomery_shenzhen_indian.datamodule.DataModule` for technical
 details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("default.json")
diff --git a/src/ptbench/data/montgomery_shenzhen_indian/fold_0.py b/src/ptbench/data/montgomery_shenzhen_indian/fold_0.py
index 6f08e25a3a3295cbd4f0dbc8238ac39b6e0eda2a..d9df2f75255861954057f61b5c8a1a8a16b0d9a1 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian/fold_0.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian/fold_0.py
@@ -1,13 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-0.json")
 """Aggregated datamodule composed of Montgomery, Shenzhen and Indian datasets
 (cross validation fold 0).
 
 See :py:class:`.montgomery_shenzhen_indian.datamodule.DataModule` for technical
 details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-0.json")
diff --git a/src/ptbench/data/montgomery_shenzhen_indian/fold_1.py b/src/ptbench/data/montgomery_shenzhen_indian/fold_1.py
index 3d7529cfc17c7d4da9a4b9b72a1ccee572f269f0..e95a72bdb906e9e63b40d9508a22f04304b246a0 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian/fold_1.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian/fold_1.py
@@ -1,12 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-1.json")
 """Aggregated datamodule composed of Montgomery, Shenzhen and Indian datasets
 (cross validation fold 1).
 
 See :py:class:`.montgomery_shenzhen_indian.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-1.json")
diff --git a/src/ptbench/data/montgomery_shenzhen_indian/fold_2.py b/src/ptbench/data/montgomery_shenzhen_indian/fold_2.py
index 2e9142814fb0a8754b77d0ff5a7b68a41d3da4d0..1532a9fbaca33096998cf80c0cf84d75361e4184 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian/fold_2.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian/fold_2.py
@@ -1,13 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-2.json")
 """Aggregated datamodule composed of Montgomery, Shenzhen and Indian datasets
 (cross validation fold 2).
 
 See :py:class:`.montgomery_shenzhen_indian.datamodule.DataModule` for technical
 details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-2.json")
diff --git a/src/ptbench/data/montgomery_shenzhen_indian/fold_3.py b/src/ptbench/data/montgomery_shenzhen_indian/fold_3.py
index dfd4c9cd5e3f7da229771996e073bae26f75e825..21605168e959d2f12df6662fa71e530677a0c73a 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian/fold_3.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian/fold_3.py
@@ -1,13 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-3.json")
 """Aggregated datamodule composed of Montgomery, Shenzhen and Indian datasets
 (cross validation fold 3).
 
 See :py:class:`.montgomery_shenzhen_indian.datamodule.DataModule` for technical
 details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-3.json")
diff --git a/src/ptbench/data/montgomery_shenzhen_indian/fold_4.py b/src/ptbench/data/montgomery_shenzhen_indian/fold_4.py
index 84e66cefbdff506afd25c41262a1f54676940ce0..287afbdd3d5cc2d0590125014793d8174ef22878 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian/fold_4.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian/fold_4.py
@@ -1,13 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-4.json")
 """Aggregated datamodule composed of Montgomery, Shenzhen and Indian datasets
 (cross validation fold 4).
 
 See :py:class:`.montgomery_shenzhen_indian.datamodule.DataModule` for technical
 details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-4.json")
diff --git a/src/ptbench/data/montgomery_shenzhen_indian/fold_5.py b/src/ptbench/data/montgomery_shenzhen_indian/fold_5.py
index 650292f7c2e6d8ecff27a7f2164c36353e67c5a3..52fd19d2c17b429a9aee72c8b2771ea9a7f899e6 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian/fold_5.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian/fold_5.py
@@ -1,13 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-5.json")
 """Aggregated datamodule composed of Montgomery, Shenzhen and Indian datasets
 (cross validation fold 5).
 
 See :py:class:`.montgomery_shenzhen_indian.datamodule.DataModule` for technical
 details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-5.json")
diff --git a/src/ptbench/data/montgomery_shenzhen_indian/fold_6.py b/src/ptbench/data/montgomery_shenzhen_indian/fold_6.py
index 8f673689c2ec6c2e7c8e25efe97f00351e09589b..7232f1c3a506407a79953b66690ec03b695458d6 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian/fold_6.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian/fold_6.py
@@ -1,13 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-6.json")
 """Aggregated datamodule composed of Montgomery, Shenzhen and Indian datasets
 (cross validation fold 6).
 
 See :py:class:`.montgomery_shenzhen_indian.datamodule.DataModule` for technical
 details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-6.json")
diff --git a/src/ptbench/data/montgomery_shenzhen_indian/fold_7.py b/src/ptbench/data/montgomery_shenzhen_indian/fold_7.py
index 33eed5405a20141af252cc76f77156ab54baaa6c..16ba67fec66b54733b6d68f81a1c3232ded67747 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian/fold_7.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian/fold_7.py
@@ -1,12 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-7.json")
 """Aggregated datamodule composed of Montgomery, Shenzhen and Indian datasets
 (cross validation fold 7).
 
 See :py:class:`.montgomery_shenzhen_indian.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-7.json")
diff --git a/src/ptbench/data/montgomery_shenzhen_indian/fold_8.py b/src/ptbench/data/montgomery_shenzhen_indian/fold_8.py
index 4de80f69739e27da225b862e3679b1684c89296c..f6d0788e244eedf9ef7b25e16b2face1054b588f 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian/fold_8.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian/fold_8.py
@@ -1,13 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-8.json")
 """Aggregated datamodule composed of Montgomery, Shenzhen and Indian datasets
 (cross validation fold 8).
 
 See :py:class:`.montgomery_shenzhen_indian.datamodule.DataModule` for technical
 details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-8.json")
diff --git a/src/ptbench/data/montgomery_shenzhen_indian/fold_9.py b/src/ptbench/data/montgomery_shenzhen_indian/fold_9.py
index f33e691b15d1d7b368a671b4131fa5c4092fc631..b4d9073cb6031ca37e726926bb129a8866d12062 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian/fold_9.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian/fold_9.py
@@ -1,12 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-9.json")
 """Aggregated datamodule composed of Montgomery, Shenzhen and Indian datasets
 (cross validation fold 9).
 
 See :py:class:`.montgomery_shenzhen_indian.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-9.json")
diff --git a/src/ptbench/data/montgomery_shenzhen_indian_padchest/datamodule.py b/src/ptbench/data/montgomery_shenzhen_indian_padchest/datamodule.py
index 9f6a3b0930dffa3fb3956d99b7c831e84dc379e2..b4317ac447cfb8a688c1844984b163b42e7786cc 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian_padchest/datamodule.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian_padchest/datamodule.py
@@ -1,6 +1,8 @@
 # Copyright © 2022 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Aggregated datamodule composed of Montgomery, Shenzhen, Indian, and PadChest
+datasets."""
 
 from ..datamodule import ConcatDataModule
 from ..indian.datamodule import RawDataLoader as IndianLoader
@@ -14,7 +16,8 @@ from ..shenzhen.datamodule import make_split as make_shenzhen_split
 
 
 class DataModule(ConcatDataModule):
-    """Aggregated datamodule composed of Montgomery and Shenzhen datasets."""
+    """Aggregated datamodule composed of Montgomery, Shenzhen, Indian, and
+    PadChest datasets."""
 
     def __init__(self, split_filename: str, padchest_split_filename: str):
         montgomery_loader = MontgomeryLoader()
diff --git a/src/ptbench/data/montgomery_shenzhen_indian_padchest/default.py b/src/ptbench/data/montgomery_shenzhen_indian_padchest/default.py
index 5368466a27c713e5ac4edb78a7209c5250002dfc..bc5ca3d84e86d28a6c63c3a0a97231a9be5ac698 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian_padchest/default.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian_padchest/default.py
@@ -1,9 +1,9 @@
 # Copyright © 2022 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Aggregated dataset composed of Montgomery, Shenzhen, Indian and Padchest
+datasets."""
 
 from .datamodule import DataModule
 
 datamodule = DataModule("default.json", "tb-idiap.json")
-"""Aggregated dataset composed of Montgomery, Shenzhen, Indian and Padchest
-datasets."""
diff --git a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/datamodule.py b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/datamodule.py
index 025991879e9a9937dd1635620700d2b7bba93db4..6f7ee8bcec746e2ca9455fa0d3c09378e74252d3 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/datamodule.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/datamodule.py
@@ -1,6 +1,8 @@
 # Copyright © 2022 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Aggregated datamodule composed of Montgomery, Shenzhen, Indian, and TBX11k
+datasets."""
 
 from ..datamodule import ConcatDataModule
 from ..indian.datamodule import RawDataLoader as IndianLoader
@@ -14,7 +16,8 @@ from ..tbx11k.datamodule import make_split as make_tbx11k_split
 
 
 class DataModule(ConcatDataModule):
-    """Aggregated datamodule composed of Montgomery and Shenzhen datasets."""
+    """Aggregated datamodule composed of Montgomery, Shenzhen, Indian, and
+    TBX11k datasets."""
 
     def __init__(self, split_filename: str, tbx11_split_filename: str):
         montgomery_loader = MontgomeryLoader()
diff --git a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_0.py b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_0.py
index 426206972c50fbc067f31e9acfede8ada5022fec..47e8c4ba27d074b728e3fceda9f5d746df135988 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_0.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_0.py
@@ -1,6 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Aggregated datamodule composed of Montgomery, Shenzhen, Indian, and TBX11k
+datasets (cross-validation fold 0).
+
+This remix dataset combines ``fold-0`` from Montgomery, Shenzhen, and Indian
+datasets with ``v1-fold-0`` of TBX11k (healthy vs. active TB samples).
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_1.py b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_1.py
index c7f11aad9fe142fc7f08415e7bf6ff441ebbd354..4bfa76529267f355f88f89b30a2274dcfa11f52f 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_1.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_1.py
@@ -1,6 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Aggregated datamodule composed of Montgomery, Shenzhen, Indian, and TBX11k
+datasets (cross-validation fold 1).
+
+This remix dataset combines ``fold-1`` from Montgomery, Shenzhen, and Indian
+datasets with ``v1-fold-1`` of TBX11k (healthy vs. active TB samples).
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_2.py b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_2.py
index 8c94b1e9f9fe8469912283f0bdec42334d33b5ec..2dbbb18ee7d8eadd8dae9514a6480fa807d2b537 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_2.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_2.py
@@ -1,6 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Aggregated datamodule composed of Montgomery, Shenzhen, Indian, and TBX11k
+datasets (cross-validation fold 2).
+
+This remix dataset combines ``fold-2`` from Montgomery, Shenzhen, and Indian
+datasets with ``v1-fold-2`` of TBX11k (healthy vs. active TB samples).
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_3.py b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_3.py
index c90704d139a635582bd03fa66660d2bd62b2c485..5f808c6a2c48c7f218eaf1ad3064e6f13df8d19f 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_3.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_3.py
@@ -1,6 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Aggregated datamodule composed of Montgomery, Shenzhen, Indian, and TBX11k
+datasets (cross-validation fold 3).
+
+This remix dataset combines ``fold-3`` from Montgomery, Shenzhen, and Indian
+datasets with ``v1-fold-3`` of TBX11k (healthy vs. active TB samples).
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_4.py b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_4.py
index 5d24374631e7b0c1df1dfce0f3fec41e8854b4b1..dc9ff8d6d77562d47bc524906d86676d347fd6e1 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_4.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_4.py
@@ -1,6 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Aggregated datamodule composed of Montgomery, Shenzhen, Indian, and TBX11k
+datasets (cross-validation fold 4).
+
+This remix dataset combines ``fold-4`` from Montgomery, Shenzhen, and Indian
+datasets with ``v1-fold-4`` of TBX11k (healthy vs. active TB samples).
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_5.py b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_5.py
index 65aa784052c5597c62f8269f2fbe2676f15492da..137b3c82d3449dca500757734aa7a125f738b83d 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_5.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_5.py
@@ -1,6 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Aggregated datamodule composed of Montgomery, Shenzhen, Indian, and TBX11k
+datasets (cross-validation fold 5).
+
+This remix dataset combines ``fold-5`` from Montgomery, Shenzhen, and Indian
+datasets with ``v1-fold-5`` of TBX11k (healthy vs. active TB samples).
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_6.py b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_6.py
index bc175ac215411addb6f4db1ef2bb767272aa8d59..50641ffac93c33e5b5684e0c69e5914af2084a63 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_6.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_6.py
@@ -1,6 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Aggregated datamodule composed of Montgomery, Shenzhen, Indian, and TBX11k
+datasets (cross-validation fold 6).
+
+This remix dataset combines ``fold-6`` from Montgomery, Shenzhen, and Indian
+datasets with ``v1-fold-6`` of TBX11k (healthy vs. active TB samples).
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_7.py b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_7.py
index 3b7d7f7163e255e3a69d70b8ee073294067858f2..54f9eaa2ab26d1563363e656dcb09e4d902c0d84 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_7.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_7.py
@@ -1,6 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Aggregated datamodule composed of Montgomery, Shenzhen, Indian, and TBX11k
+datasets (cross-validation fold 7).
+
+This remix dataset combines ``fold-7`` from Montgomery, Shenzhen, and Indian
+datasets with ``v1-fold-7`` of TBX11k (healthy vs. active TB samples).
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_8.py b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_8.py
index 20ac8e5cbd6a79be099acb453ca068f3bb349bec..dbccf38c136a36eb510ca85102310f3d3daa3507 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_8.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_8.py
@@ -1,6 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Aggregated datamodule composed of Montgomery, Shenzhen, Indian, and TBX11k
+datasets (cross-validation fold 8).
+
+This remix dataset combines ``fold-8`` from Montgomery, Shenzhen, and Indian
+datasets with ``v1-fold-8`` of TBX11k (healthy vs. active TB samples).
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_9.py b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_9.py
index 413f141dbccc5b7a6d9ddc48355989e4ab2820dd..cd1b5a71da7f5b81eeee06455aea2da552f8db2d 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_9.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_fold_9.py
@@ -1,6 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Aggregated datamodule composed of Montgomery, Shenzhen, Indian, and TBX11k
+datasets (cross-validation fold 9).
+
+This remix dataset combines ``fold-9`` from Montgomery, Shenzhen, and Indian
+datasets with ``v1-fold-9`` of TBX11k (healthy vs. active TB samples).
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_healthy_vs_atb.py b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_healthy_vs_atb.py
index 2f5e2226e341a5af0395402ed707155844ab46c9..4c75b15e5ca437a04d350ad79f1540c317b89323 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_healthy_vs_atb.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v1_healthy_vs_atb.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Aggregated datamodule composed of Montgomery, Shenzhen, Indian, and TBX11k
+datasets (v1-healthy-vs-atb).
+
+This remix dataset combines the ``default`` split from Montgomery, Shenzhen,
+and Indian datasets with ``v1-healthy-vs-atb`` split of TBX11k (healthy vs.
+active TB samples).
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_0.py b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_0.py
index 045b93722324a2a6af398f8878463892a4d189c9..6add82d017bff0f724c24bcb8fc7d402882b7b43 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_0.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_0.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Aggregated datamodule composed of Montgomery, Shenzhen, Indian, and TBX11k
+datasets (cross-validation fold 0).
+
+This remix dataset combines ``fold-0`` from Montgomery, Shenzhen, and Indian
+datasets with ``v2-fold-0`` of TBX11k (healthy, sick and latent TB vs. active
+TB samples).
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_1.py b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_1.py
index 10de943e18e794b3c947db09312ebe9b5e9e9f53..09ada33a72a85a4da00939abe060477442b1c00c 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_1.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_1.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Aggregated datamodule composed of Montgomery, Shenzhen, Indian, and TBX11k
+datasets (cross-validation fold 1).
+
+This remix dataset combines ``fold-1`` from Montgomery, Shenzhen, and Indian
+datasets with ``v2-fold-1`` of TBX11k (healthy, sick and latent TB vs. active
+TB samples).
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_2.py b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_2.py
index 12062ae6cb9d1c45c5b55d99d956be0935424d72..756fd9a334ce7ea31b8cddf35ee3138c10048f6a 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_2.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_2.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Aggregated datamodule composed of Montgomery, Shenzhen, Indian, and TBX11k
+datasets (cross-validation fold 2).
+
+This remix dataset combines ``fold-2`` from Montgomery, Shenzhen, and Indian
+datasets with ``v2-fold-2`` of TBX11k (healthy, sick and latent TB vs. active
+TB samples).
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_3.py b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_3.py
index 453c2b8cd407e49f3037f62e0b15732b26dedd4a..8b72d4f3a3c1d7fc8e2c0b01de470c4e83b42e40 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_3.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_3.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Aggregated datamodule composed of Montgomery, Shenzhen, Indian, and TBX11k
+datasets (cross-validation fold 3).
+
+This remix dataset combines ``fold-3`` from Montgomery, Shenzhen, and Indian
+datasets with ``v2-fold-3`` of TBX11k (healthy, sick and latent TB vs. active
+TB samples).
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_4.py b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_4.py
index d31da7702dfac53225a34a370bcf09618da3679f..4cb6ece8a9b4fc279d6515c79a6ba29071fd53ca 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_4.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_4.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Aggregated datamodule composed of Montgomery, Shenzhen, Indian, and TBX11k
+datasets (cross-validation fold 4).
+
+This remix dataset combines ``fold-4`` from Montgomery, Shenzhen, and Indian
+datasets with ``v2-fold-4`` of TBX11k (healthy, sick and latent TB vs. active
+TB samples).
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_5.py b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_5.py
index 1c50c2e75cfe1c9b22abb1e99c424c3d19d4320f..c6b8f89e19ad91b67ebd379294abc45f001984b7 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_5.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_5.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Aggregated datamodule composed of Montgomery, Shenzhen, Indian, and TBX11k
+datasets (cross-validation fold 5).
+
+This remix dataset combines ``fold-5`` from Montgomery, Shenzhen, and Indian
+datasets with ``v2-fold-5`` of TBX11k (healthy, sick and latent TB vs. active
+TB samples).
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_6.py b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_6.py
index 0f15a0fa965252cf9f9965288dc46892712c2ec5..2c09367110fd28fe5d72c9e1ae324796394bc8e9 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_6.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_6.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Aggregated datamodule composed of Montgomery, Shenzhen, Indian, and TBX11k
+datasets (cross-validation fold 6).
+
+This remix dataset combines ``fold-6`` from Montgomery, Shenzhen, and Indian
+datasets with ``v2-fold-6`` of TBX11k (healthy, sick and latent TB vs. active
+TB samples).
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_7.py b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_7.py
index 1082945619d45251743bc50d055d327cac7304d5..0a7c37bcd888c9002d4e5242eb556d976d8c848d 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_7.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_7.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Aggregated datamodule composed of Montgomery, Shenzhen, Indian, and TBX11k
+datasets (cross-validation fold 7).
+
+This remix dataset combines ``fold-7`` from Montgomery, Shenzhen, and Indian
+datasets with ``v2-fold-7`` of TBX11k (healthy, sick and latent TB vs. active
+TB samples).
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_8.py b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_8.py
index a90e1111b25bab6ee14990bfa98de18fd945c422..5cc64e15f394653c834820410d4abcbf04a738b1 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_8.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_8.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Aggregated datamodule composed of Montgomery, Shenzhen, Indian, and TBX11k
+datasets (cross-validation fold 8).
+
+This remix dataset combines ``fold-8`` from Montgomery, Shenzhen, and Indian
+datasets with ``v2-fold-8`` of TBX11k (healthy, sick and latent TB vs. active
+TB samples).
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_9.py b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_9.py
index a6cb7d51a9aec209f5665f1ea9947ad1c02793d9..b8998a232ccab969dd4d7f561b1269292940ad1c 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_9.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_fold_9.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Aggregated datamodule composed of Montgomery, Shenzhen, Indian, and TBX11k
+datasets (cross-validation fold 9).
+
+This remix dataset combines ``fold-9`` from Montgomery, Shenzhen, and Indian
+datasets with ``v2-fold-9`` of TBX11k (healthy, sick and latent TB vs. active
+TB samples).
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_others_vs_atb.py b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_others_vs_atb.py
index bef1efcedd59570380048fbd1e0f9d458cd7d88d..ccbac3529f375d0335f9508d63c2a8b655a47855 100644
--- a/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_others_vs_atb.py
+++ b/src/ptbench/data/montgomery_shenzhen_indian_tbx11k/v2_others_vs_atb.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Aggregated datamodule composed of Montgomery, Shenzhen, Indian, and TBX11k
+datasets (v2-others-vs-atb).
+
+This remix dataset combines the ``default`` split from Montgomery, Shenzhen,
+and Indian datasets with ``v2-others-vs-atb`` of TBX11k (healthy, sick and
+latent TB vs. active TB samples).
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/nih_cxr14/cardiomegaly.py b/src/ptbench/data/nih_cxr14/cardiomegaly.py
index 0715650d7ec5b9394249b885172f2f5af646dd2d..7b104faa36115e5ed1cc045c865f6d92cdaf8822 100644
--- a/src/ptbench/data/nih_cxr14/cardiomegaly.py
+++ b/src/ptbench/data/nih_cxr14/cardiomegaly.py
@@ -1,6 +1,15 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""NIH CXR14 (relabeled) datamodule for computer-aided diagnosis (cardiomegaly
+split).
+
+Database reference: [NIH-CXR14-2017]_
+
+This split contains cardiomegaly cases from the NIH CXR14 database.
+
+See :py:class:`.nih_cxr14.datamodule.DataModule` for technical details.
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/nih_cxr14/datamodule.py b/src/ptbench/data/nih_cxr14/datamodule.py
index 58c828b4b252c36c8329bf4adbbadcd76a2e2215..996c9feb7176a7a766940574a4b928a625a76447 100644
--- a/src/ptbench/data/nih_cxr14/datamodule.py
+++ b/src/ptbench/data/nih_cxr14/datamodule.py
@@ -1,6 +1,10 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""NIH CXR14 (relabeled) datamodule for computer-aided diagnosis.
+
+Database reference: [NIH-CXR14-2017]_
+"""
 
 import importlib.resources
 import os
diff --git a/src/ptbench/data/nih_cxr14/default.py b/src/ptbench/data/nih_cxr14/default.py
index af4f217217bb033bc1c089a3db633a29056d3f3f..c7bc3e2e7d7c6b0ab2ec83b7375d812481233b06 100644
--- a/src/ptbench/data/nih_cxr14/default.py
+++ b/src/ptbench/data/nih_cxr14/default.py
@@ -1,10 +1,6 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("default.json.bz2")
 """NIH CXR14 (relabeled) datamodule (``default`` protocol).
 
 * Training samples: 98637
@@ -13,3 +9,7 @@ datamodule = DataModule("default.json.bz2")
 
 See :py:class:`.nih_cxr14.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("default.json.bz2")
diff --git a/src/ptbench/data/nih_cxr14_padchest/idiap.py b/src/ptbench/data/nih_cxr14_padchest/idiap.py
index 45754ea62ac7e8ea4f995e755954d537e03c34b8..f318b4f73e39be6606f19df357102dac972a3b55 100644
--- a/src/ptbench/data/nih_cxr14_padchest/idiap.py
+++ b/src/ptbench/data/nih_cxr14_padchest/idiap.py
@@ -1,6 +1,8 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Aggregated dataset composed of NIH CXR14 relabeld and PadChest (normalized)
+datasets (no-tb-idiap split)."""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/padchest/cardiomegaly_idiap.py b/src/ptbench/data/padchest/cardiomegaly_idiap.py
index c2f0113f6a2c993c64714fd4dabba762d87cb5a3..bd832fdd7b4592cbeab67e617a5c110861d7794e 100644
--- a/src/ptbench/data/padchest/cardiomegaly_idiap.py
+++ b/src/ptbench/data/padchest/cardiomegaly_idiap.py
@@ -1,14 +1,16 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("cardiomegaly-idiap.json")
 """Padchest cardiomegaly (idiap protocol) dataset for computer-aided diagnosis.
 
+Database reference: [PADCHEST-2019]_
+
 This split contains the first 40 images with cardiomegaly, with parameters:
 Label = "Normal", MethodLabel = "Physician", Projection = "PA"
 
 Read documentation of :py:class:`DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("cardiomegaly-idiap.json")
diff --git a/src/ptbench/data/padchest/datamodule.py b/src/ptbench/data/padchest/datamodule.py
index 69a37ea844fa3123e66b296803d8456845b4911a..1fc49485ba368c3941ec7aa27a673b71871188b7 100644
--- a/src/ptbench/data/padchest/datamodule.py
+++ b/src/ptbench/data/padchest/datamodule.py
@@ -1,6 +1,10 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Padchest dataset for computer-aided diagnosis.
+
+Database reference: [PADCHEST-2019]_
+"""
 
 import importlib.resources
 import os
diff --git a/src/ptbench/data/padchest/idiap.py b/src/ptbench/data/padchest/idiap.py
index 52c52123ae8943e1027a2fdf42aac06b6abc9da0..bf1f935641faff87898b9e486cdd39b5248fe699 100644
--- a/src/ptbench/data/padchest/idiap.py
+++ b/src/ptbench/data/padchest/idiap.py
@@ -1,12 +1,10 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("idiap.json.bz2")
 """Padchest dataset for computer-aided diagnosis (``idiap`` split).
 
+Database reference: [PADCHEST-2019]_
+
 This split contains all images in the database.  Read documentation of
 :py:class:`.padchest.datamodule.DataModule` for technical details.
 
@@ -15,3 +13,7 @@ This split contains all images in the database.  Read documentation of
   * Validation samples: ?
   * Test samples: ?
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("idiap.json.bz2")
diff --git a/src/ptbench/data/padchest/no_tb_idiap.py b/src/ptbench/data/padchest/no_tb_idiap.py
index 68f3e83b9ca11dcc6e3805d2f764e66fd617109a..ca787520874bd9380fff6c8caa1f34943f269305 100644
--- a/src/ptbench/data/padchest/no_tb_idiap.py
+++ b/src/ptbench/data/padchest/no_tb_idiap.py
@@ -1,12 +1,11 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("no-tb-idiap.json.bz2")
 """Padchest dataset for computer-aided diagnosis (``no-tb-idiap`` split).
 
+Database reference: [PADCHEST-2019]_
+
+* Split:
   * Training samples: 20'126
   * Validation samples: 1'500
   * Test samples: 0
@@ -29,5 +28,10 @@ datamodule = DataModule("no-tb-idiap.json.bz2")
   * fibrosis
   * edema and consolidation
 
-Read documentation of :py:class:`DataModule` for technical details.
+Read documentation of :py:class:`.padchest.datamodule.DataModule` for technical
+details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("no-tb-idiap.json.bz2")
diff --git a/src/ptbench/data/padchest/tb_idiap.py b/src/ptbench/data/padchest/tb_idiap.py
index ddfa889ffc1c231fa708b4a09a94ba3315f7cae3..d77e5afd0e2a92b0b516af8e69713b6ecaba599a 100644
--- a/src/ptbench/data/padchest/tb_idiap.py
+++ b/src/ptbench/data/padchest/tb_idiap.py
@@ -1,16 +1,19 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("tb-idiap.json")
 """Padchest dataset for computer-aided diagnosis (``tb-idiap`` split).
 
+Database reference: [PADCHEST-2019]_
+
 This split contains 125 healthy images are the first 125 padchest images with
 the following parameters: Label = "Normal", MethodLabel = "Physician",
 Projection = "PA" and TB cases.  Labelling matches those for active TB (binary)
 classification datasets.
 
-Read documentation of :py:class:`DataModule` for technical details.
+Read documentation of :py:class:`.padchest.datamodule.DataModule` for technical
+details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("tb-idiap.json")
diff --git a/src/ptbench/data/shenzhen/datamodule.py b/src/ptbench/data/shenzhen/datamodule.py
index 221bc869dfc23d50e85025ca7eda6ecbf44321ed..af5a40745f9dce870701712c397624a4df823521 100644
--- a/src/ptbench/data/shenzhen/datamodule.py
+++ b/src/ptbench/data/shenzhen/datamodule.py
@@ -1,6 +1,10 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""Shenzhen datamodule for computer-aided diagnosis.
+
+Database reference: [MONTGOMERY-SHENZHEN-2014]_
+"""
 
 import importlib.resources
 import os
diff --git a/src/ptbench/data/shenzhen/default.py b/src/ptbench/data/shenzhen/default.py
index 0a73847af2107003b9b21ad2d06dacc255148519..b8cf71724bac9b67656bc8d266011ecfceb8eb32 100644
--- a/src/ptbench/data/shenzhen/default.py
+++ b/src/ptbench/data/shenzhen/default.py
@@ -1,15 +1,17 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("default.json")
 """Default Shenzhen TB database split.
 
+Database reference: [MONTGOMERY-SHENZHEN-2014]_
+
 * Training samples: 64% of TB and healthy CXR (including labels)
 * Validation samples: 16% of TB and healthy CXR (including labels)
 * Test samples: 20% of TB and healthy CXR (including labels)
 
 See :py:class:`.shenzhen.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("default.json")
diff --git a/src/ptbench/data/shenzhen/fold_0.py b/src/ptbench/data/shenzhen/fold_0.py
index dc895f782752ea79f4597ee6f7c2e7af88f97d58..df1359ae33f1331e6bbae4c48069ef232f34d824 100644
--- a/src/ptbench/data/shenzhen/fold_0.py
+++ b/src/ptbench/data/shenzhen/fold_0.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-0.json")
 """Shenzhen datamodule for computer-aided diagnosis (cross validation fold 0).
 
+Database reference: [MONTGOMERY-SHENZHEN-2014]_
+
 See :py:class:`.shenzhen.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-0.json")
diff --git a/src/ptbench/data/shenzhen/fold_1.py b/src/ptbench/data/shenzhen/fold_1.py
index ce062462f79385e7db05be8f0a51b5de050b9235..03be3fa6555ef9b8844d2814dab8e4ac4d293e23 100644
--- a/src/ptbench/data/shenzhen/fold_1.py
+++ b/src/ptbench/data/shenzhen/fold_1.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-1.json")
 """Shenzhen datamodule for computer-aided diagnosis (cross validation fold 1).
 
+Database reference: [MONTGOMERY-SHENZHEN-2014]_
+
 See :py:class:`.shenzhen.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-1.json")
diff --git a/src/ptbench/data/shenzhen/fold_2.py b/src/ptbench/data/shenzhen/fold_2.py
index 3f061c371c238c094b16983a81d81438a7f0e847..f4bd72d89bc66ca4cca47ec851f8f202bcd25278 100644
--- a/src/ptbench/data/shenzhen/fold_2.py
+++ b/src/ptbench/data/shenzhen/fold_2.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-2.json")
 """Shenzhen datamodule for computer-aided diagnosis (cross validation fold 2).
 
+Database reference: [MONTGOMERY-SHENZHEN-2014]_
+
 See :py:class:`.shenzhen.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-2.json")
diff --git a/src/ptbench/data/shenzhen/fold_3.py b/src/ptbench/data/shenzhen/fold_3.py
index e3bb067e085fa6062caf45126aad2cf69b31a9d2..b41c78861b56d5d010a3400c2d281c96135b81c3 100644
--- a/src/ptbench/data/shenzhen/fold_3.py
+++ b/src/ptbench/data/shenzhen/fold_3.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-3.json")
 """Shenzhen datamodule for computer-aided diagnosis (cross validation fold 3).
 
+Database reference: [MONTGOMERY-SHENZHEN-2014]_
+
 See :py:class:`.shenzhen.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-3.json")
diff --git a/src/ptbench/data/shenzhen/fold_4.py b/src/ptbench/data/shenzhen/fold_4.py
index f0cb843bd533d6925677896b25c6db9cd41c961a..f9105989f0b812a19fbaf8db9d9283053081938e 100644
--- a/src/ptbench/data/shenzhen/fold_4.py
+++ b/src/ptbench/data/shenzhen/fold_4.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-4.json")
 """Shenzhen datamodule for computer-aided diagnosis (cross validation fold 4).
 
+Database reference: [MONTGOMERY-SHENZHEN-2014]_
+
 See :py:class:`.shenzhen.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-4.json")
diff --git a/src/ptbench/data/shenzhen/fold_5.py b/src/ptbench/data/shenzhen/fold_5.py
index 6a27ac51522a571b91b9b589fe48a72c31cff3b7..7882e8990bd4512967128374a82b8763c8701a40 100644
--- a/src/ptbench/data/shenzhen/fold_5.py
+++ b/src/ptbench/data/shenzhen/fold_5.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-5.json")
 """Shenzhen datamodule for computer-aided diagnosis (cross validation fold 5).
 
+Database reference: [MONTGOMERY-SHENZHEN-2014]_
+
 See :py:class:`.shenzhen.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-5.json")
diff --git a/src/ptbench/data/shenzhen/fold_6.py b/src/ptbench/data/shenzhen/fold_6.py
index 302d2b8dbf262a0ebe1a590de81d826ab04beb7b..4d11aca0a0c46753d4acc4c6e252309a6af24ab8 100644
--- a/src/ptbench/data/shenzhen/fold_6.py
+++ b/src/ptbench/data/shenzhen/fold_6.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-6.json")
 """Shenzhen datamodule for computer-aided diagnosis (cross validation fold 6).
 
+Database reference: [MONTGOMERY-SHENZHEN-2014]_
+
 See :py:class:`.shenzhen.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-6.json")
diff --git a/src/ptbench/data/shenzhen/fold_7.py b/src/ptbench/data/shenzhen/fold_7.py
index a07f4d293eb3debee97b8d427863605624bb4536..8a7943459ea9b3a103bd25f031cd44e8ae66fb78 100644
--- a/src/ptbench/data/shenzhen/fold_7.py
+++ b/src/ptbench/data/shenzhen/fold_7.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-7.json")
 """Shenzhen datamodule for computer-aided diagnosis (cross validation fold 7).
 
+Database reference: [MONTGOMERY-SHENZHEN-2014]_
+
 See :py:class:`.shenzhen.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-7.json")
diff --git a/src/ptbench/data/shenzhen/fold_8.py b/src/ptbench/data/shenzhen/fold_8.py
index 0c5e6d225adabbf98b36006ae29a36f644ed6689..9abe5fa47349ce40dfe9fb8bfac85ca022ab8c60 100644
--- a/src/ptbench/data/shenzhen/fold_8.py
+++ b/src/ptbench/data/shenzhen/fold_8.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-8.json")
 """Shenzhen datamodule for computer-aided diagnosis (cross validation fold 8).
 
+Database reference: [MONTGOMERY-SHENZHEN-2014]_
+
 See :py:class:`.shenzhen.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-8.json")
diff --git a/src/ptbench/data/shenzhen/fold_9.py b/src/ptbench/data/shenzhen/fold_9.py
index bb73ea16c6fcbc70b092ab1e60b57c38f517a75a..06fab9743af4037b1a9415c35ef648dd60951cd4 100644
--- a/src/ptbench/data/shenzhen/fold_9.py
+++ b/src/ptbench/data/shenzhen/fold_9.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-9.json")
 """Shenzhen datamodule for computer-aided diagnosis (cross validation fold 9).
 
+Database reference: [MONTGOMERY-SHENZHEN-2014]_
+
 See :py:class:`.shenzhen.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-9.json")
diff --git a/src/ptbench/data/tbpoc/fold_0.py b/src/ptbench/data/tbpoc/fold_0.py
index 2beb07fdfed14bb7509ad24f08178853dce46e1a..5c4525047d486bf8891aa85f0fe68591067d1f79 100644
--- a/src/ptbench/data/tbpoc/fold_0.py
+++ b/src/ptbench/data/tbpoc/fold_0.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-0.json")
 """TB-POC dataset for TB detection (cross validation fold 0).
 
+Database reference: [TB-POC-2018]_
+
 See :py:class:`.tbpoc.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-0.json")
diff --git a/src/ptbench/data/tbpoc/fold_1.py b/src/ptbench/data/tbpoc/fold_1.py
index 338d99b2cf4d902a5d767c6789078bbbbd2ecc0d..a2fe60830287470a2d3c39ec716fb0119aded6ad 100644
--- a/src/ptbench/data/tbpoc/fold_1.py
+++ b/src/ptbench/data/tbpoc/fold_1.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-1.json")
 """TB-POC dataset for TB detection (cross validation fold 1).
 
+Database reference: [TB-POC-2018]_
+
 See :py:class:`.tbpoc.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-1.json")
diff --git a/src/ptbench/data/tbpoc/fold_2.py b/src/ptbench/data/tbpoc/fold_2.py
index 9df72b54046984edcbe097e17001ff065493e190..f0aa508cd2d75f06fe82e99a2476559d5595828b 100644
--- a/src/ptbench/data/tbpoc/fold_2.py
+++ b/src/ptbench/data/tbpoc/fold_2.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-2.json")
 """TB-POC dataset for TB detection (cross validation fold 2).
 
+Database reference: [TB-POC-2018]_
+
 See :py:class:`.tbpoc.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-2.json")
diff --git a/src/ptbench/data/tbpoc/fold_3.py b/src/ptbench/data/tbpoc/fold_3.py
index 514bf12c466a0b604cd0793438f0294e619cfd75..b13213c74d5244dd73e4aa618764ac36fc33ed1a 100644
--- a/src/ptbench/data/tbpoc/fold_3.py
+++ b/src/ptbench/data/tbpoc/fold_3.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-3.json")
 """TB-POC dataset for TB detection (cross validation fold 3).
 
+Database reference: [TB-POC-2018]_
+
 See :py:class:`.tbpoc.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-3.json")
diff --git a/src/ptbench/data/tbpoc/fold_4.py b/src/ptbench/data/tbpoc/fold_4.py
index d4f87280283f3d3660d6c2ef1ec92e93d7b359ed..fe153fc697bda231c73bd533f710d63a84cc15af 100644
--- a/src/ptbench/data/tbpoc/fold_4.py
+++ b/src/ptbench/data/tbpoc/fold_4.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-4.json")
 """TB-POC dataset for TB detection (cross validation fold 4).
 
+Database reference: [TB-POC-2018]_
+
 See :py:class:`.tbpoc.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-4.json")
diff --git a/src/ptbench/data/tbpoc/fold_5.py b/src/ptbench/data/tbpoc/fold_5.py
index 2df9a7ff444a8d0946345426f02f83f27c2da0f1..7759ccc7b8cad4e1f2d54d7e11987700d985df34 100644
--- a/src/ptbench/data/tbpoc/fold_5.py
+++ b/src/ptbench/data/tbpoc/fold_5.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-5.json")
 """TB-POC dataset for TB detection (cross validation fold 5).
 
+Database reference: [TB-POC-2018]_
+
 See :py:class:`.tbpoc.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-5.json")
diff --git a/src/ptbench/data/tbpoc/fold_6.py b/src/ptbench/data/tbpoc/fold_6.py
index 5d4fd08a0c8490b934e142095d4218818f69e288..35be05a4e2d0f0eaa86dc789f2da1cfb18a5c2e8 100644
--- a/src/ptbench/data/tbpoc/fold_6.py
+++ b/src/ptbench/data/tbpoc/fold_6.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-6.json")
 """TB-POC dataset for TB detection (cross validation fold 6).
 
+Database reference: [TB-POC-2018]_
+
 See :py:class:`.tbpoc.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-6.json")
diff --git a/src/ptbench/data/tbpoc/fold_7.py b/src/ptbench/data/tbpoc/fold_7.py
index 3b0b137f7db9f688bb4e34d8fc58ecb1ade9775c..da5bec1e26bc911a964d06c196e35462ab6b5962 100644
--- a/src/ptbench/data/tbpoc/fold_7.py
+++ b/src/ptbench/data/tbpoc/fold_7.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-7.json")
 """TB-POC dataset for TB detection (cross validation fold 7).
 
+Database reference: [TB-POC-2018]_
+
 See :py:class:`.tbpoc.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-7.json")
diff --git a/src/ptbench/data/tbpoc/fold_8.py b/src/ptbench/data/tbpoc/fold_8.py
index f0304467db0fbb75096a95ffccecd30a49174b5c..65339cc04b4cfe7616c88f0a3c15189b781d1ac7 100644
--- a/src/ptbench/data/tbpoc/fold_8.py
+++ b/src/ptbench/data/tbpoc/fold_8.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-8.json")
 """TB-POC dataset for TB detection (cross validation fold 8).
 
+Database reference: [TB-POC-2018]_
+
 See :py:class:`.tbpoc.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-8.json")
diff --git a/src/ptbench/data/tbpoc/fold_9.py b/src/ptbench/data/tbpoc/fold_9.py
index 327c7156089fbfd1cb1ae21e8d5e8d507e4a5361..dd42e068947eeaafea5ff9600598d85b91a899cc 100644
--- a/src/ptbench/data/tbpoc/fold_9.py
+++ b/src/ptbench/data/tbpoc/fold_9.py
@@ -1,11 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("fold-9.json")
 """TB-POC dataset for TB detection (cross validation fold 9).
 
+Database reference: [TB-POC-2018]_
+
 See :py:class:`.tbpoc.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("fold-9.json")
diff --git a/src/ptbench/data/tbx11k/v1_fold_0.py b/src/ptbench/data/tbx11k/v1_fold_0.py
index 63001c494251339d20ad5679bc14682653f784c1..ecf1e295ac32e61a0db1e127a75799649eab7661 100644
--- a/src/ptbench/data/tbx11k/v1_fold_0.py
+++ b/src/ptbench/data/tbx11k/v1_fold_0.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""TBX11k dataset for TB detection (cross fold-0, v1: healthy vs. active TB
+cases).
+
+Database reference: [TBX11K-2020]_
+
+See :py:class:`.tbx11k.datamodule.DataModule` for technical details.
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/tbx11k/v1_fold_1.py b/src/ptbench/data/tbx11k/v1_fold_1.py
index 37a208a5c7dac1ae2605fb4d1e739f8da59bbb90..b74f9ac95589605d597384a71587a63ed236cd49 100644
--- a/src/ptbench/data/tbx11k/v1_fold_1.py
+++ b/src/ptbench/data/tbx11k/v1_fold_1.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""TBX11k dataset for TB detection (cross fold-1, v1: healthy vs. active TB
+cases).
+
+Database reference: [TBX11K-2020]_
+
+See :py:class:`.tbx11k.datamodule.DataModule` for technical details.
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/tbx11k/v1_fold_2.py b/src/ptbench/data/tbx11k/v1_fold_2.py
index ddc512c90b99e06345375915bd7a4c5d03a19f42..c52f415ab991e363dc63fe8e038d4c0bb6fa125a 100644
--- a/src/ptbench/data/tbx11k/v1_fold_2.py
+++ b/src/ptbench/data/tbx11k/v1_fold_2.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""TBX11k dataset for TB detection (cross fold-2, v1: healthy vs. active TB
+cases).
+
+Database reference: [TBX11K-2020]_
+
+See :py:class:`.tbx11k.datamodule.DataModule` for technical details.
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/tbx11k/v1_fold_3.py b/src/ptbench/data/tbx11k/v1_fold_3.py
index 52429614dbd1b92cfaf0315777a6fd293ea04962..327948485e668138f2adf30b4c3972f421028fec 100644
--- a/src/ptbench/data/tbx11k/v1_fold_3.py
+++ b/src/ptbench/data/tbx11k/v1_fold_3.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""TBX11k dataset for TB detection (cross fold-3, v1: healthy vs. active TB
+cases).
+
+Database reference: [TBX11K-2020]_
+
+See :py:class:`.tbx11k.datamodule.DataModule` for technical details.
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/tbx11k/v1_fold_4.py b/src/ptbench/data/tbx11k/v1_fold_4.py
index fbeb9dca75b55abb91a8795b3cc66296c8a71b65..1c1492322485c0d12481398f78e3f58863a26d25 100644
--- a/src/ptbench/data/tbx11k/v1_fold_4.py
+++ b/src/ptbench/data/tbx11k/v1_fold_4.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""TBX11k dataset for TB detection (cross fold-4, v1: healthy vs. active TB
+cases).
+
+Database reference: [TBX11K-2020]_
+
+See :py:class:`.tbx11k.datamodule.DataModule` for technical details.
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/tbx11k/v1_fold_5.py b/src/ptbench/data/tbx11k/v1_fold_5.py
index 485b8d782b4d68d6f64feb0ba3ae18b782e6e4a6..2a74b2194a87e0570f8d1ad0bff55c29fec77c35 100644
--- a/src/ptbench/data/tbx11k/v1_fold_5.py
+++ b/src/ptbench/data/tbx11k/v1_fold_5.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""TBX11k dataset for TB detection (cross fold-5, v1: healthy vs. active TB
+cases).
+
+Database reference: [TBX11K-2020]_
+
+See :py:class:`.tbx11k.datamodule.DataModule` for technical details.
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/tbx11k/v1_fold_6.py b/src/ptbench/data/tbx11k/v1_fold_6.py
index 54e613ddbdabf42f723151796a7a6113c977d965..67562a35bd299b21ebe688db205057d12a669bec 100644
--- a/src/ptbench/data/tbx11k/v1_fold_6.py
+++ b/src/ptbench/data/tbx11k/v1_fold_6.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""TBX11k dataset for TB detection (cross fold-6, v1: healthy vs. active TB
+cases).
+
+Database reference: [TBX11K-2020]_
+
+See :py:class:`.tbx11k.datamodule.DataModule` for technical details.
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/tbx11k/v1_fold_7.py b/src/ptbench/data/tbx11k/v1_fold_7.py
index f3fceecf6068c3908ab2f732e74e69ab947457cb..3d80b71e3819efc253c14a6b74e3e78e6c4c510d 100644
--- a/src/ptbench/data/tbx11k/v1_fold_7.py
+++ b/src/ptbench/data/tbx11k/v1_fold_7.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""TBX11k dataset for TB detection (cross fold-7, v1: healthy vs. active TB
+cases).
+
+Database reference: [TBX11K-2020]_
+
+See :py:class:`.tbx11k.datamodule.DataModule` for technical details.
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/tbx11k/v1_fold_8.py b/src/ptbench/data/tbx11k/v1_fold_8.py
index 4f33860b4794883cfd0c8647d849eb297684bfa6..f8e45fe19f82da0c162ab717bfa343cb2860b1ce 100644
--- a/src/ptbench/data/tbx11k/v1_fold_8.py
+++ b/src/ptbench/data/tbx11k/v1_fold_8.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""TBX11k dataset for TB detection (cross fold-8, v1: healthy vs. active TB
+cases).
+
+Database reference: [TBX11K-2020]_
+
+See :py:class:`.tbx11k.datamodule.DataModule` for technical details.
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/tbx11k/v1_fold_9.py b/src/ptbench/data/tbx11k/v1_fold_9.py
index 44f767c44ee675827f3125fcc5e80941c456f45e..0d3943548e8088c3e92aa5d16acf5774e786bce3 100644
--- a/src/ptbench/data/tbx11k/v1_fold_9.py
+++ b/src/ptbench/data/tbx11k/v1_fold_9.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""TBX11k dataset for TB detection (cross fold-9, v1: healthy vs. active TB
+cases).
+
+Database reference: [TBX11K-2020]_
+
+See :py:class:`.tbx11k.datamodule.DataModule` for technical details.
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/tbx11k/v1_healthy_vs_atb.py b/src/ptbench/data/tbx11k/v1_healthy_vs_atb.py
index fe0de82ac28049df89805a910c1c8f31bd2070ae..0845f03b6213f4d2b01f79744c4e15a28ca78b09 100644
--- a/src/ptbench/data/tbx11k/v1_healthy_vs_atb.py
+++ b/src/ptbench/data/tbx11k/v1_healthy_vs_atb.py
@@ -1,13 +1,11 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("v1-healthy-vs-atb.json")
 """TBX11k dataset for TB detection.  Split ``v1`` (healthy against active TB
 cases).
 
+Database reference: [TBX11K-2020]_
+
 Split v1 contains healthy subjects against active TB cases (total samples =
 4430):
 
@@ -28,4 +26,10 @@ Split v1 contains healthy subjects against active TB cases (total samples =
   - Healthy: 800
   - Active TB only: 157
   - Total: 957
+
+See :py:class:`.tbx11k.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("v1-healthy-vs-atb.json")
diff --git a/src/ptbench/data/tbx11k/v2_fold_0.py b/src/ptbench/data/tbx11k/v2_fold_0.py
index 7bf536b5f841144315cd9f55b07be13c1b08d14b..8ccb73edb8863ccf973a9bb4d2e7a06c8802d694 100644
--- a/src/ptbench/data/tbx11k/v2_fold_0.py
+++ b/src/ptbench/data/tbx11k/v2_fold_0.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""TBX11k dataset for TB detection (cross fold-0, v2: healthy, sick and latent
+TB vs. active TB cases).
+
+Database reference: [TBX11K-2020]_
+
+See :py:class:`.tbx11k.datamodule.DataModule` for technical details.
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/tbx11k/v2_fold_1.py b/src/ptbench/data/tbx11k/v2_fold_1.py
index 6257e629aa0ff9129aa37b0949b86b35652b3531..9e1c3acaa7fff7f9a6c79ae9d376b23e1ad0a72d 100644
--- a/src/ptbench/data/tbx11k/v2_fold_1.py
+++ b/src/ptbench/data/tbx11k/v2_fold_1.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""TBX11k dataset for TB detection (cross fold-1, v2: healthy, sick and latent
+TB vs. active TB cases).
+
+Database reference: [TBX11K-2020]_
+
+See :py:class:`.tbx11k.datamodule.DataModule` for technical details.
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/tbx11k/v2_fold_2.py b/src/ptbench/data/tbx11k/v2_fold_2.py
index 72d93dbadb62ee873df80e6c115cc89bee3c53d9..24a00ece5a48e3a4b4cc0d782f2d634a3fbc9892 100644
--- a/src/ptbench/data/tbx11k/v2_fold_2.py
+++ b/src/ptbench/data/tbx11k/v2_fold_2.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""TBX11k dataset for TB detection (cross fold-2, v2: healthy, sick and latent
+TB vs. active TB cases).
+
+Database reference: [TBX11K-2020]_
+
+See :py:class:`.tbx11k.datamodule.DataModule` for technical details.
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/tbx11k/v2_fold_3.py b/src/ptbench/data/tbx11k/v2_fold_3.py
index 75d9e2c22058eea9a4d237865a8a88fdd188ff9a..9da2630d877af73283060965808bf78ae5e49114 100644
--- a/src/ptbench/data/tbx11k/v2_fold_3.py
+++ b/src/ptbench/data/tbx11k/v2_fold_3.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""TBX11k dataset for TB detection (cross fold-3, v2: healthy, sick and latent
+TB vs. active TB cases).
+
+Database reference: [TBX11K-2020]_
+
+See :py:class:`.tbx11k.datamodule.DataModule` for technical details.
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/tbx11k/v2_fold_4.py b/src/ptbench/data/tbx11k/v2_fold_4.py
index d1aad0247928f2fc2790472954a6bff854d8fad6..0555b567c6590aa9e8f492a627eaaab3ecf3b88f 100644
--- a/src/ptbench/data/tbx11k/v2_fold_4.py
+++ b/src/ptbench/data/tbx11k/v2_fold_4.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""TBX11k dataset for TB detection (cross fold-4, v2: healthy, sick and latent
+TB vs. active TB cases).
+
+Database reference: [TBX11K-2020]_
+
+See :py:class:`.tbx11k.datamodule.DataModule` for technical details.
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/tbx11k/v2_fold_5.py b/src/ptbench/data/tbx11k/v2_fold_5.py
index 8b0a5a0740acdf956d1d55788d678d488c51af72..1fddcc2fe1299e73f6abc15156a3acca03b8ad71 100644
--- a/src/ptbench/data/tbx11k/v2_fold_5.py
+++ b/src/ptbench/data/tbx11k/v2_fold_5.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""TBX11k dataset for TB detection (cross fold-5, v2: healthy, sick and latent
+TB vs. active TB cases).
+
+Database reference: [TBX11K-2020]_
+
+See :py:class:`.tbx11k.datamodule.DataModule` for technical details.
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/tbx11k/v2_fold_6.py b/src/ptbench/data/tbx11k/v2_fold_6.py
index 5d9f2b722ddb80ac8123d5e41af2cf5a791b3b05..d9085af141544d1027c58b48384f5cdff55a525b 100644
--- a/src/ptbench/data/tbx11k/v2_fold_6.py
+++ b/src/ptbench/data/tbx11k/v2_fold_6.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""TBX11k dataset for TB detection (cross fold-6, v2: healthy, sick and latent
+TB vs. active TB cases).
+
+Database reference: [TBX11K-2020]_
+
+See :py:class:`.tbx11k.datamodule.DataModule` for technical details.
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/tbx11k/v2_fold_7.py b/src/ptbench/data/tbx11k/v2_fold_7.py
index 308a10a19db9a4708190adc7c209e6f4306854c5..b324e129e500e0881709e1f60490289b8372c04c 100644
--- a/src/ptbench/data/tbx11k/v2_fold_7.py
+++ b/src/ptbench/data/tbx11k/v2_fold_7.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""TBX11k dataset for TB detection (cross fold-7, v2: healthy, sick and latent
+TB vs. active TB cases).
+
+Database reference: [TBX11K-2020]_
+
+See :py:class:`.tbx11k.datamodule.DataModule` for technical details.
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/tbx11k/v2_fold_8.py b/src/ptbench/data/tbx11k/v2_fold_8.py
index cd73fe53e00851a297d5aaae8efb921cbf7b2400..31ed229a195bcbbb759354f5a8c4bbbb2f23b0df 100644
--- a/src/ptbench/data/tbx11k/v2_fold_8.py
+++ b/src/ptbench/data/tbx11k/v2_fold_8.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""TBX11k dataset for TB detection (cross fold-8, v2: healthy, sick and latent
+TB vs. active TB cases).
+
+Database reference: [TBX11K-2020]_
+
+See :py:class:`.tbx11k.datamodule.DataModule` for technical details.
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/tbx11k/v2_fold_9.py b/src/ptbench/data/tbx11k/v2_fold_9.py
index 87a5b2d66b7da94cf947134572b2a6ccb7aec277..74db9a28df0db04c72bd59b745309d757dc6163d 100644
--- a/src/ptbench/data/tbx11k/v2_fold_9.py
+++ b/src/ptbench/data/tbx11k/v2_fold_9.py
@@ -1,6 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
+"""TBX11k dataset for TB detection (cross fold-9, v2: healthy, sick and latent
+TB vs. active TB cases).
+
+Database reference: [TBX11K-2020]_
+
+See :py:class:`.tbx11k.datamodule.DataModule` for technical details.
+"""
 
 from .datamodule import DataModule
 
diff --git a/src/ptbench/data/tbx11k/v2_others_vs_atb.py b/src/ptbench/data/tbx11k/v2_others_vs_atb.py
index 5bee7bd05dc882a4dc4d5c92780b0304a293f88b..b5f78019c2e97346af95eaf38eed745a6ac3d583 100644
--- a/src/ptbench/data/tbx11k/v2_others_vs_atb.py
+++ b/src/ptbench/data/tbx11k/v2_others_vs_atb.py
@@ -1,13 +1,11 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-
-from .datamodule import DataModule
-
-datamodule = DataModule("v2-others-vs-atb.json")
 """TBX11k dataset for TB detection.  Split ``v1`` (everything else against
 active TB cases).
 
+Database reference: [TBX11K-2020]_
+
 Split v2 contains healthy, sick (no TB), and latent TB subjects against
 active TB cases (total samples = 8369):
 
@@ -28,4 +26,10 @@ active TB cases (total samples = 8369):
   - Healthy, Sick or Latent TB: 1636
   - Active TB only: 157
   - Total: 1793
+
+See :py:class:`.tbx11k.datamodule.DataModule` for technical details.
 """
+
+from .datamodule import DataModule
+
+datamodule = DataModule("v2-others-vs-atb.json")
diff --git a/src/ptbench/models/config/alexnet.py b/src/ptbench/models/config/alexnet.py
index 7dddc4c795a75254d3bd4770722b55381775347f..9adcfec8dfb437ec2fc7b211da1e477ddc3b4fd1 100644
--- a/src/ptbench/models/config/alexnet.py
+++ b/src/ptbench/models/config/alexnet.py
@@ -1,7 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-"""AlexNet."""
+"""AlexNet_, to be trained from scratch.
+
+This configuration contains a version of AlexNet_ (c.f. `TorchVision's
+page <alexnet_pytorch_>`), modified for a variable number of outputs
+(defaults to 1).
+"""
 
 from torch.nn import BCEWithLogitsLoss
 from torch.optim import SGD
diff --git a/src/ptbench/models/config/alexnet_pretrained.py b/src/ptbench/models/config/alexnet_pretrained.py
index fb9ae5b5a4bfd1208beb08d2f50f4c640dbf7469..81f72b87d3fc4c67aa851dccacb74ca30476b4fb 100644
--- a/src/ptbench/models/config/alexnet_pretrained.py
+++ b/src/ptbench/models/config/alexnet_pretrained.py
@@ -1,7 +1,14 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-"""AlexNet."""
+"""AlexNet_, to be fine-tuned. Pre-trained on ImageNet_.
+
+This configuration contains a version of AlexNet_ (c.f. `TorchVision's
+page <alexnet_pytorch_>`), modified for a variable number of outputs
+(defaults to 1).
+
+N.B.: The output layer is **always** initialized from scratch.
+"""
 
 from torch.nn import BCEWithLogitsLoss
 from torch.optim import SGD
diff --git a/src/ptbench/models/config/densenet.py b/src/ptbench/models/config/densenet.py
index 3cece962081b4cbe5ed03d5ba6c2808a4e5abecc..bfee577f97c6ba869a555b4eb50ee595c95c2c7c 100644
--- a/src/ptbench/models/config/densenet.py
+++ b/src/ptbench/models/config/densenet.py
@@ -1,7 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-"""DenseNet."""
+"""DenseNet_, to be trained from scratch.
+
+This configuration contains a version of DenseNet_ (c.f. `TorchVision's
+page <densenet_pytorch_>`), modified for a variable number of outputs
+(defaults to 1).
+"""
 
 from torch.nn import BCEWithLogitsLoss
 from torch.optim import Adam
diff --git a/src/ptbench/models/config/densenet_pretrained.py b/src/ptbench/models/config/densenet_pretrained.py
index 949b1e9e915bf6154c832403e677c2da9b79cc9f..9b1fa4caeb18b8a6c64b99c92d554d132af0e562 100644
--- a/src/ptbench/models/config/densenet_pretrained.py
+++ b/src/ptbench/models/config/densenet_pretrained.py
@@ -1,7 +1,14 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-"""DenseNet."""
+"""DenseNet_, to be fine-tuned. Pre-trained on ImageNet_.
+
+This configuration contains a version of DenseNet_ (c.f. `TorchVision's
+page <alexnet_pytorch_>`), modified for a variable number of outputs
+(defaults to 1).
+
+N.B.: The output layer is **always** initialized from scratch.
+"""
 
 from torch.nn import BCEWithLogitsLoss
 from torch.optim import Adam
diff --git a/src/ptbench/models/config/densenet_rs.py b/src/ptbench/models/config/densenet_rs.py
index 57d23f436e2e55b6aab8c6f2de92748c0d87794b..3f625686dfd8c43f5b9d65af5f6eab39d297c4ff 100644
--- a/src/ptbench/models/config/densenet_rs.py
+++ b/src/ptbench/models/config/densenet_rs.py
@@ -1,10 +1,12 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-"""CNN for detecting radiological findings.
+"""DenseNet_, to be trained from scratch.
 
-A Densenet-121 model for radiological sign detection, using the NIH
-CXR-14 label format (ie. 14 outputs).
+This configuration contains a version of DenseNet_ (c.f. `TorchVision's
+page <densenet_pytorch_>`), modified to have exactly 14 outputs
+(matching the number of classes on NIH CXR-14).  It can be used to train
+weights from scratch for radiological sign detection.
 """
 
 from torch.nn import BCEWithLogitsLoss
diff --git a/src/ptbench/models/config/logistic_regression.py b/src/ptbench/models/config/logistic_regression.py
index 49678bcb86006b93dbebc29afb4cfb639d114eb5..b93589df32e496c7352a11a92c94479a7f71ae31 100644
--- a/src/ptbench/models/config/logistic_regression.py
+++ b/src/ptbench/models/config/logistic_regression.py
@@ -1,28 +1,13 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-"""Feedforward network for Tuberculosis Detection.
+"""Logistic regression classifier, to be trained from scratch.
 
-Simple feedforward network taking radiological signs in output and
-predicting tuberculosis presence in output.
+This configuration file defines a logistic regression classifier that can take
+the output of :py:mod:`.densenet_rs` and be trained for binary classification
+(e.g. for active TB detection).
 """
-from torch import empty
-from torch.nn import BCEWithLogitsLoss
 
 from ptbench.models.logistic_regression import LogisticRegression
 
-# config
-optimizer_configs = {"lr": 1e-2}
-input_size = 14
-
-# optimizer
-optimizer = "Adam"
-
-# criterion
-criterion = BCEWithLogitsLoss(pos_weight=empty(1))
-criterion_valid = BCEWithLogitsLoss(pos_weight=empty(1))
-
-# model
-model = LogisticRegression(
-    criterion, criterion_valid, optimizer, optimizer_configs, input_size
-)
+model = LogisticRegression(input_size=14)
diff --git a/src/ptbench/models/config/mlp.py b/src/ptbench/models/config/mlp.py
new file mode 100644
index 0000000000000000000000000000000000000000..c87432d77f75270f7a14430126b8be4c9a33594d
--- /dev/null
+++ b/src/ptbench/models/config/mlp.py
@@ -0,0 +1,13 @@
+# SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+"""Feedforward shallow MLP for binary classification.
+
+Simple feedforward MLP taking multiple inputs and generating a single
+output (e.g. to predict active TB presence from radiological finding
+estimates).
+"""
+
+from ptbench.models.mlp import MultiLayerPerceptron
+
+model = MultiLayerPerceptron()
diff --git a/src/ptbench/models/config/pasa.py b/src/ptbench/models/config/pasa.py
index 12775592d5ee183245b36361b97d27b1a698e022..c419b5fe024859f7b2da21b67e4a7cbd3cdb927b 100644
--- a/src/ptbench/models/config/pasa.py
+++ b/src/ptbench/models/config/pasa.py
@@ -1,7 +1,7 @@
 # SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
-"""CNN for Tuberculosis Detection.
+"""Simple CNN for Tuberculosis Detection, to be trained from scratch.
 
 Implementation of the model architecture proposed by F. Pasa in the article
 "Efficient Deep Network Architectures for Fast Chest X-Ray Tuberculosis
diff --git a/src/ptbench/models/config/signs_to_tb.py b/src/ptbench/models/config/signs_to_tb.py
deleted file mode 100644
index 21bc79e23f6b234c4baac442fac61cc17e8c10b6..0000000000000000000000000000000000000000
--- a/src/ptbench/models/config/signs_to_tb.py
+++ /dev/null
@@ -1,28 +0,0 @@
-# SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
-#
-# SPDX-License-Identifier: GPL-3.0-or-later
-"""Feedforward network for Tuberculosis Detection.
-
-Simple feedforward network taking radiological signs in output and
-predicting tuberculosis presence in output.
-"""
-
-from torch import empty
-from torch.nn import BCEWithLogitsLoss
-
-from ptbench.models.signs_to_tb import SignsToTB
-
-# config
-optimizer_configs = {"lr": 1e-2}
-
-# optimizer
-optimizer = "Adam"
-
-# criterion
-criterion = BCEWithLogitsLoss(pos_weight=empty(1))
-criterion_valid = BCEWithLogitsLoss(pos_weight=empty(1))
-
-# model
-model = SignsToTB(
-    criterion, criterion_valid, optimizer, optimizer_configs, 14, 10
-)
diff --git a/src/ptbench/models/logistic_regression.py b/src/ptbench/models/logistic_regression.py
index dfde83181a466b3ca2d4b5fd71f02bf8e583836e..d0f952bbf9230206c0f66a0c342b9f3cf52b83c0 100644
--- a/src/ptbench/models/logistic_regression.py
+++ b/src/ptbench/models/logistic_regression.py
@@ -2,37 +2,72 @@
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
 
+import typing
+
 import lightning.pytorch as pl
 import torch
 import torch.nn as nn
 
 
 class LogisticRegression(pl.LightningModule):
-    """Radiological signs to Tuberculosis module."""
+    """Logistic regression classifier with a single output.
+
+    Parameters
+    ----------
+    train_loss
+        The loss to be used during the training.
+
+        .. warning::
+
+           The loss should be set to always return batch averages (as opposed
+           to the batch sum), as our logging system expects it so.
+
+    validation_loss
+        The loss to be used for validation (may be different from the training
+        loss).  If extra-validation sets are provided, the same loss will be
+        used throughout.
+
+        .. warning::
+
+           The loss should be set to always return batch averages (as opposed
+           to the batch sum), as our logging system expects it so.
+
+    optimizer_type
+        The type of optimizer to use for training
+
+    optimizer_arguments
+        Arguments to the optimizer after ``params``.
+
+    input_size
+        The number of inputs this classifer shall process.
+    """
 
     def __init__(
         self,
-        criterion,
-        criterion_valid,
-        optimizer,
-        optimizer_configs,
-        input_size,
+        train_loss: torch.nn.Module = torch.nn.BCEWithLogitsLoss(),
+        validation_loss: torch.nn.Module | None = None,
+        optimizer_type: type[torch.optim.Optimizer] = torch.optim.Adam,
+        optimizer_arguments: dict[str, typing.Any] = {"lr": 1e-2},
+        input_size: int = 14,
     ):
         super().__init__()
 
-        self.save_hyperparameters(ignore=["criterion", "criterion_valid"])
+        self._train_loss = train_loss.to(self.device)
+        self._validation_loss = (
+            validation_loss if validation_loss is not None else train_loss
+        ).to(self.device)
+        self._optimizer_type = optimizer_type
+        self._optimizer_arguments = optimizer_arguments
 
-        self.name = "logistic_regression"
+        self.name = "logistic-regression"
 
-        self.linear = nn.Linear(self.hparams.input_size, 1)
+        self.linear = nn.Linear(input_size, 1)
 
     def forward(self, x):
-        output = self.linear(x)
-
-        return output
+        return self.linear(x)
 
     def training_step(self, batch, batch_idx):
-        images = batch[1]
+        input = batch[1]
         labels = batch[2]
 
         # Increase label dimension if too low
@@ -41,16 +76,16 @@ class LogisticRegression(pl.LightningModule):
             labels = torch.reshape(labels, (labels.shape[0], 1))
 
         # Forward pass on the network
-        outputs = self(images)
+        output = self(input)
 
         # Manually move criterion to selected device, since not part of the model.
-        self.hparams.criterion = self.hparams.criterion.to(self.device)
-        training_loss = self.hparams.criterion(outputs, labels.float())
+        self._train_loss = self._train_loss.to(self.device)
+        training_loss = self._train_loss(output, labels.float())
 
         return {"loss": training_loss}
 
     def validation_step(self, batch, batch_idx, dataloader_idx=0):
-        images = batch[1]
+        input = batch[1]
         labels = batch[2]
 
         # Increase label dimension if too low
@@ -59,13 +94,11 @@ class LogisticRegression(pl.LightningModule):
             labels = torch.reshape(labels, (labels.shape[0], 1))
 
         # data forwarding on the existing network
-        outputs = self(images)
+        output = self(input)
 
         # Manually move criterion to selected device, since not part of the model.
-        self.hparams.criterion_valid = self.hparams.criterion_valid.to(
-            self.device
-        )
-        validation_loss = self.hparams.criterion_valid(outputs, labels.float())
+        self._validation_loss = self._validation_loss.to(self.device)
+        validation_loss = self._validation_loss(output, labels.float())
 
         if dataloader_idx == 0:
             return {"validation_loss": validation_loss}
@@ -74,21 +107,19 @@ class LogisticRegression(pl.LightningModule):
 
     def predict_step(self, batch, batch_idx, dataloader_idx=0, grad_cams=False):
         names = batch[0]
-        images = batch[1]
+        input = batch[1]
 
-        outputs = self(images)
-        probabilities = torch.sigmoid(outputs)
+        output = self(input)
+        probabilities = torch.sigmoid(output)
 
         # necessary check for HED architecture that uses several outputs
         # for loss calculation instead of just the last concatfuse block
-        if isinstance(outputs, list):
-            outputs = outputs[-1]
+        if isinstance(output, list):
+            output = output[-1]
 
         return names[0], torch.flatten(probabilities), torch.flatten(batch[2])
 
     def configure_optimizers(self):
-        optimizer = getattr(torch.optim, self.hparams.optimizer)(
-            self.parameters(), **self.hparams.optimizer_configs
+        return self._optimizer_type(
+            self.parameters(), **self._optimizer_arguments
         )
-
-        return optimizer
diff --git a/src/ptbench/models/mlp.py b/src/ptbench/models/mlp.py
new file mode 100644
index 0000000000000000000000000000000000000000..54c7cb69196b109773ad65140ce680d8f16d2bcb
--- /dev/null
+++ b/src/ptbench/models/mlp.py
@@ -0,0 +1,130 @@
+# SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+import typing
+
+import lightning.pytorch as pl
+import torch
+
+
+class MultiLayerPerceptron(pl.LightningModule):
+    """MLP with a variable number of inputs and hidden neurons (single layer).
+
+    Parameters
+    ----------
+    train_loss
+        The loss to be used during the training.
+
+        .. warning::
+
+           The loss should be set to always return batch averages (as opposed
+           to the batch sum), as our logging system expects it so.
+
+    validation_loss
+        The loss to be used for validation (may be different from the training
+        loss).  If extra-validation sets are provided, the same loss will be
+        used throughout.
+
+        .. warning::
+
+           The loss should be set to always return batch averages (as opposed
+           to the batch sum), as our logging system expects it so.
+
+    optimizer_type
+        The type of optimizer to use for training
+
+    optimizer_arguments
+        Arguments to the optimizer after ``params``.
+
+    input_size
+        The number of inputs this classifer shall process.
+
+    hidden_size
+        The number of neurons on the single hidden layer.
+    """
+
+    def __init__(
+        self,
+        train_loss: torch.nn.Module = torch.nn.BCEWithLogitsLoss(),
+        validation_loss: torch.nn.Module | None = None,
+        optimizer_type: type[torch.optim.Optimizer] = torch.optim.Adam,
+        optimizer_arguments: dict[str, typing.Any] = {"lr": 1e-2},
+        input_size: int = 14,
+        hidden_size: int = 10,
+    ):
+        super().__init__()
+
+        self._train_loss = train_loss.to(self.device)
+        self._validation_loss = (
+            validation_loss if validation_loss is not None else train_loss
+        ).to(self.device)
+        self._optimizer_type = optimizer_type
+        self._optimizer_arguments = optimizer_arguments
+
+        self.name = "mlp"
+
+        self.fc1 = torch.nn.Linear(input_size, hidden_size)
+        self.relu = torch.nn.ReLU()
+        self.fc2 = torch.nn.Linear(hidden_size, 1)
+
+    def forward(self, x):
+        return self.fc2(self.relu(self.fc1(x)))
+
+    def training_step(self, batch, batch_idx):
+        input = batch[1]
+        labels = batch[2]
+
+        # Increase label dimension if too low
+        # Allows single and multiclass usage
+        if labels.ndim == 1:
+            labels = torch.reshape(labels, (labels.shape[0], 1))
+
+        # Forward pass on the network
+        output = self(input)
+
+        # Manually move criterion to selected device, since not part of the model.
+        self._train_loss = self._train_loss.to(self.device)
+        training_loss = self._train_loss(output, labels.float())
+
+        return {"loss": training_loss}
+
+    def validation_step(self, batch, batch_idx, dataloader_idx=0):
+        input = batch[1]
+        labels = batch[2]
+
+        # Increase label dimension if too low
+        # Allows single and multiclass usage
+        if labels.ndim == 1:
+            labels = torch.reshape(labels, (labels.shape[0], 1))
+
+        # data forwarding on the existing network
+        output = self(input)
+
+        # Manually move criterion to selected device, since not part of the model.
+        self._validation_loss = self._validation_loss.to(self.device)
+        validation_loss = self._validation_loss(output, labels.float())
+
+        if dataloader_idx == 0:
+            return {"validation_loss": validation_loss}
+        else:
+            return {f"extra_validation_loss_{dataloader_idx}": validation_loss}
+
+    def predict_step(self, batch, batch_idx, dataloader_idx=0, grad_cams=False):
+        names = batch[0]
+        input = batch[1]
+
+        output = self(input)
+        probabilities = torch.sigmoid(output)
+
+        # necessary check for HED architecture that uses several outputs
+        # for loss calculation instead of just the last concatfuse block
+        if isinstance(output, list):
+            output = output[-1]
+
+        return names[0], torch.flatten(probabilities), torch.flatten(batch[2])
+
+    def configure_optimizers(self):
+        return self._optimizer_type(
+            self.parameters(), **self._optimizer_arguments
+        )
diff --git a/src/ptbench/models/signs_to_tb.py b/src/ptbench/models/signs_to_tb.py
deleted file mode 100644
index 2f86ded58e518520efc3441fe2c1f6fd74d7a5eb..0000000000000000000000000000000000000000
--- a/src/ptbench/models/signs_to_tb.py
+++ /dev/null
@@ -1,102 +0,0 @@
-# SPDX-FileCopyrightText: Copyright © 2023 Idiap Research Institute <contact@idiap.ch>
-#
-# SPDX-License-Identifier: GPL-3.0-or-later
-
-import lightning.pytorch as pl
-import torch
-
-
-class SignsToTB(pl.LightningModule):
-    """Radiological signs to Tuberculosis module."""
-
-    def __init__(
-        self,
-        criterion,
-        criterion_valid,
-        optimizer,
-        optimizer_configs,
-        input_size,
-        hidden_size,
-    ):
-        super().__init__()
-
-        self.save_hyperparameters()
-
-        self.name = "signs_to_tb"
-
-        self.fc1 = torch.nn.Linear(
-            self.hparams.input_size, self.hparams.hidden_size
-        )
-        self.relu = torch.nn.ReLU()
-        self.fc2 = torch.nn.Linear(self.hparams.hidden_size, 1)
-
-    def forward(self, x):
-        hidden = self.fc1(x)
-        relu = self.relu(hidden)
-
-        output = self.fc2(relu)
-
-        return output
-
-    def training_step(self, batch, batch_idx):
-        images = batch[1]
-        labels = batch[2]
-
-        # Increase label dimension if too low
-        # Allows single and multiclass usage
-        if labels.ndim == 1:
-            labels = torch.reshape(labels, (labels.shape[0], 1))
-
-        # Forward pass on the network
-        outputs = self(images)
-
-        # Manually move criterion to selected device, since not part of the model.
-        self.hparams.criterion = self.hparams.criterion.to(self.device)
-        training_loss = self.hparams.criterion(outputs, labels.float())
-
-        return {"loss": training_loss}
-
-    def validation_step(self, batch, batch_idx, dataloader_idx=0):
-        images = batch[1]
-        labels = batch[2]
-
-        # Increase label dimension if too low
-        # Allows single and multiclass usage
-        if labels.ndim == 1:
-            labels = torch.reshape(labels, (labels.shape[0], 1))
-
-        # data forwarding on the existing network
-        outputs = self(images)
-
-        # Manually move criterion to selected device, since not part of the model.
-        self.hparams.criterion_valid = self.hparams.criterion_valid.to(
-            self.device
-        )
-        validation_loss = self.hparams.criterion_valid(outputs, labels.float())
-
-        if dataloader_idx == 0:
-            return {"validation_loss": validation_loss}
-        else:
-            return {f"extra_validation_loss_{dataloader_idx}": validation_loss}
-
-    def predict_step(self, batch, batch_idx, dataloader_idx=0, grad_cams=False):
-        names = batch[0]
-        images = batch[1]
-
-        outputs = self(images)
-        probabilities = torch.sigmoid(outputs)
-
-        # necessary check for HED architecture that uses several outputs
-        # for loss calculation instead of just the last concatfuse block
-        if isinstance(outputs, list):
-            outputs = outputs[-1]
-
-        return names[0], torch.flatten(probabilities), torch.flatten(batch[2])
-
-    def configure_optimizers(self):
-        # Dynamically instantiates the optimizer given the configs
-        optimizer = getattr(torch.optim, self.hparams.optimizer)(
-            self.parameters(), **self.hparams.optimizer_configs
-        )
-
-        return optimizer
diff --git a/src/ptbench/scripts/config.py b/src/ptbench/scripts/config.py
index c58d6ff634595d909f9c3a0122b7ca88ca7aa91b..a2d49dbfca01ce59f031ac0349594cc263cd56db 100644
--- a/src/ptbench/scripts/config.py
+++ b/src/ptbench/scripts/config.py
@@ -16,34 +16,6 @@ from clapper.logging import setup
 logger = setup(__name__.split(".")[0], format="%(levelname)s: %(message)s")
 
 
-def _retrieve_entry_points(
-    group: str,
-) -> typing.Iterable[importlib.metadata.EntryPoint]:
-    """Wraps various entry-point retrieval mechanisms.
-
-    For Python 3.9 and 3.10,
-    :py:func:`importlib.metadata.entry_points()`
-    returns a dictionary keyed by entry-point group names.  From Python
-    3.10
-    onwards, one may pass the ``group`` keyword to that function to
-    enable
-    pre-filtering, or use the ``select()`` method on the returned value,
-    which
-    is no longer a dictionary.
-
-    For anything before Python 3.8, you must use the backported library
-    ``importlib_metadata``.
-    """
-    import sys
-
-    if sys.version_info[:2] < (3, 10):
-        all_entry_points = importlib.metadata.entry_points()
-        return all_entry_points.get(group, [])  # Python 3.9
-
-    # Python 3.10 and above
-    return importlib.metadata.entry_points().select(group=group)
-
-
 @click.group(cls=AliasedGroup)
 def config():
     """Commands for listing, describing and copying configuration resources."""
@@ -74,7 +46,9 @@ def config():
 @verbosity_option(logger=logger)
 def list(verbose) -> None:
     """Lists configuration files installed."""
-    entry_points = _retrieve_entry_points("ptbench.config")
+    entry_points = importlib.metadata.entry_points().select(
+        group="ptbench.config"
+    )
     entry_point_dict = {k.name: k for k in entry_points}
 
     # all modules with configuration resources
@@ -158,7 +132,9 @@ def list(verbose) -> None:
 @verbosity_option(logger=logger)
 def describe(name, verbose) -> None:
     """Describes a specific configuration file."""
-    entry_points = _retrieve_entry_points("ptbench.config")
+    entry_points = importlib.metadata.entry_points().select(
+        group="ptbench.config"
+    )
     entry_point_dict = {k.name: k for k in entry_points}
 
     for k in name:
@@ -209,7 +185,9 @@ def copy(source, destination) -> None:
     """Copy a specific configuration resource so it can be modified locally."""
     import shutil
 
-    entry_points = _retrieve_entry_points("ptbench.config")
+    entry_points = importlib.metadata.entry_points().select(
+        group="ptbench.config"
+    )
     entry_point_dict = {k.name: k for k in entry_points}
 
     if source not in entry_point_dict: