news 2026/10/13 10:50:17

DEAP数据集 2026最新Transformer算法 DEAP 数据集 下载

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DEAP数据集 2026最新Transformer算法 DEAP 数据集 下载

DEAP数据集下载:https://gitee.com/CodeStoreHub/deap-fat

Transformer算法下载:https://gitee.com/CodeStoreHub/deap-fat

本算法将傅里叶启发的周期性表示与可学习的通道邻接关系结合,在 Transformer 中同时建模样本相关性与共享结构,并通过 DEAP 的效价、唤醒度分类实验检验模型的识别与泛化能力。

01 / OVERVIEW研究目标与方法定位

脑电情绪识别需要在噪声、非平稳性和个体差异的共同影响下,从多通道信号中提取有效信息。单纯依赖固定脑区连边可能无法适应样本变化,而完全由输入决定的注意力又缺少稳定的通道结构约束。我们提出傅里叶邻接 Transformer(Fourier Adjacency Transformer,FAT),将两类信息整合到同一注意力计算中。

周期性表示

我们使用傅里叶解析线性层(FAL)生成余弦、正弦与线性分支,使周期成分和非周期成分在特征维度上显式分离,再分别进入注意力头。

结构先验

我们学习周期和非周期两组邻接矩阵,通过输入相关的门控控制其贡献,将跨样本共享的通道关系与当前样本的 Q–K 相关性相加。

本报告重点回答三个问题:该结构如何工作;DEAP 数据如何变成模型输入;在明确划分和统计口径后,完整实验与原论文基线有何差异。

02 / METHODFAT:从差分熵到情绪预测

图 1|FAT 与 FAA 的模型框架。原论文 Figure 2;采用官方仓库model.jpg同版图,未重绘或更改结构。上半部分为完整网络,下半部分展开周期与非周期注意力分支。

2.1 输入表示与特征嵌入

我们不直接将 128 Hz 的原始波形输入 Transformer,而是对每个 EEG 窗口构建通道 × 频带的差分熵(Differential Entropy,DE)特征。在 DEAP 中,单个窗口为32 × 5;训练张量为B × 1 × 32 × 5,其中 B 为 batch size。序列 token 对应 EEG 通道,而非连续时间点。

嵌入模块先加入可学习的位置参数,再以两个 1×1 卷积实现逐通道的 5→20→40 维映射,各层配合 BatchNorm 与 ReLU。这样,每个通道被映射为一个 40 维 token。随后拼接可学习的 CLS token,并加入正弦位置编码,得到B × 33 × 40的序列。

X ∈ ℝB×C×F → ReLU(BN(f₂(ReLU(BN(f₁(X)))))) ∈ ℝB×C×E
DEAP:C = 32,F = 5,E = 40;实现接口额外包含一个长度为 1 的维度。

2.2 FAL:显式分离周期与非周期成分

我们用 FAL 替代普通线性 Q/K/V 投影。与 FAN 在非周期分支使用非线性激活不同,FAL 将该分支的激活设置为恒等映射,保留线性变换;周期分支通过可学习投影后的正弦和余弦构造特征。

Φ(x) = [cos(Wpx) ‖ sin(Wpx) ‖ (Wax + ba)]
‖ 表示拼接;p 表示周期分支,a 表示非周期分支。

当输出维度 E=40、代码中的p_ratio=0.25时,余弦和正弦分支各 10 维,线性分支为 20 维。因此,周期分支合计占输出的一半。8 个注意力头每头 5 维:前 4 个头处理周期特征,后 4 个头处理非周期特征。

这里的“傅里叶”是对正弦/余弦基函数表示的借鉴,不是对时间序列执行 FFT。模型学习的是 DE 特征空间中的周期性映射,不能直接将每个注意力头解释为某个物理脑电振荡频率。

2.3 FAA:把邻接关系加入注意力

我们分别通过 FAL 得到 Q、K、V,并对周期与非周期分支独立计算注意力。QKᵀ 描述输入样本中各通道之间的相关性;两组可学习邻接矩阵 Ap、Aa 表达训练中积累的共享关系。门控 g=σ(f(Q)) 让模型根据当前输入决定邻接项的权重。

