LTAF ECG Beat Classifier (N / A / V)

Frozen Chronos-2 (amazon/chronos-2) multivariate encoder + MLP head, trained on the PhysioNet Long-Term Atrial Fibrillation (LTAF) database for per-beat classification.

Classes

Code Expansion
N Normal sinus-origin beat
A Atrial premature contraction (APC / PAC / SVE)
V Ventricular premature contraction (PVC / VE)

Q (unclassifiable / paced, ~89 / 9 M in the LTAF subset) is dropped.

Input

  • (B, 2, 256) โ€” 2-lead ECG at 128 Hz, 2-second window centered on the R-peak sample
  • Per-channel z-scored
  • LTAF leads: ECG1, ECG2

Checkpoint details

Field Value
num_classes 3
class_names ["N", "A", "V"]
window_samples 256 (2 s @ 128 Hz)
n_channels 2
chronos_model_id amazon/chronos-2
freeze_encoder true (only the head's 395,267 params were trained)
Head 2-layer MLP: Linear(1024, 512) โ†’ ReLU โ†’ Dropout(0.3) โ†’ Linear(512, 3)

Usage

import torch
from huggingface_hub import hf_hub_download
from src.models.ts_llm.ecg_classifier import EcgRhythmClassifier

path = hf_hub_download("rmxjck/ltaf-ecg-beats-classifier", "best_classifier.pt")
model = EcgRhythmClassifier.load(path, device="cuda")

# x: (B, 2, 256) float32 at 128 Hz, z-scored, centered on R-peak
logits = model(x)
pred = logits.argmax(-1)  # 0=N, 1=A, 2=V

Training

Produced by scripts/train_ecg_classifier.py in rmxjck/TSLM-Arena on the LTAF-Haystack split (67 train / 8 val / 9 test records, deterministic seed 42). N beats are subsampled per epoch to negative_k ร— n_nonN (default 2.0) to balance the 97 % N / 1.7 % A / 1.5 % V class distribution.

.venv/bin/python3 scripts/train_ecg_classifier.py \
    --label-class beats --epochs 30 --batch-size 128

Not for clinical use

Research artifact only. Not FDA-cleared. Not suitable for triage, diagnosis, or any patient-facing application.

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support