# DEAP-FAT **Repository Path**: CodeStoreHub/deap-fat ## Basic Information - **Project Name**: DEAP-FAT - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-11 - **Last Updated**: 2026-10-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # DEAP数据集2026最新Transformer算法 # [官方代码+数据集下载](https://hallo.codestore.store/buy/36) 将傅里叶启发的周期性表示与可学习的通道邻接关系结合,在 Transformer 中同时建模样本相关性与共享结构,并通过 DEAP 的效价、唤醒度分类实验检验模型的识别与泛化能力。 ## 01 / OVERVIEW 研究目标与方法定位 脑电情绪识别需要在噪声、非平稳性和个体差异的共同影响下,从多通道信号中提取有效信息。单纯依赖固定脑区连边可能无法适应样本变化,而完全由输入决定的注意力又缺少稳定的通道结构约束。我们提出傅里叶邻接 Transformer(Fourier Adjacency Transformer,FAT),将两类信息整合到同一注意力计算中。 ### 周期性表示 我们使用傅里叶解析线性层(FAL)生成余弦、正弦与线性分支,使周期成分和非周期成分在特征维度上显式分离,再分别进入注意力头。 ### 结构先验 我们学习周期和非周期两组邻接矩阵,通过输入相关的门控控制其贡献,将跨样本共享的通道关系与当前样本的 Q–K 相关性相加。 本报告重点回答三个问题:该结构如何工作;DEAP 数据如何变成模型输入;在明确划分和统计口径后,完整实验与原论文基线有何差异。 **方法来源与实验归属。**本报告的方法架构与公式依据 Wang、Huang 等人的 FAT 论文与公开实现 [\[1\]](#ref-fat)[\[2\]](#ref-code)。模型框架及其原始研究贡献归原论文作者;本文中的“本次实测”指此工作区实际完成的 DEAP 实验,其他方法的数值均注明为原论文报告值。 ## 02 / METHOD FAT:从差分熵到情绪预测 ![原论文图2:上部为FAT整体框架,下部为包含FAL Q/K/V映射、门控邻接矩阵和Softmax的FAA模块](images/fat-architecture.jpg) 图 1|FAT 与 FAA 的模型框架。原论文 Figure 2;采用官方仓库 `model.jpg` 同版图,未重绘或更改结构。上半部分为完整网络,下半部分展开周期与非周期注意力分支。来源:[\[1\]](#ref-fat)[\[2\]](#ref-code)。 ### 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 **Stem**32 × 40 **CLS + 位置编码**33 × 40 **FAA 编码器 × 6**33 × 40 **分类头**2 logits | 模型项 | 本次设置 | 含义 | |----|----|----| | 嵌入维度 / heads / depth | 40 / 8 / 6 | 每个 head 为 5 维 | | FAL 周期分支 | 10 维 cos + 10 维 sin | 余下 20 维为恒等激活的线性分支 | | 共享邻接矩阵 | 2 × 33 × 33 | 周期/非周期各一组,含 CLS 节点 | | 可训练参数 | 114,812 | 32 通道、2 类的当前公开模型 | | 位置编码 Dropout / 编码器 Dropout | 0.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 / DATASET DEAP 数据集与学习任务 DEAP 是面向情感计算的多模态数据集,由 Koelstra 等人构建。32 位参与者分别观看 40 段时长约一分钟的音乐视频,同时采集 EEG 与外周生理信号,并对情绪体验进行主观评分;其中 22 位参与者还记录了正面面部视频。数据集的原始论文介绍了刺激材料筛选、实验流程与多模态情绪分析任务 [\[3\]](#ref-deap)。本实验只使用 EEG,不使用外周信号或面部视频。 | 项目 | 数据集 / 本次使用情况 | |----|----| | 参与者与 trials | 32 人 × 每人 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 | |---------|-------------|-------------|----------|-------------------| | Valence | 708 | 572 | 55.3125% | 16 trials,归低类 | | Arousal | 737 | 543 | 57.5781% | 17 trials,归低类 | 上述类别计数来自本地 32 份 MATLAB 文件的实际 labels,而非引用其他实验的样本统计。不同被试类别比例不同,评估中额外保存由训练集多数类确定的测试基线。 ### 3.2 数据边界与使用方式 本项目已从获授权的 NAS 数据位置读取并缓存数据。共享本文不需要暴露 NAS 账号、密码或分发原始数据。重新运行者应先获得 DEAP 数据使用权限,再将标准 MATLAB 文件放入指定目录。数据集说明以原始论文和授权材料为依据;本次文档同时记录实际文件形状,避免将原始采集格式与预处理格式混淆。 ## 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 必然服从高斯分布。 | 代码频带名称 | 频率范围 | 实现说明 | |--------------|----------|--------------------------------| | theta | 4–7 Hz | 沿用公开 DEAP 预处理 | | alpha | 8–10 Hz | 与下一频带存在重叠 | | slow_alpha | 8–13 Hz | 名称来自代码;未重新命名或替换 | | beta | 14–29 Hz | 沿用公开 DEAP 预处理 | | gamma | 30–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 识别 | | LOSO | 31 位被试训练、1 位被试测试,共 32 折 | 73,160 / 2,360 | 未见被试泛化 | **窗口重叠与平滑的信息共享。**相邻窗口共享 1 秒波形,LDS 平滑还利用整个 trial 的时间序列。window10 虽然样本索引不重叠,但原始信号来源和 trial 信息可以共享。trial10 将整个 trial 隔离;LOSO 进一步隔离被试。三个协议应分别解读。 ### 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 / % | |--------------------------|--------------|--------------| | KNN | 67.40 ± 7.28 | 67.80 ± 6.94 | | SVM | 65.80 ± 4.62 | 69.89 ± 5.60 | | LSTM | 74.76 ± 3.41 | 71.81 ± 3.99 | | DGCNN | 84.69 ± 6.20 | 83.02 ± 7.07 | | BiHDM | — | — | | RGNN | — | — | | PGCN | — | — | | Conformer | 80.71 ± 2.30 | 79.42 ± 3.03 | | 我们的方法 · 固定 200 轮 | 83.96 ± 1.12 | 84.96 ± 2.14 | | 我们的方法 · 测试最高轮 | 84.72 ± 0.73 | 86.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 / % | |----|----|----|----| | KNN | 55.35 ± 4.30 | 52.86 ± 4.22 | | SVM | 54.70 ± 0.36 | 55.90 ± 0.76 | | LSTM | 60.31 ± 0.24 | 59.78 ± 0.27 | | DGCNN | 59.72 ± 1.38 | 57.26 ± 1.29 | | BiHDM | — | — | | RGNN | — | — | | PGCN | — | — | | Conformer | 62.40 ± 0.20 | 59.90 ± 0.60 | | 我们的方法 · 固定 200 轮 | 50.77 ± 8.17 | 52.96 ± 14.14 | | 我们的方法 · 测试最高轮 | 62.42 ± 6.84 | 66.51 ± 8.66 | 图 2|FAT 的论文报告与本次实验对比。误差线表示各自统计口径下的标准差;论文统计单位未完全明确。纵轴从 0 开始,浅橙色为具有测试选择偏差的诊断值。图中仅展示 FAT 的不同来源/统计口径。 ### 5.3 trial 隔离对照与完整统计 | 协议 | 目标 | 完成折数 | 固定 200 轮 / % | 测试最高轮 / % | 训练多数类基线 / % | |----------|---------|----------|-----------------|----------------|--------------------| | window10 | valence | 10/10 | 83.96 ± 1.12 | 84.72 ± 0.73 | 55.31 ± 0.09 | | window10 | arousal | 10/10 | 84.96 ± 2.14 | 86.11 ± 1.34 | 57.58 ± 0.05 | | trial10 | valence | 10/10 | 63.12 ± 2.81 | 67.71 ± 2.71 | 55.31 ± 5.30 | | trial10 | arousal | 10/10 | 62.97 ± 3.58 | 67.78 ± 2.89 | 57.58 ± 2.84 | | loso | valence | 32/32 | 50.77 ± 8.17 | 62.42 ± 6.84 | 55.31 ± 9.14 | | loso | arousal | 32/32 | 52.96 ± 14.14 | 66.51 ± 8.66 | 57.58 ± 15.69 | trial10 中 Valence 为 **63.12 ± 2.81%**,Arousal 为 **62.97 ± 3.58%**。相对于 window10,固定轮结果分别下降 20.84、21.99 个百分点。这表明“在同一 trial 的窗口之间插值”和“识别未参与训练的 trial”是难度不同的任务;重叠窗口与整段平滑使前者具有较强的 trial 信息共享。本次对照没有进一步分离共享波形、平滑和其他分布差异各自的因果贡献。 ### 5.4 学习曲线:为什么最高轮与最后轮差距很大 ![三种协议的完整200轮平均测试准确率曲线,每个协议分别展示Valence和Arousal](images/training-curves.png) 图 3|同一 epoch 上对所有折的测试准确率求均值。曲线仅用于事后诊断,没有参与本次训练控制。特别注意:“逐折最高值的平均”不等于“平均曲线的最高值”,不能用这幅图替代逐折最佳轮的统计。 跨 trial 和跨被试任务中,训练后期的测试表现未必继续改善。合理的模型选择应在训练数据内部建立独立验证集:trial 泛化任务按 trial 划分验证集,跨被试任务可留出训练被试作验证。然后只在最终测试集上评价选定模型。本次未运行这种嵌套验证,也未将其可能带来的改善计入结果。 #### 展开 104 次训练的逐折结果 每行对应一个独立训练任务,均完成 200 epochs。完整 CSV 保存在工程的 results/deap_seed42/final_results.csv 中。 | 协议 | 目标 | 折 | 固定 200 轮 / % | 测试最高 / % | 最高分轮次 | |----------|---------|-----|-----------------|--------------|------------| | loso | arousal | 1 | 40.47 | 59.49 | 16 | | loso | arousal | 2 | 64.70 | 65.34 | 105 | | loso | arousal | 3 | 22.54 | 49.19 | 31 | | loso | arousal | 4 | 45.38 | 56.36 | 113 | | loso | arousal | 5 | 44.07 | 56.23 | 180 | | loso | arousal | 6 | 44.24 | 64.19 | 172 | | loso | arousal | 7 | 62.97 | 67.16 | 70 | | loso | arousal | 8 | 54.62 | 65.21 | 6 | | loso | arousal | 9 | 59.53 | 66.99 | 146 | | loso | arousal | 10 | 56.06 | 62.75 | 7 | | loso | arousal | 11 | 37.50 | 61.19 | 1 | | loso | arousal | 12 | 75.55 | 82.50 | 1 | | loso | arousal | 13 | 85.00 | 86.02 | 25 | | loso | arousal | 14 | 67.50 | 69.11 | 65 | | loso | arousal | 15 | 62.37 | 71.14 | 16 | | loso | arousal | 16 | 54.96 | 64.15 | 9 | | loso | arousal | 17 | 54.70 | 66.19 | 68 | | loso | arousal | 18 | 61.61 | 65.38 | 54 | | loso | arousal | 19 | 33.81 | 68.86 | 3 | | loso | arousal | 20 | 41.06 | 75.38 | 50 | | loso | arousal | 21 | 59.58 | 80.00 | 77 | | loso | arousal | 22 | 40.51 | 43.52 | 155 | | loso | arousal | 23 | 58.56 | 73.94 | 52 | | loso | arousal | 24 | 17.50 | 73.22 | 67 | | loso | arousal | 25 | 65.89 | 72.63 | 20 | | loso | arousal | 26 | 48.94 | 60.08 | 98 | | loso | arousal | 27 | 56.53 | 67.71 | 146 | | loso | arousal | 28 | 43.64 | 63.01 | 5 | | loso | arousal | 29 | 68.90 | 73.64 | 181 | | loso | arousal | 30 | 49.15 | 58.73 | 54 | | loso | arousal | 31 | 53.60 | 68.94 | 59 | | loso | arousal | 32 | 63.26 | 70.00 | 179 | | loso | valence | 1 | 47.54 | 51.44 | 135 | | loso | valence | 2 | 42.80 | 55.55 | 2 | | loso | valence | 3 | 47.03 | 58.01 | 36 | | loso | valence | 4 | 42.97 | 59.19 | 138 | | loso | valence | 5 | 52.42 | 59.66 | 169 | | loso | valence | 6 | 64.32 | 75.47 | 142 | | loso | valence | 7 | 46.57 | 72.37 | 17 | | loso | valence | 8 | 49.92 | 68.18 | 28 | | loso | valence | 9 | 47.16 | 65.08 | 16 | | loso | valence | 10 | 43.31 | 53.52 | 154 | | loso | valence | 11 | 48.31 | 63.01 | 1 | | loso | valence | 12 | 43.18 | 53.14 | 85 | | loso | valence | 13 | 41.95 | 50.04 | 35 | | loso | valence | 14 | 41.65 | 50.13 | 111 | | loso | valence | 15 | 41.53 | 62.12 | 3 | | loso | valence | 16 | 54.41 | 65.38 | 12 | | loso | valence | 17 | 46.57 | 59.75 | 52 | | loso | valence | 18 | 55.08 | 67.12 | 171 | | loso | valence | 19 | 43.64 | 67.92 | 3 | | loso | valence | 20 | 65.97 | 73.60 | 181 | | loso | valence | 21 | 55.42 | 63.26 | 73 | | loso | valence | 22 | 64.66 | 66.74 | 133 | | loso | valence | 23 | 61.27 | 67.63 | 159 | | loso | valence | 24 | 45.97 | 56.91 | 11 | | loso | valence | 25 | 46.95 | 55.04 | 52 | | loso | valence | 26 | 38.77 | 63.81 | 4 | | loso | valence | 27 | 67.25 | 71.91 | 176 | | loso | valence | 28 | 48.22 | 62.50 | 1 | | loso | valence | 29 | 60.85 | 70.34 | 87 | | loso | valence | 30 | 63.98 | 66.86 | 25 | | loso | valence | 31 | 53.86 | 62.97 | 9 | | loso | valence | 32 | 51.19 | 58.90 | 30 | | trial10 | arousal | 1 | 66.50 | 71.35 | 16 | | trial10 | arousal | 2 | 70.17 | 72.72 | 3 | | trial10 | arousal | 3 | 65.61 | 70.41 | 126 | | trial10 | arousal | 4 | 63.67 | 67.77 | 190 | | trial10 | arousal | 5 | 57.02 | 67.77 | 12 | | trial10 | arousal | 6 | 61.12 | 64.08 | 160 | | trial10 | arousal | 7 | 60.05 | 66.70 | 15 | | trial10 | arousal | 8 | 60.90 | 62.99 | 26 | | trial10 | arousal | 9 | 63.80 | 67.57 | 153 | | trial10 | arousal | 10 | 60.88 | 66.49 | 58 | | trial10 | valence | 1 | 58.32 | 65.57 | 3 | | trial10 | valence | 2 | 64.35 | 70.41 | 9 | | trial10 | valence | 3 | 63.44 | 69.70 | 76 | | trial10 | valence | 4 | 64.27 | 70.23 | 43 | | trial10 | valence | 5 | 67.65 | 70.42 | 138 | | trial10 | valence | 6 | 64.34 | 66.26 | 38 | | trial10 | valence | 7 | 58.00 | 62.67 | 116 | | trial10 | valence | 8 | 62.05 | 64.50 | 106 | | trial10 | valence | 9 | 64.68 | 70.13 | 155 | | trial10 | valence | 10 | 64.09 | 67.21 | 57 | | window10 | arousal | 1 | 87.39 | 87.61 | 191 | | window10 | arousal | 2 | 82.32 | 84.97 | 137 | | window10 | arousal | 3 | 80.99 | 83.20 | 184 | | window10 | arousal | 4 | 86.45 | 86.45 | 200 | | window10 | arousal | 5 | 85.18 | 85.50 | 198 | | window10 | arousal | 6 | 86.20 | 87.04 | 172 | | window10 | arousal | 7 | 84.98 | 86.73 | 141 | | window10 | arousal | 8 | 84.89 | 85.92 | 199 | | window10 | arousal | 9 | 88.10 | 88.10 | 200 | | window10 | arousal | 10 | 83.09 | 85.61 | 190 | | window10 | valence | 1 | 83.47 | 83.50 | 189 | | window10 | valence | 2 | 83.86 | 84.26 | 196 | | window10 | valence | 3 | 84.41 | 84.48 | 171 | | window10 | valence | 4 | 84.97 | 85.55 | 197 | | window10 | valence | 5 | 84.11 | 84.83 | 174 | | window10 | valence | 6 | 86.18 | 86.30 | 194 | | window10 | valence | 7 | 83.41 | 84.12 | 185 | | window10 | valence | 8 | 81.63 | 84.68 | 160 | | window10 | valence | 9 | 84.16 | 84.77 | 184 | | window10 | valence | 10 | 83.43 | 84.73 | 169 | ## 06 / ENVIRONMENT 运行环境与安装方法 ### 6.1 本次已验证环境 | 组件 | 实际版本 / 设置 | |----|----| | 操作系统 | Ubuntu 22.04.5 LTS,Linux x86_64 | | GPU / NVIDIA 驱动 | RTX 3090 24 GB,仅 GPU0;驱动 570.195.03 | | Python | 3.10.20 | | PyTorch / CUDA runtime | 2.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` | 论文使用 A100 80 GB,本次使用 RTX 3090,因此运行时间不能直接与论文设备比较。`nvidia-smi` 中的“CUDA Version”表示驱动支持的 CUDA 能力,不等同于 PyTorch 使用的 runtime;实际 runtime 可通过 `torch.version.cuda` 查看。 ### 6.2 准备代码与 Python 环境 以下命令假设已取得**本工作区完整工程**,其中包含新增的 `experiments/` 目录。仅克隆原始 GitHub 仓库不能获得本次补充的 DEAP 入口。先进入工程根目录;如换机器,将第一行改为自己的工程路径。机器需已安装 Python 3.10(含 venv)以及可用的 NVIDIA 驱动。 ``` bash 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。 ``` bash # 核心依赖安装方案(二选一) .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 与依赖 ``` bash 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 的重复计算与调度。 #### 展开完整依赖锁文件 ``` cloudpickle==3.1.2 einops==0.8.0 filelock==4.0.12 fsspec==2026.9.0 jinja2==3.1.6 joblib==1.6.0 markupsafe==3.0.4 mpmath==1.3.0 networkx==3.4.2 numpy==1.23.5 nvidia-cublas-cu12==12.1.3.1 nvidia-cuda-cupti-cu12==12.1.105 nvidia-cuda-nvrtc-cu12==12.1.105 nvidia-cuda-runtime-cu12==12.1.105 nvidia-cudnn-cu12==8.9.2.26 nvidia-cufft-cu12==11.0.2.54 nvidia-curand-cu12==10.3.2.106 nvidia-cusolver-cu12==11.4.5.107 nvidia-cusparse-cu12==12.1.0.106 nvidia-nccl-cu12==2.19.3 nvidia-nvjitlink-cu12==12.9.86 nvidia-nvtx-cu12==12.1.105 packaging==26.3 pykalman==0.10.2 scikit-base==0.12.6 scikit-learn==1.6.0 scipy==1.14.1 sympy==1.14.0 threadpoolctl==3.7.0 torch==2.2.2 triton==2.2.0 typing-extensions==4.16.0 ``` ## 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`。 ``` bash .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 先做短程检查 ``` bash # 完整数据、第 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 启动两个队列。 ``` bash # 完整队列: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 后台执行、监控与续跑 ``` bash 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.npz | train/test 索引、仅训练集拟合的均值和标准差 | | 每折 epochs.jsonl / result.json | 200 条训练轮日志与该折最终统计 | | 每折 latest.pt / predictions.npz | 最后检查点、最终轮逐样本预测及真实标签 | | summary.json / final_results.csv | 汇总统计与 104 次完整结果;CSV 为结束后导出的审计表 | | completed.json / launcher_exit.txt | 完成标记及启动器退出时间、退出码 | FAT · DEAP 技术与实验报告 | 2026-10-10 | 方法依据原论文,实测依据完整 104 次训练产物。