Q = ΦQ(X),K = ΦK(X),V = ΦV(X)
Attentionr = softmax(QrKrT / √dk + σ(fr(Qr)) ⊙ Ar),r ∈ {p, a}
O = [AttentionpVp ‖ AttentionaVa]
以上为论文的概念公式;⊙ 表示带广播的逐元素门控加权。

在公开实现中,两组邻接矩阵为33 × 33,包括 CLS token;先经 ReLU,再使用 D−1/2AD−1/2 归一化。邻接参数跨 6 层共享,而每层有自己的门控线性层。每组门控由该通道的 20 维查询生成一个标量,再广播到对应的 4 个头及各个 key 位置。

共享结构不等于解剖连接。该实现没有输入电极的物理距离或预先定义的脑区连接。邻接矩阵由任务损失学习,输入相关的变化主要来自 QKᵀ 与门控;它不应被直接当作经过神经科学验证的功能连接图。

2.4 Transformer 编码与分类头

我们堆叠 6 个编码模块,每个模块由预归一化注意力、残差连接及前馈网络组成。前馈网络将维度从 40 扩展到 160,经过 GELU 和 Dropout 后映射回 40。编码结束后,使用 CLS token 的表征,经 LayerNorm 和 40→2 的线性层输出二分类 logits。Valence 和 Arousal 各训练一套独立模型,不共享最终分类器。

DE 特征32 × 5

Stem32 × 40

CLS + 位置编码33 × 40

FAA 编码器 × 633 × 40

分类头2 logits

模型项本次设置含义
嵌入维度 / heads / depth40 / 8 / 6每个 head 为 5 维
FAL 周期分支10 维 cos + 10 维 sin余下 20 维为恒等激活的线性分支
共享邻接矩阵2 × 33 × 33周期/非周期各一组,含 CLS 节点
可训练参数114,81232 通道、2 类的当前公开模型
位置编码 Dropout / 编码器 Dropout0.1 / 0.2本次使用公开 FAT 类的默认配置

2.5 训练目标与数据增强

我们使用交叉熵和 Adam 优化器,学习率 0.001、weight decay 0.0001、batch size 32,固定训练 200 epochs,不使用测试集决定提前停止。每个训练样本的各频带独立乘以 U(0.9,1.1) 系数;Mixup 使用 α=0.2 的 Beta 分布对同一 batch 中的样本进行线性混合。

λ ∼ Beta(0.2, 0.2),x̃ = λxi + (1−λ)xj
ℒ = λ CE(f(x̃), yi) + (1−λ) CE(f(x̃), yj)

我们保留频率 2、幅度 0.05 的正弦增强公式。但是在 5 个等间隔频带取样点上,sin(2 × linspace(0, 2π, 5))几乎全为零,实际扰动可以忽略。这不是本次额外修正后的增强。

03 / DATASETDEAP 数据集与学习任务

DEAP 是面向情感计算的多模态数据集,由 Koelstra 等人构建。32 位参与者分别观看 40 段时长约一分钟的音乐视频,同时采集 EEG 与外周生理信号,并对情绪体验进行主观评分;其中 22 位参与者还记录了正面面部视频。数据集的原始论文介绍了刺激材料筛选、实验流程与多模态情绪分析任务。本实验只使用 EEG,不使用外周信号或面部视频。

项目数据集 / 本次使用情况
参与者与 trials32 人 × 每人 40 trials = 1,280 trials
输入文件官方预处理 MATLAB 格式 s01.mat–s32.mat;只读使用标准文件,忽略重复的 *_1.mat
文件中 data 的形状40 × 40 × 8,064(trial × 通道 × 采样点),已逐文件校验
文件中 labels 的形状40 × 4;列顺序为 Valence、Arousal、Dominance、Liking
通道选择40 个保留通道中使用前 32 个 EEG 通道;其余 8 个通道不进入本模型
采样率与长度原始采集 512 Hz;所用预处理版本为 128 Hz。每 trial 63 秒 = 8,064 点,包含 3 秒基线 + 60 秒刺激段
原始 EEG 与预处理版本预处理版本已做降采样、眼电伪迹处理、4–45 Hz 滤波及参考处理;本次从预处理版本继续提取 DE 特征
本次有效 EEG 总时长1,280 × 60 秒 = 21 小时 20 分钟;窗口重叠不会增加独立记录时长

