--- library_name: braindecode license: unknown tags: - braindecode - eeg - ieeg - seeg - foundation-model - population-transformer - pytorch_model_hub_mixin - model_hub_mixin base_model: PopulationTransformer/popt_brainbert_stft pipeline_tag: feature-extraction --- # PopulationTransformer (PopT) — braindecode weights braindecode-native re-host of the official **PopulationTransformer** (PopT) `popt_brainbert_stft` checkpoint, remapped so it loads directly with [`braindecode.models.PopulationTransformer`](https://braindecode.org/stable/generated/braindecode.models.PopulationTransformer.html). PopT is a self-supervised **population** model for intracranial recordings (iEEG/sEEG). It does not encode a raw time signal: each electrode is represented by a feature vector — typically the frozen embedding of a per-channel foundation model such as **BrainBERT** (`stft` features, 768-d) — and PopT aggregates across the electrode population. Each electrode feature is linearly projected and given a fixed sinusoidal **spatial** position encoding built from its integer anatomical coordinates; a `CLS` token is prepended, a stack of Transformer encoder layers mixes the population, and the `CLS` output is the pooled representation used downstream. ## Provenance | | | |---|---| | Original code | https://github.com/czlwang/PopulationTransformer | | Original weights | https://huggingface.co/PopulationTransformer/popt_brainbert_stft | | Paper | Chau et al. (2024), *Population Transformer: Learning Population-level Representations of Neural Activity*, [arXiv:2406.03044](https://arxiv.org/abs/2406.03044) | These weights are a **format conversion only** of the authors' released checkpoint — no re-training. The input embedding, the spatial positional encoding and the 6-layer Transformer encoder are carried over **bit-for-bit** (verified: all 82 mapped tensors are identical to the source, and the ported encoder reproduces the upstream `PtModelCustom` output to `< 1e-5`). The upstream masked-modelling heads (`cls_head`, `token_cls_head`) are **not** carried; the braindecode classification head (`final_layer`) is **randomly initialised** and must be trained/fine-tuned for your task. ## Configuration | param | value | |---|---| | `hidden_dim` | 512 | | `ffn_dim` | 2048 | | `n_layers` | 6 | | `n_heads` | 8 | | `n_times` (feature dim) | 768 | | `max_len` (coord table) | 5000 | | activation | GELU | | parameters (encoder + spec head) | ~20.6M | ## Usage ```python import torch from braindecode.models import PopulationTransformer # n_chans = number of electrodes; n_outputs = your task's classes. model = PopulationTransformer.from_pretrained( "braindecode/popt-pretrained", n_outputs=2 ) # input = per-electrode features (e.g. frozen BrainBERT stft embeddings), # shape (batch, n_electrodes, 768). Electrode coordinates are read from # chs_info when available, otherwise fall back to sequential indices. x = torch.randn(4, 64, 768) logits = model(x) # (4, n_outputs) cls = model(x, return_features=True) # {"features": ..., "cls_token": ...} ``` The classification head is task-specific: pass your own `n_outputs` (the head is re-initialised) and fine-tune. Electrode positions can be provided through `chs_info` (their `loc`) so the spatial encoding reflects the real montage. ## Licensing The upstream PopulationTransformer repository ships **no explicit license file**, so the license of these weights is marked **`unknown`**. They are re-hosted here for research use with attribution; if you use them, cite the original work and respect any terms the authors may later publish. The braindecode *code* is BSD-3-Clause. ## Citation ```bibtex @article{chau2024population, title={Population Transformer: Learning Population-level Representations of Neural Activity}, author={Chau, Geeling and Wang, Christopher and Talukder, Sabera and Subramaniam, Vighnesh and Soedarmadji, Saraswati and Yue, Yisong and Katz, Boris and Barbu, Andrei}, journal={arXiv preprint arXiv:2406.03044}, year={2024} } ```