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.TODO}
}

📚 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.3.0.tar.gz (44.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.3.0-py3-none-any.whl (41.0 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: open_eeg_bench-0.3.0.tar.gz
  • Upload date:
  • Size: 44.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.3.0.tar.gz
Algorithm Hash digest
SHA256 d473c4521939c48f2feca2479045db9ac27928f6bd9ef16c240b82297e9b1a7f
MD5 3759784d88d06a84a2b6aeadbc017cf8
BLAKE2b-256 efb58fb6db49e5206af7a10e9744e2e2c2b126a0f5c185618af4f98d7e12361c

See more details on using hashes here.

Provenance

The following attestation bundles were made for open_eeg_bench-0.3.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.3.0-py3-none-any.whl.

File metadata

  • Download URL: open_eeg_bench-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 41.0 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.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 21864bec14519bd1a17b781df78b5a01be011a38ea786135f4ec8a21eaec160a
MD5 74d24a1d90d31a919cfef1d6bcba5546
BLAKE2b-256 77b72c6e07fde10b333a036dfa1e97e0bdd945768ecedbc79c4d6621e3f55b3a

See more details on using hashes here.

Provenance

The following attestation bundles were made for open_eeg_bench-0.3.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