前 3 秒
384 点 · 丢弃

后 60 秒刺激 EEG
7,680 点 · 提取 59 个窗口

3.1 情感维度与二分类定义

Valence(效价)描述情绪体验的愉悦程度,从不愉悦到愉悦;Arousal(唤醒度)描述激活强度,从平静到兴奋。高唤醒不必然代表积极情绪,低唤醒也不等同于消极情绪,因此我们分别建立两个二分类任务。Dominance 表达主观控制感,Liking 表达喜好程度,二者保留在原始标签中但不用于此次训练。

y = 1,若 rating > 5;否则 y = 0
低类:rating ≤ 5;高类:rating > 5。评分等于 5 的 trial 不丢弃。

所用标签的四个情感维度采用 1–9 评分。评分阈值与边界归类在 FAT 原文中未给出完整 DEAP 细节,因此这里是明确记录的实现假设。每个 trial 的标签复制到其 59 个窗口;我们没有把窗口解释为具有独立瞬时情绪标注的样本。

目标高类 trials低类 trials高类比例恰好等于 5
Valence70857255.3125%16 trials,归低类
Arousal73754357.5781%17 trials,归低类

上述类别计数来自本地 32 份 MATLAB 文件的实际 labels,而非引用其他实验的样本统计。不同被试类别比例不同,评估中额外保存由训练集多数类确定的测试基线。

04 / PROTOCOL特征提取与评估协议

4.1 从波形到差分熵

我们移除每个 trial 的前 384 个基线采样点,仅保留前 32 个 EEG 通道。以 256 点(2 秒)窗口、128 点(1 秒)步长滑动,从每个 60 秒 trial 提取 59 个重叠窗口。这里是直接丢弃基线段,并未再做基线 DE 相减。

Nwindow = ⌊(7,680 − 256) / 128⌋ + 1 = 59
Ntotal = 32 × 40 × 59 = 75,520

每个窗口、每个通道分别用四阶 Butterworth 带通滤波器和双向filtfilt处理,再以无偏样本方差估计高斯近似下的差分熵:

DE = ½ ln(2πeσ²),σ² = var(signal, ddof=1)
使用自然对数;高斯假设是特征构造的近似,不表示 EEG 必然服从高斯分布。

代码频带名称频率范围实现说明
theta4–7 Hz沿用公开 DEAP 预处理
alpha8–10 Hz与下一频带存在重叠
slow_alpha8–13 Hz名称来自代码;未重新命名或替换
beta14–29 Hz沿用公开 DEAP 预处理
gamma30–45 Hz沿用公开 DEAP 预处理

这不是常见的 δ、θ、α、β、γ 五个互异频带;本次保留上游的两组 alpha 区间。随后对每个 trial 内每个通道/频带的 59 点 DE 序列做 LDS 平滑。随机游走模型取状态转移和观测系数为 1,过程噪声协方差 0.01,观测噪声协方差 1,初始均值取首点、初始协方差为 1。

向量化实现与官方逐通道滤波、方差计算及 pykalman 平滑的数值等价性已通过检查。每人保存40 × 59 × 32 × 5的特征;训练前仅用当前训练折计算各通道/频带的均值和标准差,再变换测试折。

4.2 三种划分,回答三类问题

协议划分单位与训练方式每折训练 / 测试窗口解释范围
window10每位被试内按标签随机分层 10 折;汇总所有被试共同训练67,968 / 7,552已见被试、同一 trial 的窗口可以跨集合
trial10每位被试内按 trial 分层 10 折;一个 trial 的窗口整体分配67,968 / 7,552已见被试的独立 trial 识别
LOSO31 位被试训练、1 位被试测试,共 32 折73,160 / 2,360未见被试泛化

窗口重叠与平滑的信息共享。相邻窗口共享 1 秒波形,LDS 平滑还利用整个 trial 的时间序列。window10 虽然样本索引不重叠,但原始信号来源和 trial 信息可以共享。trial10 将整个 trial 隔离;LOSO 进一步隔离被试。三个协议应分别解读。

