Skip to main content

Benchmarking parameter-efficient fine-tuning of EEG foundation models

Project description

🧠 Open EEG Bench

HuggingFace Hub PyPI version Tests Python versions DOI

Benchmark any EEG foundation model with one function call.

✨ Why Open EEG Bench?

  • 🎯 One function, all results — Call benchmark() with your model and get a full evaluation across 12 datasets
  • 📦 Zero preprocessing — All datasets are pre-windowed and hosted on HuggingFace Hub, ready to use
  • 8 fine-tuning strategies — Frozen linear probing, ridge probing, LoRA, IA3, AdaLoRA, DoRA, OFT, and full fine-tuning
  • 🔌 Bring your own model — Any PyTorch model that takes EEG input and returns features works out of the box
  • 🔒 Reproducible by design — A single config object fully describes a run. No YAML files, no hidden state

🚀 Installation

pip install open-eeg-bench

🏁 Benchmark your model

import open_eeg_bench as oeb

results = oeb.benchmark(
    model_cls="my_package.MyModel",  # import path to your model class
    checkpoint_url="https://my-weights.pth",
)

print(results)  # pd.DataFrame

This runs linear probing on all 12 datasets and returns a DataFrame with one row per result.

You can pick specific datasets, fine-tuning strategies, classification heads and number of initialization seeds:

results = oeb.benchmark(
    model_cls="my_package.MyModel",
    checkpoint_url="https://my-weights.pth",
    datasets=["arithmetic_zyma2019", "bcic2a", "physionet"],
    finetuning_strategies=["frozen", "lora"],
    peft_target_modules=[  # necessary for LoRA, IA3, AdaLoRA, OFT, and DoRA
        "encoder.linear1", 
        "encoder.linear2"
    ],
    heads=["linear_head", "mlp_head"],
    n_seeds=5,
)

Need to run on a SLURM cluster? No sbatch scripts needed — see Running on a cluster.

📐 Model requirements

Your model only needs to:

  1. Accept input of shape (batch, n_chans, n_times)
  2. Return output of shape (batch, n_outputs)
  3. Have a named module for the classification head (default: self.final_layer)

⚙️ benchmark() parameters

Parameter Required Description
model_cls Yes Dotted import path to your model class
hub_repo One of three HuggingFace Hub repo ID for weights
checkpoint_url One of three URL to pretrained weights
checkpoint_path One of three Local path to pretrained weights
peft_target_modules For PEFT Module names to adapt (e.g. ["to_q", "to_k", "to_v"])
peft_ff_modules For IA3 Feedforward module names for IA3 adapter
model_kwargs No Extra kwargs for the model constructor
head_module_name No Name of the head module (default: "final_layer")
normalization No Post-window normalization
datasets No Dataset names to evaluate on (default: all 12)
heads No Head names: "linear_head", "mlp_head", "original_head" (default: ["linear_head"])
finetuning_strategies No Strategy names: "frozen", "ridge_probe", "lora", "ia3", "adalora", "dora", "oft", "full_finetune", "two_stages" (default: ["frozen"])
n_seeds No Number of random seeds (default: 3)
device No "cpu", "cuda", etc. (default: "cpu")
infra No Infrastructure config for caching and cluster submission (see cluster docs)
max_workers No Max simultaneous SLURM jobs (default: 256)

📊 Available datasets

All 12 datasets are pre-windowed and hosted on HuggingFace Hub:

