当前位置: 首页 > article >正文

一种新型傅里叶邻接Transformer用于脑电情绪识别

该片文章是频域先验 空间拓扑 Transformer在 EEG 情绪识别的里程碑针对现有模型频域特征挖掘不足、Transformer 缺乏归纳偏置、跨被试泛化差三大核心痛点提出傅里叶邻接 TransformerFAT在 SEED、DEAP 数据集上刷新 SOTA。一、当前 EEG 情绪识别领域的核心问题1.信号特性痛点EEG 信号具有非平稳性、低信噪比、被试间差异大的天然缺陷传统模型难以学习稳定的判别性特征。2.特征提取缺陷手工特征DE/PSD鲁棒但丢失信息原生 CNN/RNN 无法捕捉全局依赖标准 Transformer缺乏归纳偏置数据低效、泛化差。3.频域特性挖掘缺失EEG 脑电信号具有内在周期性但现有方法未有效解耦周期 / 非周期成分无法利用频域先验提升性能。4.空间拓扑建模不足图神经网络依赖预定义通道连接跨数据集泛化差标准自注意力未融合 EEG 电极的物理邻接关系。5.泛化能力不足被试内精度高但跨被试LOSO性能暴跌无法满足实际 BCI 系统落地需求。二、论文提出的解决方案FAT 框架针对上述痛点提出傅里叶邻接 TransformerFAT核心是傅里叶解析线性层 傅里叶邻接注意力实现频域周期特性与空间通道关联的联合建模。1. 核心模块 1FAL傅里叶解析线性层创新解耦机制将输入特征拆分为周期分量cos/sin 傅里叶基建模非周期分量纯线性变换无非线性激活。作用替代 Transformer 的 QKV 线性投影显式捕捉 EEG 周期结构同时保留非周期成分的线性映射能力适配脑电信号频域特性。2. 核心模块 2FAA傅里叶邻接注意力基于 FAL 将 Q/K/V 分解为周期 / 非周期两路分别计算注意力分数。引入可学习的周期 / 非周期通道邻接矩阵将物理空间关联注入注意力计算弥补标准 Transformer 无归纳偏置的缺陷。融合数据驱动的注意力与电极拓扑先验同时建模全局依赖 空间结构。3. 整体框架输入EEG 差分熵DE频域特征。结构Patch 嵌入 位置编码→多层 FAA 替代 MHSA→前馈网络→分类头。训练频域数据增强 Mixup进一步提升泛化。三、实验效果与核心结论实验在SEED 系列3/4/5/7 分类、DEAP效价 / 唤醒度数据集开展包含被试内与 ** 跨被试LOSO** 验证被试内精度全面超越 SOTASEED-V 提升 6.5%、SEED-VII 提升 6.6%DEAP 效价90.10%、唤醒度89.18%。跨被试泛化泛化能力显著提升SEED-VII 上比 Conformer 高约 5%解决 Transformer 跨被试差的痛点。消融验证FAL 解耦 邻接矩阵协同增益缺一不可全频带特征输入效果最优。可解释性周期 / 非周期邻接矩阵学到差异化的通道关联与脑科学先验一致。四、领域见解与创新点一对 EEG 情绪识别领域的核心见解核心突破方向单纯堆叠深度学习结构无效** 融合神经物理先验频域周期、空间拓扑** 是提升精度与泛化的唯一路径。Transformer 适配改造原生 Transformer 不适合 EEG必须加入归纳偏置通道邻接、频域分解、时序约束。信号处理与深度学习融合传统信号处理傅里叶分析与深度学习并非对立先验嵌入比纯数据驱动更优。落地核心指标跨被试LOSO性能远重要于被试内精度是情感 BCI 实用化的关键。二论文原生创新点频域解耦创新首次在 Transformer 中用 FAL显式解耦 EEG 周期 / 非周期成分充分利用脑电频域特性。注意力机制创新提出 FAA融合傅里叶分解 可学习通道邻接矩阵同时建模全局依赖与电极拓扑。框架创新构建 FAT 端到端框架兼顾频域、空间、时序三维信息精度与泛化双 SOTA。三未来可落地创新方向混合架构融合FAT 图卷积 CNN结合全局注意力、空间拓扑、局部特征。跨被试自适应基于 FAT 的周期特征做域自适应解决被试差异问题。轻量化部署模型剪枝 / 量化适配穿戴式脑电设备实时推理。多模态协同用 FAT 提取 EEG 特征融合 GSR、眼动等外周信号构建多模态情感模型。动态拓扑学习邻接矩阵随情绪状态动态更新更贴合脑功能连接的变化特性。总结FAT 框架开创了傅里叶频域先验 空间邻接拓扑 Transformer的新范式完美解决 EEG 情绪识别中频域挖掘不足、Transformer 无归纳偏置、跨被试泛化差三大痛点是后续 EEG 情绪识别、脑机接口研究的重要参考。实现代码from torch import nn from utils import normalize_A from einops import rearrange from FANLayer import FANLayer import torch # 定义 EEG Conformer 模型 class ModifiedPatchEmbedding2D(nn.Module): def __init__(self, emb_size40, num_channels62, num_freq_bands5): super(ModifiedPatchEmbedding2D, self).__init__() self.emb_size emb_size self.num_channels num_channels self.num_freq_bands num_freq_bands self.batch_norm_stage1 nn.BatchNorm2d(emb_size // 2) self.batch_norm_stage2 nn.BatchNorm2d(emb_size) # 位置编码 self.position_encodings nn.Parameter(torch.randn(1, 1, num_channels, num_freq_bands)) def forward(self, x): # 添加位置编码 x x self.position_encodings # [B, 1, C, num_freq_bands] x x.squeeze(1).permute(0, 2, 1).unsqueeze(-1) # [B, num_freq_bands, C, 1] # 调整回 Transformer 格式 x x.squeeze(-1).permute(0, 2, 1) # [B, C, emb_size] return x class PositionalEncoding(nn.Module): def __init__(self, emb_size, dropout0.1, max_len100): super().__init__() self.dropout nn.Dropout(pdropout) position torch.arange(0, max_len, dtypetorch.float).unsqueeze(1) div_term torch.exp(torch.arange(0, emb_size, 2).float() * (-torch.log(torch.tensor(10000.0)) / emb_size)) pe torch.zeros(max_len, emb_size) pe[:, 0::2] torch.sin(position * div_term) pe[:, 1::2] torch.cos(position * div_term) pe pe.unsqueeze(0) # [1, max_len, emb_size] self.register_buffer(pe, pe) def forward(self, x): seq_len x.size(1) x x self.pe[:, :seq_len, :].to(x.device) # 加位置编码 return self.dropout(x) def forward(self, x, maskNone, dynamic_graph1None, dynamic_graph2None): x.shape (B, n, emb_size40) 前提 - num_heads 8 - 每个 head_dim 5 - 前 4 个 head 和后 4 个 head 分别融合到 DG1 / DG2 - DG1.shape (B,4,n,n), DG2.shape (B,4,n,n) B, n, _ x.shape queries rearrange(self.queries(x), b n (h d) - b h n d, h8) keys rearrange(self.keys(x), b n (h d) - b h n d, h8) values rearrange(self.values(x), b n (h d) - b h n d, h8) energy torch.einsum(bhqd, bhkd - bhqk, queries, keys) if mask is not None: energy energy.masked_fill(~mask, float(-inf)) queries_4_4 queries.permute(0, 2, 1, 3) q_front4 queries_4_4[:, :, :4, :] q_back4 queries_4_4[:, :, 4:, :] q_front4_20 q_front4.reshape(B, n, 20) if dynamic_graph1 is not None: energy[:, :4, :, :] energy[:, :4, :, :] w_front4 * dynamic_graph1 if dynamic_graph2 is not None: energy[:, 4:, :, :] energy[:, 4:, :, :] w_back4 * dynamic_graph2 scaling (self.emb_size ** 0.5) att torch.softmax(energy / scaling, dim-1) out torch.einsum(bhqk, bhkd - bhqd, att, values) out rearrange(out, b h n d - b n (h d)) out self.projection(out) return out class ResidualAdd(nn.Module): def __init__(self, fn): super().__init__() self.fn fn def forward(self, x, **kwargs): if isinstance(self.fn, FAA): return x self.fn(x, **kwargs) else: return x self.fn(x) class TransformerEncoderBlock(nn.Module): def __init__(self, emb_size, num_heads4, drop_p0.5, forward_expansion4, use_dynamic_graphFalse): super().__init__() # 注意力部分用自定义的 AttentionBlock 来替代原先的 nn.Sequential self.attention AttentionBlock(emb_size, num_heads, drop_p, use_dynamic_graph) # FeedForward 部分可以继续用 ResidualAdd nn.Sequential因为它不需要额外参数 self.feed_forward ResidualAdd( nn.Sequential( nn.LayerNorm(emb_size), FeedForwardBlock(emb_size, expansionforward_expansion, drop_pdrop_p), nn.Dropout(drop_p), ) ) def forward(self, x, maskNone, dynamic_graph1None, dynamic_graph2None): # 只在多头注意力这里需要传入 dynamic_graph1 / dynamic_graph2 x self.attention(x, maskmask, dynamic_graph1dynamic_graph1, dynamic_graph2dynamic_graph2) x self.feed_forward(x) # FFN 部分无需额外参数 return x class TransformerEncoder(nn.Module): def __init__(self, depth, emb_size, num_heads4, drop_p0.1, num_dim63, use_dynamic_graphFalse): super().__init__() self.use_dynamic_graph use_dynamic_graph self.dynamic_graph_learner1 DynamicGraphLearner(nnum_dim, num_headsnum_heads // 2) if use_dynamic_graph else None self.dynamic_graph_learner2 DynamicGraphLearner(nnum_dim, num_headsnum_heads // 2) if use_dynamic_graph else None self.layers nn.ModuleList([ TransformerEncoderBlock(emb_size, num_heads, drop_p, use_dynamic_graphuse_dynamic_graph) for _ in range(depth) ]) def forward(self, x, maskNone): dynamic_graph1 self.dynamic_graph_learner1(x) if self.use_dynamic_graph else None dynamic_graph2 self.dynamic_graph_learner2(x) if self.use_dynamic_graph else None for layer in self.layers: x layer(x, maskmask, dynamic_graph1dynamic_graph1, dynamic_graph2dynamic_graph2) return x class ClassificationHead(nn.Sequential): def __init__(self, emb_size, n_classes, drop_p0.3): super().__init__( nn.LayerNorm(emb_size), # Normalize features nn.Linear(emb_size, n_classes) # Map to class logits ) class FAT(nn.Module): def __init__(self, emb_size40, depth6, n_classes4, num_channels62, num_freq_bands5, num_heads8, use_dynamic_graphTrue): super(FAT, self).__init__() self.patch_embedding ModifiedPatchEmbedding2D(emb_size, num_channels, num_freq_bands) self.cls_token nn.Parameter(torch.randn(1, 1, emb_size)) self.positional_encoding PositionalEncoding(emb_size, dropout0.1, max_lennum_channels 1) self.transformer_encoder TransformerEncoder( depth, emb_size, num_heads, drop_p0.2, num_dimnum_channels1, use_dynamic_graphuse_dynamic_graph ) self.classification_head ClassificationHead(emb_size, n_classes) def forward(self, x): x self.patch_embedding(x) # [B, C, emb_size] B, C, E x.shape cls_token self.cls_token.expand(B, -1, -1) x torch.cat((cls_token, x), dim1) # [B, C1, emb_size] x self.positional_encoding(x) # [B, C1, emb_size] x self.transformer_encoder(x) # [B, C1, emb_size] cls_output x[:, 0, :] # [B, emb_size] logits self.classification_head(cls_output) return logits