论文只标记 DEAP 为 10-fold,并未公开全部划分索引或说明是否逐被试独立训练。我们依据其“训练与测试均含所有被试”的文字采用汇总训练;不将其视为作者未公开流水线的精确重放。少数被试某类 trial 少于 10 个时,trial 分层无法保证每折该被试都有两类,我们保留这些被试并记录 sklearn 提示。

4.3 结果统计规则

我们的主指标是固定第 200 epoch 的测试准确率。每折还记录 200 轮中的最高测试准确率,命名为“测试最高轮”;它只用于观察上游报告方式的乐观偏差,不参与训练决策。均值与总体标准差采用ddof=0:10 折按折统计,LOSO 按 32 位被试统计。没有挑最好的一折,也没有以最好一次运行代替全部结果。

基础 seed 为 42;实际模型 seed 加上折编号,Arousal 再加 1000 偏移。本次只有一组基础 seed,不代表多随机种子重复实验。完整训练量为2 × (10 + 10 + 32) = 104个模型,共 20,800 epochs。所有样本在每种协议/目标的折外预测(OOF)中恰好出现一次。

05 / RESULTS完整实验结果与论文基线对比

所有 104 次训练均完成 200 epochs,启动器于 2026-10-10 17:29:16 正常退出。以下单位均为百分比,格式为平均准确率 ± 标准差。原论文中的其他方法未在本次重新训练;它们是引用对照,不构成在完全相同预处理和数据划分下的受控排名。

读表说明。灰白行:原论文表 1 / 表 2 中的 DEAP 数值;绿色行:本次固定第 200 轮的主结果;浅橙行:本次每折测试最高轮的诊断值。“—”表示原论文未给出该方法在 DEAP 上的对应结果,而不是零准确率。论文未充分交代标准差的汇总单位,不能仅比较标准差大小就认定稳定性优劣。

5.1 被试相关 10 折:与论文表 1 对比

方法Valence / %Arousal / %
KNN67.40 ± 7.2867.80 ± 6.94
SVM65.80 ± 4.6269.89 ± 5.60
LSTM74.76 ± 3.4171.81 ± 3.99
DGCNN84.69 ± 6.2083.02 ± 7.07
BiHDM——
RGNN——
PGCN——
Conformer80.71 ± 2.3079.42 ± 3.03
我们的方法 · 固定 200 轮83.96 ± 1.1284.96 ± 2.14
我们的方法 · 测试最高轮84.72 ± 0.7386.11 ± 1.34

固定训练轮次下,我们在 Valence、Arousal 上得到83.96 ± 1.12%与84.96 ± 2.14%,分别比原论文 FAT 值低 6.14 和 4.22 个百分点。即使从测试曲线中挑最高轮,均值仍为 84.72%、86.11%,没有达到原论文的 90.10%、89.18%。

数值上,本次固定轮 Valence 略低于论文 DGCNN 的 84.69%,Arousal 高于其 83.02%;两项均高于论文 Conformer 的 80.71%、79.42%。由于并未重跑这些基线且 DEAP 划分细节缺失,我们不将这些差异表述为经过同条件验证的性能优越性。

5.2 跨被试 LOSO:与论文表 2 对比

方法Valence / %Arousal / %
KNN55.35 ± 4.3052.86 ± 4.22
SVM54.70 ± 0.3655.90 ± 0.76
LSTM60.31 ± 0.2459.78 ± 0.27
DGCNN59.72 ± 1.3857.26 ± 1.29
BiHDM——
RGNN——
PGCN——
Conformer62.40 ± 0.2059.90 ± 0.60
我们的方法 · 固定 200 轮50.77 ± 8.1752.96 ± 14.14
我们的方法 · 测试最高轮62.42 ± 6.8466.51 ± 8.66

固定第 200 轮时,Valence 为50.77 ± 8.17%,Arousal 为52.96 ± 14.14%,低于原论文 FAT 的 62.70%、60.00%。两项也低于本次按训练多数类得到的测试基线 55.31%、57.58%。这说明当前固定训练方案没有得到稳定有效的跨被试泛化。

但是,若每折选择测试最高轮,结果变为62.42 ± 6.84%与66.51 ± 8.66%,相较固定最后轮提高 11.65 和 13.55 个百分点。Valence 均值接近论文,Arousal 均值超过论文;此时标准差仍与论文报告不同。这种“接近或超过”依赖测试集选轮,不能作为独立验证集选模后的泛化成绩。

