该项目的核心目标是构建一个 EEG 自监督预训练模型(类似 MAE/ViT 风格),用于从大规模 EEG 数据中学习通用的脑电表征。其主要思路包括:
从原始 EEG 数据读取信号并标准化通道。 对信号进行裁剪、重采样和窗口化,将 EEG 切分为 “通道 × 时间” 的 Token。 对部分 Token 进行掩码(Mask),模型需要预测被遮挡的 Token 的频带功率轨迹。 使用 Transformer 编码器学习 EEG 的时空和频谱关系。 通过自监督目标(Band Power Trajectory)训练模型,得到可用于下游任务的通用表示。
整个项目可以分为几个核心模块:数据读取与预处理、Token 构建、数据存储、掩码策略、模型定义、损失计算、训练循环和辅助工具。
part_paths.txt
- 该文件存储了项目中所有原始 EEG 数据文件的路径,每行对应一个 EEG 文件。主要用于数据批量处理和分布式训练,确保所有数据都能被统一管理。
build_part_paths.py
- 功能:扫描指定的原始数据目录,收集所有 EEG 文件路径并写入 part_paths.txt。
- 主要工作:遍历文件夹和子目录,检查文件格式,确保每个 EEG 数据集都被记录。该文件是整个数据处理流水线的入口,保证后续处理和转换操作可以批量执行。
build_processed_lance_from_raw.py
- 功能:将原始 EEG 数据批量转换为 Lance 数据格式(高效存储格式)。
- 具体做法:调用预处理模块对每个 EEG 文件进行通道映射、裁剪、重采样、Token 构建和目标生成,然后存储为 Lance 文件。
- 意义:这个文件是大规模数据预处理的核心,用于生成训练时可直接加载的数据,避免每次训练都重新处理原始 EEG。
channel_config.py
- 功能:定义标准 EEG 通道配置和映射规则。
- 内容:
- 固定 64 个通道顺序,用于统一不同数据集的通道排列。
- 通道别名映射,解决不同数据集命名不一致的问题,例如 T3 → T7,FP1 → Fp1。
- 意义:保证模型输入的通道顺序一致,有利于跨数据集训练和迁移。
checkTransformedLanceData.py
- 功能:验证处理后的 Lance 数据是否完整和正确。
- 工作内容:
- 检查数据形状和维度。
- 检查通道有效性和掩码信息。
- 可以随机抽样检查部分数据是否符合预期。
- 用途:调试数据处理流程,确保预处理和存储过程没有错误。
configs.py
- 功能:集中管理项目的所有配置和超参数。
- 内容包括:
- 数据切片长度、Token 长度、滑动步长。
- 频带划分和时频分析参数。
- Transformer 模型结构参数(层数、隐藏维度、注意力头数)。
- 掩码比例和训练超参数。
- 作用:为训练和数据处理提供统一配置,方便实验可复现和参数调整。
convert_set_to_lance.py
-
功能:将单个 EEG 数据集(如 .set 文件)转换为 Lance 数据格式。
-
操作流程:
- 读取 EEG 信号并标准化通道。
- 对信号裁剪和重采样。
- 构建时间-通道 Token。
- 计算每个 Token 的频带功率轨迹,生成训练目标。
- 存储为 Lance 格式,便于训练阶段快速加载。
-
作用:支持单数据集转换,是数据处理流水线的基础工具。
dataset.py
-
功能:定义训练数据集接口。
-
主要职责:
- 将 EEG Token 和对应的 Band Power Trajectory 目标组织成训练样本。
- 提供批次索引和加载方法。
- 支持随机访问和通道掩码信息。
-
用途:封装数据,供训练和验证循环直接使用。
io_utils.py
-
功能:提供数据输入输出辅助工具。
-
职责:
- 读取原始 EEG 文件(EEGLAB .set 等)。
- 保存和加载处理后的数据。
- 批量文件操作和路径处理。
-
意义:为数据预处理模块提供通用工具,简化文件操作。
lance_dataset.py
- 功能:针对 Lance 数据格式的训练数据集类。
- 特点:
- 高效读取大规模数据。
- 支持随机访问和批量加载。
- 避免每次训练重复预处理,提高训练效率。
- 用途:专门优化大规模 EEG 训练场景。
largeScale_pretrain_main.py
- 功能:训练入口脚本。
- 工作内容:
- 初始化配置、数据集、数据加载器、模型、损失函数和优化器。
- 启动训练循环和验证循环。
- 作用:整合整个训练流程,是项目实际运行训练任务的核心程序。
losses.py
- 功能:定义训练损失函数。
- 主要特点:
- 计算预测 Token 的 Band Power Trajectory 与目标的误差。
- 支持按通道和频带加权。
- 避免低频主导训练,保证各频带均衡。
- 用途:指导模型学习准确的频带功率预测。
masking.py
- 功能:实现 Token 掩码策略。
- 特点:
- 支持连续 Block Mask 和随机 Mask。
- 将部分 Token 遮挡,作为自监督学习输入。
- 意义:让模型学习全局时空关系,而不是直接复制原始信号。
model.py
- 功能:定义 EEG Foundation Model 结构。
- 内容:
- Patch Token 嵌入、通道嵌入、时间嵌入。
- Transformer 编码器,用于捕捉 EEG 的时空和频谱关系。
- 输出预测每个 Token 的多频带功率轨迹。
- 作用:模型核心,直接决定预训练效果。
prefetch_loader.py
- 功能:优化数据加载过程。
- 工作:
- 在 CPU 加载数据的同时,GPU 执行训练。
- 减少 DataLoader 成为训练瓶颈。
- 用途:加速大规模训练。
preprocessing.py
-
功能:处理原始 EEG 信号。
-
主要工作:
- 通道名称标准化和映射。
- 信号裁剪、重采样和补零。
- 输出统一格式的数据。
-
意义:保证训练输入数据的一致性和可控性。
targets.py
- 功能:生成自监督训练目标。
- 主要职责:
- 将 EEG Token 转换为 Band Power Trajectory。
- 通过时频分析计算 Delta、Theta、Alpha、Beta、Gamma 频带功率。
- 为每个 Token 提供连续动态目标序列。
- 作用:训练模型预测频带动态,是自监督学习核心。
trainer.py
-
功能:封装训练和验证循环。
-
工作内容:
- 批次处理、掩码应用、模型前向计算。
- 损失计算和梯度更新。
- 记录训练和验证指标。
-
意义:统一管理训练流程,确保训练可复用和可扩展。
utils.py
- 功能:通用辅助工具。
- 作用:
- 日志输出和时间统计。
- 随机种子设置。
- 文件路径处理。
- 意义:提高代码可读性和复用性。
electrode_vocab.json
- 功能:定义 EEG 电极词典。
- 作用:
- 将每个通道映射为唯一索引。
- 用于模型的通道嵌入和位置编码。
整个项目实现了一个完整的 EEG 自监督预训练框架。它可以从原始 EEG 数据中提取时空和频谱特征,通过 Token Masking 和 Band Power Trajectory 预测训练 Transformer 模型。训练得到的模型能作为通用表示用于各种下游 EEG 任务,如脑机接口、情绪识别或疾病诊断。每个模块都有明确职责,形成从原始数据到模型预训练的完整流水线。