相关文章:

一种新型傅里叶邻接Transformer用于脑电情绪识别

该片文章是频域先验 空间拓扑 Transformer在 EEG 情绪识别的里程碑,针对现有模型频域特征挖掘不足、Transformer 缺乏归纳偏置、跨被试泛化差三大核心痛点,提出傅里叶邻接 Transformer(FAT),在 SEED、DEAP 数据集上刷…...

白嫖使用 Claude Opus 4.7 一个月,新手保姆级教程

挖槽,最近亚马逊做了一次大善人,为它自家的 Kiro 做拉新活动,新注册账号可以直接获得一个月的 Kiro Pro 会员,价值 20 美刀。 教程非常详细,所以有点长,想看最短流程版的可以直接划到文章末尾。 Kiro 是什…...

Agent量产鸿沟:从数据拆解到厂商抢位,安全基建决定谁能上岸

一、数据全景——鸿沟到底在哪采纳率的数字迷宫2026年Q2,企业Agent落地数据密集发布,但数字彼此矛盾——有的报告称"78%企业有试点",有的则说"仅17%已部署"。这些差异不是数据错误,而是定义边界不同。理解这个…...

适合情侣复合的歌曲|一开口就破防,唱尽遗憾与舍不得,听完都想重新在一起

有些分开不是不爱,只是赌气、误会、嘴硬、放不下面子。明明心里还惦记,却谁都不肯先低头;明明还深爱,却硬生生走成了陌路。想复合,却不知怎么开口;想挽回,又怕被拒绝、怕尴尬、怕自作多情。其实…...