图 2|FAT 的论文报告与本次实验对比。误差线表示各自统计口径下的标准差;论文统计单位未完全明确。纵轴从 0 开始,浅橙色为具有测试选择偏差的诊断值。图中仅展示 FAT 的不同来源/统计口径。

5.3 trial 隔离对照与完整统计

协议目标完成折数固定 200 轮 / %测试最高轮 / %训练多数类基线 / %
window10valence10/1083.96 ± 1.1284.72 ± 0.7355.31 ± 0.09
window10arousal10/1084.96 ± 2.1486.11 ± 1.3457.58 ± 0.05
trial10valence10/1063.12 ± 2.8167.71 ± 2.7155.31 ± 5.30
trial10arousal10/1062.97 ± 3.5867.78 ± 2.8957.58 ± 2.84
losovalence32/3250.77 ± 8.1762.42 ± 6.8455.31 ± 9.14
losoarousal32/3252.96 ± 14.1466.51 ± 8.6657.58 ± 15.69

trial10 中 Valence 为63.12 ± 2.81%,Arousal 为62.97 ± 3.58%。相对于 window10,固定轮结果分别下降 20.84、21.99 个百分点。这表明“在同一 trial 的窗口之间插值”和“识别未参与训练的 trial”是难度不同的任务;重叠窗口与整段平滑使前者具有较强的 trial 信息共享。本次对照没有进一步分离共享波形、平滑和其他分布差异各自的因果贡献。

5.4 学习曲线:为什么最高轮与最后轮差距很大

图 3|同一 epoch 上对所有折的测试准确率求均值。曲线仅用于事后诊断,没有参与本次训练控制。特别注意:“逐折最高值的平均”不等于“平均曲线的最高值”,不能用这幅图替代逐折最佳轮的统计。

跨 trial 和跨被试任务中,训练后期的测试表现未必继续改善。合理的模型选择应在训练数据内部建立独立验证集:trial 泛化任务按 trial 划分验证集,跨被试任务可留出训练被试作验证。然后只在最终测试集上评价选定模型。本次未运行这种嵌套验证,也未将其可能带来的改善计入结果。

展开 104 次训练的逐折结果

每行对应一个独立训练任务,均完成 200 epochs。完整 CSV 保存在工程的 results/deap_seed42/final_results.csv 中。

协议目标折固定 200 轮 / %测试最高 / %最高分轮次
losoarousal140.4759.4916
losoarousal264.7065.34105
losoarousal322.5449.1931
losoarousal445.3856.36113
losoarousal544.0756.23180
losoarousal644.2464.19172
losoarousal762.9767.1670
losoarousal854.6265.216
losoarousal959.5366.99146
losoarousal1056.0662.757
losoarousal1137.5061.191
losoarousal1275.5582.501
losoarousal1385.0086.0225
losoarousal1467.5069.1165
losoarousal1562.3771.1416
losoarousal1654.9664.159
losoarousal1754.7066.1968
losoarousal1861.6165.3854
losoarousal1933.8168.863
losoarousal2041.0675.3850
losoarousal2159.5880.0077
losoarousal2240.5143.52155
losoarousal2358.5673.9452
losoarousal2417.5073.2267
losoarousal2565.8972.6320
losoarousal2648.9460.0898
losoarousal2756.5367.71146
losoarousal2843.6463.015
losoarousal2968.9073.64181
losoarousal3049.1558.7354
losoarousal3153.6068.9459
losoarousal3263.2670.00179
losovalence147.5451.44135
losovalence242.8055.552
losovalence347.0358.0136
losovalence442.9759.19138
losovalence552.4259.66169
losovalence664.3275.47142
losovalence746.5772.3717
losovalence849.9268.1828
losovalence947.1665.0816
losovalence1043.3153.52154
losovalence1148.3163.011
losovalence1243.1853.1485
losovalence1341.9550.0435
losovalence1441.6550.13111
losovalence1541.5362.123
losovalence1654.4165.3812
losovalence1746.5759.7552
losovalence1855.0867.12171
losovalence1943.6467.923
losovalence2065.9773.60181
losovalence2155.4263.2673
losovalence2264.6666.74133
losovalence2361.2767.63159
losovalence2445.9756.9111
losovalence2546.9555.0452
losovalence2638.7763.814
losovalence2767.2571.91176
losovalence2848.2262.501
losovalence2960.8570.3487
losovalence3063.9866.8625
losovalence3153.8662.979
losovalence3251.1958.9030
trial10arousal166.5071.3516
trial10arousal270.1772.723
trial10arousal365.6170.41126
trial10arousal463.6767.77190
trial10arousal557.0267.7712
trial10arousal661.1264.08160
trial10arousal760.0566.7015
trial10arousal860.9062.9926
trial10arousal963.8067.57153
trial10arousal1060.8866.4958
trial10valence158.3265.573
trial10valence264.3570.419
trial10valence363.4469.7076
trial10valence464.2770.2343
trial10valence567.6570.42138
trial10valence664.3466.2638
trial10valence758.0062.67116
trial10valence862.0564.50106
trial10valence964.6870.13155
trial10valence1064.0967.2157
window10arousal187.3987.61191
window10arousal282.3284.97137
window10arousal380.9983.20184
window10arousal486.4586.45200
window10arousal585.1885.50198
window10arousal686.2087.04172
window10arousal784.9886.73141
window10arousal884.8985.92199
window10arousal988.1088.10200
window10arousal1083.0985.61190
window10valence183.4783.50189
window10valence283.8684.26196
window10valence384.4184.48171
window10valence484.9785.55197
window10valence584.1184.83174
window10valence686.1886.30194
window10valence783.4184.12185
window10valence881.6384.68160
window10valence984.1684.77184
window10valence1083.4384.73169

