【免费下载链接】sleepfm-clinical
SleepFM-Clinical是发表于 Nature Medicine 的多模态睡眠基础模型,而嵌入生成(Embedding Generation)是把预训练权重变成可用特征资产的关键一步:一次 GPU 推理,即可同时产出5 秒级与5 分钟级两种粒度的睡眠表示,并以 HDF5 形式按受试者高效落盘,供下游睡眠分期与疾病预测直接复用。本文将带你读懂 generate_embeddings.py 的双粒度输出机制与落盘策略,帮助你快速上手。
为什么需要先生成嵌入 🧩
SleepFM 的下游任务走"两阶段"路线:
- 预训练:用 pretrain.py 以对比学习训练 SetTransformer 骨干(models.py),权重保存在
best.pt; - 嵌入生成:冻结骨干,把每个受试者一整夜的 PSG 信号前向推理一遍,将中间表示写盘;
- 轻量微调:下游模型(如睡眠分期的
SleepEventLSTMClassifier、疾病预测的 CoxPH 头)只在这些 128 维向量上训练,参数量与耗时都小得多。
"一次推理、处处复用",避免每个下游任务都重跑大模型。
双粒度设计:5 秒级与 5 分钟级表示如何产生
5 秒级细粒度嵌入
原始信号按 128 Hz 采样,模型以patch_size=640(config.json)切分,640 ÷ 128 =5 秒:每 5 秒的信号段经卷积 Tokenizer 映射为 1 个 128 维向量。一个 5 分钟的数据块因此得到60 个时序 token,再经 6 层 Transformer Encoder 交互后原样输出(models.py)。这些 token 保留了睡眠的瞬时细节,是捕捉体动、觉醒片段等短事件的基石。
5 分钟级聚合嵌入
同一份 token 序列再经过一次AttentionPooling(temporal pooling),把 60 个 token 压缩为1 个 128 维向量——即这 5 分钟的"睡眠摘要"。SetTransformer.forward恰好同时返回两者(models.py):
| 对比项 | 5 秒级嵌入 | 5 分钟级嵌入 |
|---|---|---|
| 来源 | Transformer Encoder 逐 token 输出 | Temporal 注意力池化 |
| 每个 5 分钟块 | 60 行 × 128 维 | 1 行 × 128 维 |
| 一夜(约 8 小时)行数 | 约 5760 行/模态 | 约 96 行/模态 |
| 典型用途 | 睡眠分期、事件检测、整夜序列建模 | 受试者级汇总、轻量风险建模 |
两种粒度并非分别前向两次,而是同一次推理的两个返回值,零额外成本。
一次跑通嵌入生成:命令与关键参数
执行前需要两样东西:
- 预处理好的 HDF5 信号文件(preprocessing.py 从 .EDF 转换而来);
- 预训练检查点目录(内含
best.pt与 config.json,官方model_base可直接使用)。
运行脚本 generate_embeddings.sh 给出的示例:
python generate_embeddings.py \ --batch_size 16 \ --num_workers 16 \ --model_path ../checkpoints/model_base \ --dataset_name mesa \ --splits train,validation,test| 参数 | 作用 |
|---|---|
--model_path | 检查点目录;输出也写在它下面,自动创建两个子目录 |
--dataset_name | 数据集名,需与 dataset_split.json 中路径的小写子串一致 |
--splits | 要处理的划分,默认train,validation,test |
--batch_size | 块级批大小;显存不足时调小即可 |
--num_workers | HDF5 并行索引/读取的进程数 |
脚本会把模型置为eval()并在no_grad下推理(generate_embeddings.py),保证同一信号每次得到完全一致的嵌入;多卡场景自动套上DataParallel。
HDF5 落盘策略:追加模式 + 动态扩容 💾
这是"高效落盘"的核心。输出结构如下:
{model_path}/ ├── mesa/ # 5 秒级嵌入 │ └── mesa-sleep-0001.hdf5 # 每个受试者一个文件 │ ├── BAS (N×60, 128) │ ├── RESP (N×60, 128) │ ├── EKG (N×60, 128) │ └── EMG (N×60, 128) └── mesa_5min_agg/ # 5 分钟级嵌入 └── mesa-sleep-0001.hdf5 # 同样 4 个模态,每模态 (N, 128)四个模态 BAS(脑电/眼电)、RESP(呼吸)、EKG(心电)、EMG(肌电)的通道归类见 channel_groups.json。落盘逻辑在 generate_embeddings.py,几个关键设计:
- 追加写 + 按需扩容:数据块由多进程索引,到达顺序不保证。代码以
'a'模式打开 HDF5,写入前先dset.resize扩展行数,并用maxshape=(None, …)允许无限增长,互不阻塞; - 偏移换算对齐:每块携带原始采样点偏移
chunk_start(由 collate_fn 透传)。5 秒级行号 =chunk_start // 640,5 分钟级行号 =chunk_start // 38400(38400 = 5 分钟 × 128 Hz,见 dataset.py),天然对齐、无重叠; - 分块存储:
chunks=(embed_dim,)让每个 5 分钟块成为独立 I/O 单元,随机写也不拖慢整体; - 内存友好:批内算完立即搬回 CPU 写盘,整夜数据无需常驻显存。
体积上也很划算:以一夜约 8 小时计,4 个模态的 5 秒级嵌入共约 11 MB,明显小于同规模的原始信号;5 分钟级则只有数百 KB——下游训练读取飞快。
下游任务如何消费两种粒度
- 睡眠分期:finetune_sleep_staging.py 从
{model_path}/{dataset_name}目录读取 5 秒级嵌入,训练SleepEventLSTMClassifier(配置 config_finetune_sleep_events.yaml); - 疾病预测:finetune_diagnosis_coxph.py 把整夜 token 序列喂给双向 LSTM + CoxPH 生存分析头(配置 config_finetune_disease_prediction.yaml);
- 5 分钟级嵌入则适合按受试者直接做均值/统计汇总,构建更轻量的风险模型。
常见问题速查
| 现象 | 原因与处理 |
|---|---|
| 找不到数据文件 | --dataset_name需是 split json 中文件路径的小写子串;SHHS 数据集走独立分支(SHHS/{name}目录) |
| 显存不足 | 调小--batch_size(示例为 16),与模型容量无关 |
| 重新运行会重复写数据吗 | 不会:行号由chunk_start唯一确定,同一配置重跑只会覆盖同一行区间 |
| 需要 GPU 吗 | 需要:脚本固定使用 CUDA 设备 |
小结
SleepFM-Clinical 的嵌入生成用一次前向同时得到 5 秒级 token 序列与 5 分钟级摘要向量,按"受试者 × 模态"组织进可扩展的 HDF5 文件;追加写 + 动态扩容让多进程乱序到达的数据块各归其位。先嵌入、后微调的两阶段设计,正是该框架在 130 余种疾病预测与睡眠分期任务上保持高效的关键工程基础。
【免费下载链接】sleepfm-clinical
相关推荐
SleepFM-Clinical数据基础:BAS、RESP、EKG、EMG四大模态如何对应多导睡眠图?
SleepFM Clinical数据基础:BAS、RESP、EKG、EMG四大模态如何对应多导睡眠图? SleepFM Clinical 是发表在 Nature
SleepFM-Clinical预处理教程:多进程批量将EDF睡眠记录转换为HDF5的完整流程
SleepFM Clinical预处理教程:多进程批量将EDF睡眠记录转换为HDF5的完整流程 SleepFM Clinical 是一个发表在国际顶刊 Natu
如何在5分钟内创建惊艳的轻量级粒子特效 | 完整教程
如何在5分钟内创建惊艳的轻量级粒子特效 | 完整教程 想要为你的网站添加令人惊叹的动态背景效果吗?particles.js 是一个轻量级的 JavaScript
前端UI组件
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考