跨设备游戏串流终极方案:Sunshine开源服务器高效解决游戏共享难题

跨设备游戏串流终极方案:Sunshine开源服务器高效解决游戏共享难题 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine Sunshine作为一款自托管的开源游戏串流服务器&#x…...

AI系统提示词安全防护:从泄露风险到后端代理实战

1. 项目概述:当系统提示词不再“秘密”最近在AI应用开发圈里,一个名为“asgeirtj/system_prompts_leaks”的项目引起了我的注意。这名字直译过来就是“系统提示词泄露”,听起来就有点意思。简单来说,这个项目收集并展示了在各种AI…...

魔兽争霸III终极优化指南:WarcraftHelper让你的游戏体验焕然一新

魔兽争霸III终极优化指南:WarcraftHelper让你的游戏体验焕然一新 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper WarcraftHelper是一款专为…...

构建支持多模型切换的智能内容审核与打标系统

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 构建支持多模型切换的智能内容审核与打标系统 在用户生成内容平台中,视频、图文等内容的审核与分类打标是核心运营环节…...

图片怎么去水印?2026图片去水印方法实测 + 好用工具推荐

图片怎么去水印?2026图片去水印方法实测 好用工具推荐 前言 日常刷图、做设计、整理相册,总免不了碰到这个问题:图片上有水印,该怎么去掉?无论是摄影平台的版权标识、相机自动打上的日期戳、App 角标,还是…...