06 / ENVIRONMENT运行环境与安装方法

6.1 本次已验证环境

组件实际版本 / 设置
操作系统Ubuntu 22.04.5 LTS,Linux x86_64
GPU / NVIDIA 驱动RTX 3090 24 GB,仅 GPU0;驱动 570.195.03
Python3.10.20
PyTorch / CUDA runtime2.2.2+cu121 / CUDA 12.1
核心依赖NumPy 1.23.5、SciPy 1.14.1、einops 0.8.0、scikit-learn 1.6.0、pykalman 0.10.2
数值与执行设置FP32;TF32 关闭;PyTorch/cuDNN 确定性算法;CUDA Graph 训练步加速
上游代码提交3f70685bf5917325a659fad93038c82b21e91702

6.2 准备代码与 Python 环境

以下命令假设已取得本工作区完整工程,其中包含新增的experiments/目录。仅克隆原始 GitHub 仓库不能获得本次补充的 DEAP 入口。先进入工程根目录;如换机器,将第一行改为自己的工程路径。机器需已安装 Python 3.10(含 venv)以及可用的 NVIDIA 驱动。

cd /home/ubuntu/lishuo/code/FAT # 新机器首次安装使用;当前工作区已有可用 .venv,无需重建 python3.10 -m venv .venv .venv/bin/python -m pip install --upgrade pip # 精确锁定本次训练依赖(优先使用) .venv/bin/python -m pip install -r experiments/requirements.lock.txt

如果只需安装 DEAP 入口所用的核心依赖,可改用experiments/requirements.txt。完整锁文件进一步固定了 CUDA runtime 相关依赖和间接依赖。不要在本项目的 Python 3.10 环境中将 NumPy 随意升级到 2.x;本次 PyTorch 2.2.2 组合已固定为 NumPy 1.23.5。

# 核心依赖安装方案(二选一) .venv/bin/python -m pip install -r experiments/requirements.txt # 已安装 uv 的机器也可使用 uv venv --python python3.10 .venv uv pip install --python .venv/bin/python -r experiments/requirements.lock.txt

PyTorch 的这一安装组合包含运行所需的 CUDA 用户态库,训练本代码通常无需另行编译或安装整套 CUDA Toolkit;系统 NVIDIA 驱动仍必须可用。原仓库根目录的requirements.txt包含更多模型/绘图相关依赖,本次 DEAP 入口使用experiments/下的清单,额外补上了原清单缺失的 pykalman。

6.3 验证 GPU0 与依赖

