
在神经信息学和脑机接口领域使用PyTorch等深度学习框架处理脑电EEG信号已经成为我们日常科研的重要部分。但在实际项目中我们经常会遇到一个痛点繁杂的代码架构、混乱的实验记录、以及每次更换模型或被试数据集都要大改代码的折磨。为了解决这些“脏活累活”我开发并开源了一个适用于脑电信号端到端深度学习模型训练的PyTorch代码模板。今天就带大家快速了解一下这个项目是如何帮你省下熬夜调参的时间的。核心亮点介绍1. 告别混乱极其清晰的工程结构一个好的科研项目离不开井井有条的文件管理。本模板提供了一套标准化的目录结构代码将用于保存最佳实验性能模型的文件夹checkpoint与集中存放不同算法类的文件夹models进行了明确的区分。数据集被统一存放在dataset 目录下并且支持“多数据集 - 多被试Subject - 多实验Session”的层级嵌套管理再也不用为找样本文件发愁。训练过程的具体数据会自动保存在logs 文件夹并以“模型名_日期_时间”的规则命名方便随时回溯和复现。/* 项目文件结构 工作路径./pytorch_example --checkpoint -best_model_repeat1-20250417_173703.pth 每一次实验保存的性能最好的模型 ··· --configs -model_config.json :训练过程中的超参数设置一般不要更改其结构可以复制多份在main.py中填写相应路径 --dataset -dataname1 -dataname2 可以是多个数据集文件夹以数据集名称命名数据集名称可以在json文件中配置 -S1 -S2 -S3 :被试文件夹可以有多个被试如果是被试独立实验需要在json文件中配置需要针对哪个被试实验 -session1 -session2 每个被试可以有多次实验如果只有一次实验就只留一个文件夹就行 -sample_0.npy -sample_1.npy... -sample_10.npy :该被试的一次实验包含多个trails每个trails保存为一个npy文件npy文件的格式后面介绍 --logs -EEGNet-20250417_174017 :训练过程的数据保存的文件夹命名规则是模型名_日期_时间 -logs.json 训练过程的具体数据保存为json格式的文件 --models -model_name -EEGNet :不同模型保存在不同文件夹中可以在json文件中配置选择的模型名称 -EEGNet.py :具体的模型的类 --out 可以自己在该文件夹中保存一点自己想要的结果代码不会操作该文件夹 --picture 可以自己在该文件夹中保存一点自己想要的结果代码不会操作该文件夹 --utils -dataset.py:声明了EEGDataset类继承于pytorch的Dataset类用来读取样本数据 -datasplit.py 将数据按照一定比例随机划分为训练集/测试集/验证集划分比例可以在json文件中配置 -drawData.py 声明了绘图的类具体食用方法会在示例代码中介绍 -read_json.py 读取json文件的函数 -save_json.py 保存json文件的函数 --main.py 程序入口里面会有程序的使用示例 --ModelTrainer.py 模型训练的逻辑以类的形式呈现可以供大家自行写类继承 */2. 零代码改动全凭JSON配置打天下告别在成百上千行代码中寻找参数的痛苦我们将训练过程中的核心超参数全部提取到了model_config.json文件中。你可以直接在JSON文件里修改初始学习率、Batch Size、训练轮数epochs以及优化器如Adam。想要按特定比例随机划分训练集、测试集和验证集或者需要针对某一个特定的被试如 “S1”进行独立实验只需在配置文件中改动几个键值对即可生效完全无需修改底层代码。{model_name:填写模型名称需要和模型文件夹同名,data_name:填写数据集名称需要和数据集文件夹同名,data_root_path:.\\dataset\\,save_logs_path:./logs/,save_model_path:./checkpoint/,learning_rate:初始学习率,batch_size:batch_size,epochs:50,repeat_time:10这个是模型训练的次数每一次都是从头开始,optimizer:Adam:优化器目前只写入了这一种如需添加可以在ModelTrainer.py的initialize_optimizer函数中添加,dropout_rate:0.5,activation_function:ReLU没什么用还得取决于你具体模型中用的啥不改也行,loss_function:CrossEntropyLoss目前只写入了这一种如需添加可以在ModelTrainer.py的initialize_loss函数中添加,early_stopping:{Enable:yes早停策略还没在训练中具体实现如需要可以使用,monitor:val_loss,patience:10,restore_best_weights:true},learning_rate_decay:yes学习率衰减策略也没在训练中实现具体可以自己自定义,init_seed:42,data_split:数据划分的比例:{train:0.8,test:0.1,val:0.1},Subject_sigal被试独立实验的需要填写是在哪个被试上实验:{sigal:yes,subject_name:S1}}3. 简单统一的数据格式在数据输入端模板采用了标准且轻量的.npz格式来存储每个trial的数据。每个样本文件内部只包含两个核心键值data 和label。其中data 为你的脑电信号格式严格规定为“采样点数 × 导联数”label则对应相应的分类标签简单明了。4. 强大的训练逻辑与交叉验证核心的模型训练逻辑被高度封装在ModelTrainer.py中你可以直接使用也可以写新的类来继承它扩展性极强。模板内置了早停策略Early Stopping和学习率衰减的接口设置。此外针对脑电领域常用的K折交叉验证只需在JSON中开启Cross_validation 并填写Fload_Num就能全自动完成交叉验证流程。5. 专属Web端可视化告别枯燥控制台新功能为了让模型评估更加直观我们在近期的更新中加入了Web端便捷绘图功能。你只需要打开htmlDraw 文件夹在浏览器中运行index.html。上传训练生成的日志文件后不仅可以区分查看交叉验证和非交叉验证的数据还能自由选择绘制特定实验或折数的损失函数曲线与总体指标信息。总结作为一名长期跟EEG信号处理和深度学习打交道的科研工作者我深知一套好用的端到端模板能为实验带来多大的便利。无论你是刚入门脑电深度学习的新手还是想要规范化实验室代码架构的“老鸟”这个模板都能帮你打通模型训练的“最后一公里”。欢迎大家前往项目的 GitHub 主页查看完整代码、拉取使用。如果觉得有帮助别忘了点个 Star 支持一下如果你有任何改进建议也欢迎随时提交 Issue 一起交流。 项目地址https://github.com/star-zwx/pytorch_example_for_EEG_DeepLearning/tree/master