EDA数据管理难题的通用解法:规则引擎驱动的设计对象抽象

1. 项目概述:一个EDA数据管理难题的通用解法在芯片设计、PCB布局这些电子设计自动化领域摸爬滚打过的工程师,大概都经历过一种“幸福的烦恼”:手头的设计工具越来越强大,但随之产生的数据文件也越来越多、越来越复杂。一个简单的电…...

VS Code 修改 C++ 标准同时修改错误检测标准

修改C标准基于使用Code Running拓展 可以看我上一章文章 VS Code 整洁的打印内容到终端https://blog.csdn.net/2301_76542477/article/details/161060041?sharetypeblogdetail&sharerId161060041&sharereferPC&sharesource2301_76542477&spm1011.2480.3001.…...

英伟达汽车计算平台:从芯片到生态的自动驾驶全栈解决方案

1. 从GTC 2021看英伟达的汽车野心:不止于芯片的生态战争上周的GTC 2021大会信息量爆炸,光是汽车相关的发布就足以让整个行业消化好一阵子。作为一名长期跟踪汽车电子与自动驾驶技术演进的老兵,我习惯在每次大型技术发布会后,把那些…...

暗黑破坏神4 2026.5.13最新破解版免费下载 (速下 随时失效)手机电脑版通用

下载链接 圣休亚瑞的暗影演进:探析《暗黑破坏神4》的设计、玩法与竞争格局 作为动作角色扮演游戏(ARPG)领域的常青树,暴雪娱乐(Blizzard Entertainment)开发的《暗黑破坏神4》(以下简称D4&…...

金融机器学习实战:从特征工程到投资组合优化的完整工具库解析

1. 项目概述:金融机器学习的开源宝库如果你在量化金融、算法交易或者金融数据分析领域摸爬滚打过一段时间,大概率会和我有同样的感受:从零开始构建一个可靠的金融机器学习(Financial Machine Learning, FML)研究或交易…...

C# —— 结构体、类型转换与运算符

一、结构体(struct)与常量(const)结构体用于打包多个相关变量,常量用于定义不可修改的值,是规范数据的常用方式。1. 结构体(struct)作用:把多个变量打包成一个整体&#…...

多源视频流时空配准,搭建跨摄像机一体化轨迹推演计算平台

多源视频流时空配准,搭建跨摄像机一体化轨迹推演计算平台在数字孪生与视频孪生全域空间智能感知的建设进程中,各类管控场景普遍部署多品牌、多焦距、多布设姿态的异构摄像设备,衍生出大量编码格式各异、传输时延参差、时钟相位错位的多源异步…...

ARM缓存控制器架构与事件监控系统解析

1. ARM缓存控制器架构概述在嵌入式处理器设计中,缓存控制器作为连接CPU核心与主存的关键中间层,其性能直接影响系统整体效率。ARM架构下的L2缓存控制器采用多级流水线设计,通过事件监控机制和精确的时序参数控制,实现了对内存访问…...

AI驱动的学术研究技能:自动化文献综述与深度分析工作流

1. 项目概述:一个为AI智能体设计的深度学术研究技能如果你是一名研究生、科研人员,或者任何需要快速、系统地梳理某个领域文献的人,那么你肯定体会过那种面对海量论文时的无力感。传统的流程是:打开Google Scholar,输入…...

从零掌握生成式AI:开源学习路径与实战项目全解析

1. 项目概述与核心价值最近在GitHub上看到一个名为“panaverse/learn-generative-ai”的项目,作为一个在AI领域摸爬滚打多年的从业者,我立刻被它吸引住了。这个项目直译过来就是“学习生成式AI”,名字非常直接,但它的内容组织和深…...

【Pixel专属Gemini Edge推理引擎】:本地运行LLM不联网、零延迟、功耗降低47%——实测数据首次公开

更多请点击: https://intelliparadigm.com 第一章:Gemini Edge推理引擎的Pixel专属定位与技术边界 Gemini Edge 是 Google 为 Pixel 系列设备深度定制的端侧推理引擎,其核心设计目标并非通用模型部署,而是围绕 Pixel 的硬件协同栈…...

为什么92%的Discord AI机器人3天内被封禁?ChatGPT合规集成的4个硬性红线,开发者必查

更多请点击: https://intelliparadigm.com 第一章:为什么92%的Discord AI机器人3天内被封禁?ChatGPT合规集成的4个硬性红线,开发者必查 Discord 并非开放沙盒——其 API 政策与《Developer Terms of Service》明确禁止未经用户明…...

不止于抓包:用Fiddler做移动端API调试和性能优化的5个实战技巧

不止于抓包:用Fiddler做移动端API调试和性能优化的5个实战技巧 当你已经能够熟练使用Fiddler进行基础抓包操作后,这款工具的真正价值才刚刚开始显现。许多开发者仅仅将其视为一个"网络请求查看器",却忽略了它在移动端开发全流程中的…...

ChatGPT Discord机器人开发全链路拆解(含Rate Limit绕过策略与上下文记忆优化)

更多请点击: https://intelliparadigm.com 第一章:ChatGPT与Discord机器人开发全链路概览 构建一个能调用 ChatGPT 能力的 Discord 机器人,需跨越 API 集成、身份认证、消息路由与状态管理四大核心层。该链路并非单向调用,而是一…...

一次断电引发的血案:深度复盘CentOS 7 LVM分区下fstab丢失的排查与修复全记录

CentOS 7 LVM环境下fstab丢失的深度修复指南 当服务器遭遇意外断电时,文件系统损坏往往是最令人头疼的问题之一。最近处理的一起CentOS 7系统宕机案例,由于断电导致/etc/fstab文件丢失,系统无法正常启动。本文将详细记录整个排查和修复过程&a…...

P1238 走迷宫【洛谷算法习题】

P1238 走迷宫 网页链接 P1238 走迷宫 题目描述 有一个 mnm\times nmn 格的迷宫(表示有 mmm 行、nnn 列),其中有可走的也有不可走的,如果用 111 表示可以走,000 表示不可以走,文件读入这 mnm\times nmn 个数据和起始点、结束点…...

用HFSS Floquet Port仿真无限大阵列:从单元设计到S参数提取全流程解析

用HFSS Floquet Port仿真无限大阵列:从单元设计到S参数提取全流程解析 在相控阵天线和频率选择表面设计中,工程师常面临一个关键挑战:如何准确评估单个辐射单元在无限大周期阵列环境下的性能表现?传统有限阵列仿真不仅计算资源消耗…...

Linux系统下Filezilla FTP客户端的两种高效部署方案

1. 为什么选择Filezilla作为Linux平台的FTP客户端? 作为Linux用户,我们经常需要在服务器之间传输文件。虽然命令行工具如scp、sftp也能完成工作,但图形化客户端在批量文件操作和可视化管理方面优势明显。Filezilla作为老牌开源FTP解决方案&am…...

从图像到十字绣:基于颜色量化与DMC匹配的自动化绣图生成技术

1. 项目概述:从代码仓库到十字绣艺术的数字桥梁最近在GitHub上闲逛,发现了一个挺有意思的项目,叫suads463/xstitch。光看名字,你可能会有点摸不着头脑,suads463显然是作者的用户名,而xstitch这个缩写&#…...

数据库事务与隔离级别:深入理解ACID

数据库事务与隔离级别:深入理解ACID 引言 数据库事务是现代应用系统数据一致性的基石。在并发环境下,事务处理不当会导致脏读、不可重复读、幻读等一系列问题。理解事务的隔离级别及其实现原理,是每个后端开发者必须掌握的核心技能。 一、ACI…...

Redis高级数据结构:超越String的Redis世界

Redis高级数据结构:超越String的Redis世界 引言 Redis不仅仅是"一个KV存储",它提供了丰富的数据结构,是现代应用架构中不可或缺的组件。深入理解Redis的数据结构,能够帮助我们设计出更高效、更优雅的解决方案。本文将…...