export CUDA_DEVICE_ORDER=PCI_BUS_ID export CUDA_VISIBLE_DEVICES=0 export OMP_NUM_THREADS=1 export MKL_NUM_THREADS=1 export OPENBLAS_NUM_THREADS=1 nvidia-smi .venv/bin/python - <<'PY' import torch, numpy, scipy, sklearn, einops print('PyTorch:', torch.__version__, 'CUDA runtime:', torch.version.cuda) print('NumPy:', numpy.__version__, 'SciPy:', scipy.__version__) print('scikit-learn:', sklearn.__version__, 'einops:', einops.__version__) assert torch.cuda.is_available() assert torch.cuda.device_count() == 1 print('Visible GPU:', torch.cuda.get_device_name(0)) PY

训练入口内部也设置了 GPU0 可见性。可通过nvidia-smi --query-compute-apps=gpu_uuid,pid,process_name --format=csv将训练 PID 与物理卡对应。仅看到显存空闲较多并不意味着计算没有充分执行;当前模型参数量较小,主要开销来自大量小 batch 的重复计算与调度。

展开完整依赖锁文件

07 / REPRODUCIBILITY从数据到完整实验的运行步骤

7.1 目录与数据准备

FAT/ ├── FAT_model.py / FANLayer.py / utils.py ├── 0161_paper.pdf / model.jpg ├── experiments/ │ ├── prepare_deap.py # 预处理、标签和数据摘要 │ ├── run_deap.py # 三种协议、两类目标、结果汇总 │ ├── cuda_step.py # CUDA Graph 训练步 │ ├── check_deap.py # 特征等价性与分折检查 │ ├── check_cuda_step.py # 图捕获与 eager 数值检查 │ ├── check_resume.py # 连续训练与续训检查 │ ├── launch_deap.sh # 检查 + 数据准备 + 完整训练 │ └── requirements.lock.txt ├── data/deap_raw/s01.mat ... s32.mat ├── data/deap_features/ # 预处理后自动生成 ├── results/deap_seed42/ # 本次已完成实验,保留不覆盖 └── report/ # 本 HTML 与文档生成源文件

把标准s01.mat至s32.mat放到data/deap_raw/。这些文件应来自data_preprocessed_matlab,不是原始 BDF,也不是已经提取好的 DE 特征。每个文件需包含data与labels。

.venv/bin/python experiments/check_deap.py .venv/bin/python experiments/check_cuda_step.py .venv/bin/python experiments/check_resume.py .venv/bin/python experiments/prepare_deap.py

预处理输出包含每人特征、四维评分与原始文件 SHA-256;manifest.json保存数据列表与预处理参数。输出存在时会验证原始数据摘要。新一轮训练前若变更预处理算法,应使用新的特征输出目录,避免旧缓存混入新实验。

7.2 先做短程检查

# 完整数据、第 1 折、2 epochs;仅检查流程,不用于论文结论 .venv/bin/python experiments/run_deap.py \ --protocols window10 --targets valence --folds 1 \ --epochs 2 --checkpoint-every 1 --out results/smoke_new

7.3 正式训练

以下使用新输出目录保护现有最终结果。第一个命令运行 104 次完整队列;第二个命令仅运行两项 window10,各自 10 折。运行时选择所需的一种,不要同时在 GPU0 启动两个队列。

# 完整队列:window10 + LOSO + trial10,两个目标,各 200 epochs bash experiments/launch_deap.sh results/deap_seed42_replay # 或:仅复现被试相关 window10(20 个模型) .venv/bin/python experiments/run_deap.py \ --protocols window10 --targets valence arousal \ --epochs 200 --out results/window10_seed42_new

完整队列按折交错运行协议与目标。已完成的实验原样保存,配置、源码摘要与输出目录不匹配时拒绝继续。不要在完整训练中途把 200 改成 50 后仍将结果标为同一实验。

7.4 后台执行、监控与续跑

mkdir -p results/deap_seed42_replay nohup bash experiments/launch_deap.sh results/deap_seed42_replay \ > results/deap_seed42_replay/launcher.log 2>&1 & echo $! > results/deap_seed42_replay/launcher.pid tail -f results/deap_seed42_replay/launcher.log cat results/deap_seed42_replay/status.json cat results/deap_seed42_replay/summary.json # 中断后,用原命令及原输出目录继续 bash experiments/launch_deap.sh results/deap_seed42_replay

