☰
SleepFM-Clinical嵌入生成详解:5秒级与5分钟级双粒度睡眠表示如何高效落盘
2026/10/31 1:57:25 网站建设 项目流程

【免费下载链接】sleepfm-clinical

项目地址:https://gitcode.com/gh_mirrors/sl/sleepfm-clinical
点击查看免费下载

SleepFM-Clinical是发表于 Nature Medicine 的多模态睡眠基础模型,而嵌入生成(Embedding Generation)是把预训练权重变成可用特征资产的关键一步:一次 GPU 推理,即可同时产出5 秒级与5 分钟级两种粒度的睡眠表示,并以 HDF5 形式按受试者高效落盘,供下游睡眠分期与疾病预测直接复用。本文将带你读懂 generate_embeddings.py 的双粒度输出机制与落盘策略,帮助你快速上手。

为什么需要先生成嵌入 🧩

SleepFM 的下游任务走"两阶段"路线:

  1. 预训练:用 pretrain.py 以对比学习训练 SetTransformer 骨干(models.py),权重保存在best.pt;
  2. 嵌入生成:冻结骨干,把每个受试者一整夜的 PSG 信号前向推理一遍,将中间表示写盘;
  3. 轻量微调:下游模型(如睡眠分期的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_workersHDF5 并行索引/读取的进程数

脚本会把模型置为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,几个关键设计:

  1. 追加写 + 按需扩容:数据块由多进程索引,到达顺序不保证。代码以'a'模式打开 HDF5,写入前先dset.resize扩展行数,并用maxshape=(None, …)允许无限增长,互不阻塞;
  2. 偏移换算对齐:每块携带原始采样点偏移chunk_start(由 collate_fn 透传)。5 秒级行号 =chunk_start // 640,5 分钟级行号 =chunk_start // 38400(38400 = 5 分钟 × 128 Hz,见 dataset.py),天然对齐、无重叠;
  3. 分块存储:chunks=(embed_dim,)让每个 5 分钟块成为独立 I/O 单元,随机写也不拖慢整体;
  4. 内存友好:批内算完立即搬回 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

项目地址:https://gitcode.com/gh_mirrors/sl/sleepfm-clinical
点击查看免费下载
上一篇:x-cmd Claw 定时任务完全指南:x claw cron 的配置、管理与 Heartbeat 协同
下一篇:QOwnNotes 在 Void Linux 上的安装指南:xbps 社区包安装与密钥环(Keychain)故障排查

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询