Dataset HF ID Classes Window size Task
Arithmetic (Zyma 2019) braindecode/arithmetic_zyma2019 2 5 s Mental arithmetic vs. rest
BCI Competition IV 2a braindecode/bcic2a 4 4 s Motor imagery
BCI Competition 2020-3 braindecode/bcic2020-3 5 3 s Imagined speech
PhysioNet MI braindecode/physionet 4 3 s Motor imagery
CHB-MIT braindecode/chbmit 2 10 s Seizure detection
FACED braindecode/faced 9 10 s Emotion recognition
ISRUC-Sleep braindecode/isruc-sleep 5 30 s Sleep staging
MDD (Mumtaz 2016) braindecode/mdd_mumtaz2016 2 5 s Depression detection
SEED-V braindecode/seed-v 5 1 s Emotion recognition
SEED-VIG braindecode/seed-vig regression 8 s Vigilance estimation
TUAB braindecode/tuab 2 10 s Abnormal EEG detection
TUEV braindecode/tuev 6 5 s EEG event classification

Preprocessing: Window lengths are dataset-dependant (see table above). All datasets are high-pass filtered at 0.1 Hz, except for tasks with short trial windows (2 s or less), where we use 0.5 Hz. All datasets are resampled to 100 Hz. Model-specific normalization (e.g. z-scoring) can be applied via the normalization parameter.

🧩 Available fine-tuning strategies

Strategy Description Trainable params
Frozen() Freeze encoder, train only the head ~0.01%
"ridge_probe" Closed-form ridge regression probing (no hyperparameter tuning needed) ~0.01%
LoRA(r, alpha) Low-Rank Adaptation ~1-5%
IA3() Inhibiting and Amplifying Inner Activations ~0.1%
AdaLoRA(r, target_r) Adaptive rank allocation ~1-5%
DoRA(r, alpha) Weight-Decomposed LoRA ~1-5%
OFT(block_size) Orthogonal Fine-Tuning ~1-10%
FullFinetune() Train all parameters 100%
TwoStages() Frozen head for 10 epochs, then unfreeze and train all 100%

📄 License

BSD-3-Clause (see LICENSE.txt)

📣 Citation

If you use Open EEG Bench in your research, please cite it. Machine-readable metadata is provided in CITATION.cff — used by GitHub's "Cite this repository" button, reference managers, and Zenodo when archiving releases.

@software{open_eeg_bench,
  title     = {Open EEG Bench: Benchmarking parameter-efficient fine-tuning of EEG foundation models},
  author    = {Guetschel, Pierre and Aristimunha, Bruno and Truong, Dung and Kokate, Kuntal and Moreau, Thomas and Tangermann, Michael and Delorme, Arnaud},
  year      = {2026},
  url       = {https://github.com/braindecode/OpenEEGBench},
  doi       = {10.5281/zenodo.19698863}
}

📚 Further reading

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

open_eeg_bench-0.4.0.tar.gz (47.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

open_eeg_bench-0.4.0-py3-none-any.whl (42.7 kB view details)

Uploaded Python 3

File details

Details for the file open_eeg_bench-0.4.0.tar.gz.

File metadata

  • Download URL: open_eeg_bench-0.4.0.tar.gz
  • Upload date:
  • Size: 47.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for open_eeg_bench-0.4.0.tar.gz
Algorithm Hash digest
SHA256 0ac0906d03e7c4783ae02a028a1723d531dbb16e7b448878e81849c835f61d11
MD5 3379ddd4182ca7a414cada441ffcbf85
BLAKE2b-256 f90bb769071fe38718e30fea1f70d0108c83420900f969da1e7aad3f19fad9ce

See more details on using hashes here.

Provenance

The following attestation bundles were made for open_eeg_bench-0.4.0.tar.gz:

Publisher: publish.yml on braindecode/OpenEEGBench

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file open_eeg_bench-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: open_eeg_bench-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 42.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for open_eeg_bench-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1ce5fefa20422430f04fe5e27886018af226c17f52fba30d789038901dc92c4f
MD5 4f21fcbfe33052dedd6304c4a21a48a9
BLAKE2b-256 adfb4241eb35c3b36802cbe48b090cf826c094717f3cd194260bb142e133cb2a

See more details on using hashes here.

Provenance

The following attestation bundles were made for open_eeg_bench-0.4.0-py3-none-any.whl:

Publisher: publish.yml on braindecode/OpenEEGBench

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page