每 5 epochs 原子保存一次检查点,包括模型、Adam 状态及 Python / NumPy / PyTorch / CUDA 随机状态。恢复时会重算未保存的尾部 epochs;已完成的折会跳过。目录锁防止同一队列误启动多个进程。summary.json从首个完整任务结束后才出现;completed.json只在指定队列全部完成后生成。

7.5 输出文件与检查依据

文件用途
config.json训练参数、依赖版本、上游提交及核心源文件摘要
status.json / launcher.log最新 epoch 指标与完整运行过程
每折 split.npztrain/test 索引、仅训练集拟合的均值和标准差
每折 epochs.jsonl / result.json200 条训练轮日志与该折最终统计
每折 latest.pt / predictions.npz最后检查点、最终轮逐样本预测及真实标签
summary.json / final_results.csv汇总统计与 104 次完整结果;CSV 为结束后导出的审计表
completed.json / launcher_exit.txt完成标记及启动器退出时间、退出码
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/13 10:47:18

WSL2驱动更新后CUDA与Anaconda环境失效?完整修复指南

更新Windows侧NVIDIA驱动之后WSL里的CUDA直接罢工、Anaconda环境仿佛人间蒸发&#xff0c;这套组合拳打下来&#xff0c;是很多深度学习开发者的噩梦。我在真实项目里也撞过这个坎&#xff0c;当时正在跑的一个模拟训练脚本直接瘫掉&#xff0c;先是Python报 CUDA initializat…

作者头像 李华
网站建设 2026/10/13 10:47:12

2026年AI Agent全栈开发实战:从需求拆解到自动化验证与避坑指南

很多读者最近都在问同一个问题&#xff1a;2026 年了&#xff0c;大家都在用 AI Agent 构建全栈应用&#xff0c;那还需要从零手写一个项目吗&#xff1f;我的看法很直接&#xff1a;需要&#xff0c;但“需要”的方式变了。以前你要靠手写把每一步跑通&#xff0c;现在你要靠 …

作者头像 李华
网站建设 2026/10/13 10:46:56

FUXA开源Web组态软件实战:设备数据采集与监控大屏搭建

很多做设备监控的人&#xff0c;第一次听到FUXA这个开源可视化组态软件时&#xff0c;心里大概都会嘀咕&#xff1a;一个靠浏览器跑起来的组态界面&#xff0c;真能在现场扛得住吗&#xff1f;我最初也是这个反应&#xff0c;但后来真拿它做了一个设备数据采集项目&#xff0c;…

作者头像 李华
网站建设 2026/10/13 10:46:55

SpringBoot代驾管理系统实战:从需求拆解到并发抢单完整落地

一到毕业设计季&#xff0c;我身边就有不少同学来问选题。说句实话&#xff0c;管理系统类项目做得好的不多&#xff0c;大部分最后都变成了“登录增删改查”四件套&#xff0c;答辩时被问一句“你的难点在哪”就卡住了。不过基于SpringBoot的代驾管理系统是个例外&#xff0c;…

作者头像 李华
网站建设 2026/10/13 10:46:54

Flutter鸿蒙适配实战:跨平台演讲稿生成器APP开发全解析

1. 需求拆解与技术选型&#xff1a;这个APP到底做什么 1.1 演讲稿生成器的核心功能画像 事情得从我们项目组接到的一个需求说起。当时几个部门都在准备季度汇报&#xff0c;领导层希望我们做一个内部工具&#xff0c;让员工输入演讲主题、目标时长、场合类型&#xff0c;就能自…

作者头像 李华
网站建设 2026/10/13 10:46:48

R语言ARIMA时间序列预测实战:从数据清洗到业务交付

1. 这不是“调个包就出图”的ARIMA——为什么你用R跑出来的预测总在抖&#xff1f;“R语言 数据处理 ARIMA预测”——光看这八个字&#xff0c;我猜你大概率正卡在三个地方&#xff1a;数据读进来全是NA、auto.arima()报错说“non-stationary”&#xff0c;或者模型跑出来了&am…

作者头像 李华