【脑机接口 算法】EEGNet: 通用神经网络应用于脑电信号

EEGNet: 神经网络应用于脑电信号

  • 中文题目
  • 论文下载:
  • 算法程序下载:
    • 摘要
    • 1 项目介绍
    • 2 EEGNet网络原理
      • 2.1EEGNet原理架构
      • 2.2FBCCA 算法
      • 2.3自适应FBCCA算法
    • 3EEGNet网络实现
    • 4结果

中文题目

论文下载:

DOI:

算法程序下载:

地址

摘要

  脑机接口(BCI)使用神经活动作为控制信号,实现与计算机的直接通信。这种神经信号通常是从各种研究透彻的脑电图(EEG)信号中挑选出来的。卷积神经网络(CNN)主要用来自动特征提取和分类,其在计算机视觉和语音识别领域中的使用已经很广泛。CNN已成功应用于基于EEG的BCI;但是,CNN主要应用于单个BCI范式,在其他范式中的使用比较少,论文作者提出是否可以设计一个CNN架构来准确分类来自不同BCI范式的EEG信号,同时尽可能地紧凑(定义为模型中的参数数量)。该论文介绍了EEGNet,这是一种用于基于EEG的BCI的紧凑型卷积神经网络。论文介绍了使用深度和可分离卷积来构建特定于EEG的模型,该模型封装了脑机接口中常见的EEG特征提取概念。论文通过四种BCI范式(P300视觉诱发电位、错误相关负性反应(ERN)、运动相关皮层电位(MRCP)和感觉运动节律(SMR)),将EEGNet在主体内和跨主体分类方面与目前最先进的方法进行了比较。结果显示,在训练数据有限的情况下,EEGNet比参考算法具有更强的泛化能力和更高的性能。同时论文也证明了EEGNet可以有效地推广到ERP和基于振荡的BCI。

1 项目介绍

  实验结果如下图,P300数据集的所有CNN模型之间的差异非常小,但是MRCP数据集却存在显著的差异,两个EEGNet模型的性能都优于所有其他模型。对于ERN数据集来说,两个EEGNet模型的性能都优于其他所有模型(p < 0.05)。
在这里插入图片描述

2 EEGNet网络原理

  到目前为止,

2.1EEGNet原理架构

  
在这里插入图片描述

2.2FBCCA 算法

  FBCCA在

2.3自适应FBCCA算法

  从上述FBCCA算法可以看出,

3EEGNet网络实现

  

import numpy as np
from sklearn.metrics import roc_auc_score, precision_score, recall_score, accuracy_score
import torch
import torch.nn as nn
import torch.optim as optim
from torch.autograd import Variable
import torch.nn.functional as F
import torch.optim as optim

class EEGNet(nn.Module):
    def __init__(self):
        super(EEGNet, self).__init__()
        self.T = 120
        
        # Layer 1
        self.conv1 = nn.Conv2d(1, 16, (1, 64), padding = 0)
        self.batchnorm1 = nn.BatchNorm2d(16, False)
        
        # Layer 2
        self.padding1 = nn.ZeroPad2d((16, 17, 0, 1))
        self.conv2 = nn.Conv2d(1, 4, (2, 32))
        self.batchnorm2 = nn.BatchNorm2d(4, False)
        self.pooling2 = nn.MaxPool2d(2, 4)
        
        # Layer 3
        self.padding2 = nn.ZeroPad2d((2, 1, 4, 3))
        self.conv3 = nn.Conv2d(4, 4, (8, 4))
        self.batchnorm3 = nn.BatchNorm2d(4, False)
        self.pooling3 = nn.MaxPool2d((2, 4))
        
        # 全连接层
        # 此维度将取决于数据中每个样本的时间戳数。
        # I have 120 timepoints. 
        self.fc1 = nn.Linear(4*2*7, 1)
        

    def forward(self, x):
        # Layer 1
        x = F.elu(self.conv1(x))
        x = self.batchnorm1(x)
        x = F.dropout(x, 0.25)
        x = x.permute(0, 3, 1, 2)
        
        # Layer 2
        x = self.padding1(x)
        x = F.elu(self.conv2(x))
        x = self.batchnorm2(x)
        x = F.dropout(x, 0.25)
        x = self.pooling2(x)
        
        # Layer 3
        x = self.padding2(x)
        x = F.elu(self.conv3(x))
        x = self.batchnorm3(x)
        x = F.dropout(x, 0.25)
        x = self.pooling3(x)
        
        # 全连接层
        x = x.view(-1, 4*2*7)
        x = F.sigmoid(self.fc1(x))
        return x
def evaluate(model, X, Y, params = ["acc"]):
    results = []
    batch_size = 100
    
    predicted = []
    
    for i in range(len(X)//batch_size):
        s = i*batch_size
        e = i*batch_size+batch_size
        
        inputs = Variable(torch.from_numpy(X[s:e]))
        pred = model(inputs)
        
        predicted.append(pred.data.cpu().numpy())
        
    inputs = Variable(torch.from_numpy(X))
    predicted = model(inputs)
    predicted = predicted.data.cpu().numpy()
    """
    设置评估指标:
    acc:准确率
    auc:AUC 即 ROC 曲线对应的面积
    recall:召回率
    precision:精确率
    fmeasure:F值
    """
    for param in params:
        if param == 'acc':
            results.append(accuracy_score(Y, np.round(predicted)))
        if param == "auc":
            results.append(roc_auc_score(Y, predicted))
        if param == "recall":
            results.append(recall_score(Y, np.round(predicted)))
        if param == "precision":
            results.append(precision_score(Y, np.round(predicted)))
        if param == "fmeasure":
            precision = precision_score(Y, np.round(predicted))
            recall = recall_score(Y, np.round(predicted))
            results.append(2*precision*recall/ (precision+recall))
    return results


# 定义网络
net = EEGNet()
# 定义二分类交叉熵 (Binary Cross Entropy)
criterion = nn.BCELoss()
# 定义Adam优化器
optimizer = optim.Adam(net.parameters())

"""
生成训练数据集,数据集有100个样本
训练数据X_train:为[0,1)之间的随机数;
标签数据y_train:为0或1
"""
X_train = np.random.rand(100, 1, 120, 64).astype('float32')
y_train = np.round(np.random.rand(100).astype('float32')) 
"""
生成验证数据集,数据集有100个样本
验证数据X_val:为[0,1)之间的随机数;
标签数据y_val:为0或1
"""
X_val = np.random.rand(100, 1, 120, 64).astype('float32')
y_val = np.round(np.random.rand(100).astype('float32'))
"""
生成测试数据集,数据集有100个样本
测试数据X_test:为[0,1)之间的随机数;
标签数据y_test:为0或1
"""
X_test = np.random.rand(100, 1, 120, 64).astype('float32')
y_test = np.round(np.random.rand(100).astype('float32'))
batch_size = 32
# 训练 循环
for epoch in range(10): 
    print("\nEpoch ", epoch)
    
    running_loss = 0.0
    for i in range(len(X_train)//batch_size-1):
        s = i*batch_size
        e = i*batch_size+batch_size
        
        inputs = torch.from_numpy(X_train[s:e])
        labels = torch.FloatTensor(np.array([y_train[s:e]]).T*1.0)
        
        # wrap them in Variable
        inputs, labels = Variable(inputs), Variable(labels)

        # zero the parameter gradients
        optimizer.zero_grad()

        # forward + backward + optimize
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        
        optimizer.step()
        
        running_loss += loss.item()
    
    # 验证
    params = ["acc", "auc", "fmeasure"]
    print(params)
    print("Training Loss ", running_loss)
    print("Train - ", evaluate(net, X_train, y_train, params))
    print("Validation - ", evaluate(net, X_val, y_val, params))
    print("Test - ", evaluate(net, X_test, y_test, params))

定义评估指标:

acc:准确率

auc:AUC 即 ROC 曲线对应的面积

recall:召回率

precision:精确率

fmeasure:F值

4结果

在这项工作中,我们提出了EEGNet,一个小型的卷积神经网络,用于基于脑电图的BCI,它可以在有限的数据存在的情况下泛化不同的BCI范式,并产生可解释的特征。我们通过四个EEG数据集:P300视觉诱发电位、错误相关负波(ERN)、运动相关皮层电位(MRCP)和感觉运动节律(SMR),对EEGNet与基于ERP和振荡的BCIs的最先进方法进行了评估。据我们所知,这是第一次验证跨多个BCI数据集使用单一网络架构的工作,每个数据集都有自己的特征和数据集大小。我们的工作介绍了使用深度和可分离卷积脑电图信号分类,并表明它们可以用来构建一个脑电图特定的模型,其中包含众所周知的脑电图特征提取概念。最后,通过使用特征可视化和消融分析,我们表明可以从EEGNet模型中提取神经生理学可解释的特征。最后这一发现尤其重要,因为它是理解CNN模型结构的有效性和鲁棒性的关键组成部分,不仅对EEG,而且对一般的CNN结构也是如此。

CNN的学习能力部分来自于它们从原始数据中自动提取复杂特征表示的能力。然而,由于这些特征不是由人类工程师手工设计的,理解这些特征的含义在生成可解释的模型方面是一个重大挑战。当cnn被用于脑电图数据的分析时,这一点尤其正确,因为神经信号的特征往往是非平稳的,并被噪声伪影损坏。在本研究中,我们展示了三种不同的方法来可视化EEGNet学到的特性:

(1)分析P300数据集上的空间滤波器输出,平均试次结果;

(2)可视化SMR数据集上的卷积核权值,并将其与FBCSP学到的权值进行比较;

(3)对MRCP和SMR数据集进行单试次相关性分析。对于ERN数据集,我们比较了单试次特征相关性和平均ERP,发现相关特征与正确和错误反馈试次的正峰值一致,这在之前的文献中已经表明与分类器性能呈正相关。此外,我们进行了一项特征消融研究,以了解分类决策对P300数据集上特定特征存在与否的影响。在每一项分析中,我们都表明EEGNet能够提取与已知神经生理现象相对应的可解释特征。

总体而言,DeepConvNet和EEGNet在所有跨被试分析中的分类表现相似,而DeepConvNet在几乎所有被试内分析中的分类表现较低(P300除外)。对这种差异的一种可能解释是用于训练模型的训练数据的数量;在跨被试分析中,训练集的大小大约是被试内分析的10-15倍。这表明,与EEGNet相比,DeepConvNet的数据密集型更强,考虑到DeepConvNet的模型规模比EEGNet大两个数量级,这一结果并不令人惊讶(见表3)。我们相信,这与DeepConvNet的开发人员最初报告的发现是一致的。他们指出,需要训练数据增强策略来获得对SMR数据集的良好分类性能。与他们的工作相比,我们表明EEGNet在所有测试数据集上表现良好,而不需要数据扩充,这使得模型在实践中更容易使用。

总的来说,我们发现,在被试内和跨被试分析中,ShallowConvNet倾向于在ERP BCI数据集上比在振荡BCI数据集(SMR)上表现更差,而在DeepConvNet上观察到相反的行为。我们认为这是由于ShallowConvNet架构专门设计用于提取频带特征;在主要特征是信号幅度的情况下(如许多ERP BCIs中的情况),ShallowConvNet的性能往往会受到影响。而DeepConvNet则相反;由于其架构的设计不是为了提取频率特征,所以在频率功率为主要特征的情况下,其性能较低。相比之下,我们发现EEGNet与ShallowConvNet在鼻中隔黏膜下切除术后的分类和DeepConvNet在ERP分类一样好,这表明EEGNet足够强劲的学习各种各样的功能范围的BCI任务。

鉴于MRCP和SMR之间的神经反应相似,ShallowConvNet在被试内MRCP分类上的严重不足是意料之外的,但ShallowConvNet在SMR上表现良好。这种表现上的差异并不是因为使用了大量的训练数据,因为被试内MRCP分类大约有700个训练试次,平均分布在左右手指运动中,而SMR数据集只有192个训练试次,平均分布在四个类别中。此外,在其他数据集(P300和ERN)上,我们没有观察到ShallowConvNet性能的大偏差。事实上,尽管该数据集是本研究使用的所有数据集中最小的(总共只有170个训练试次),但ShallowConvNet在被试内ERN分类方面表现得相当好。确定这一现象的潜在来源将在未来的研究中进行探索。

脑电图深度学习模型一般采用三种输入方式,取决于他们的目标应用程序:(1)脑电图信号的所有可用的通道,(2)变换后的EEG信号(通常是一个时频分解)的所有可用的通道或(3)变换后的EEG信号通道的一个子集。属于(2)的模型通常会看到数据维数显著增加,因此需要更多的数据或更多的模型正则化(或两者都需要)来学习有效的特征表示。这引入了更多必须学习的超参数,增加了由于超参数错误描述而导致的模型性能的潜在可变性。属于(3)的模型通常需要关于要选择的通道的先验知识。我们认为属于(1)的模型,例如EEGNet和其他模型,在输入维度和通过提供所有可用通道来发现相关特性的灵活性之间提供了最好的权衡。当BCI技术发展到新的应用程序空间时,这一点尤其重要,因为这些未来BCI所需的特性可能事先不知道。

总之,我们提出的EEGNet鲁棒性很好,表现很好,在多个数据集上可获得一系列可解释性特征。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/121231.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

踩准AI时代风口,NFPrompt让人人都能成为赚取利润的创作者

★ AI寒武纪时代&#xff0c;抓住风口并不难 众所周知&#xff0c;随着ChatGPT的面世&#xff0c;AI在2023年快速爆发&#xff0c;不少人已经意识到AI将在未来能够影响到我们每个人生活方方面面&#xff0c;同时AI也将打破现有的经济与社会格局。对于普通人来说&#xff0c;如…

1366 - Incorrect string value: ‘\xE5\xB9\xBF\xE5\x85\xB0...‘ for column编码错误

1366 - Incorrect string value: ‘\xE5\xB9\xBF\xE5\x85\xB0…’ for column ‘campus_name’ at row 1 > 查询时间: 0s 原因是数据库创建的时候使用的默认编码latin1&#xff0c;导致表和字段的编码格式都是这种编码&#xff0c;显然这种编码不支持中文。 自己修改了数据库…

肩胛骨筋膜炎怎么治疗最有效

肩胛后背疼痛是平时工作、生活中常见的一类症状&#xff0c;尤其现在随着工作方式和生活习惯的改变&#xff0c;长期伏案工作以及低头看电脑已经成为常态&#xff0c;所以肩胛后背痛出现的频率还是比较高的。常见的原因主要包括&#xff1a;肩胛后背的筋膜炎&#xff0c;最容易…

二叉树OJ练习题(C语言版)

目录 一、相同的树 二、单值二叉树 三、对称二叉树 四、树的遍历 前序遍历 中序遍历 后序遍历 五、另一颗树的子树 六、二叉树的遍历 七、翻转二叉树 八、平衡二叉树 一、相同的树 链接&#xff1a;100. 相同的树 - 力扣&#xff08;LeetCode&#xff09; bool isSameTree(…

社区治理进化史!拓世法宝化身“虚拟社工”,点亮智能社区的每一个角落

时光流转、技术猛进&#xff0c;社区不再只是在制度层面作为城市治理的最小单元&#xff0c;更是在民生层面成为政府联系、服务群众的“神经末梢”。城市的脚步越来越匆忙&#xff0c;人们对于社区的服务期待也愈发高涨。面对日益复杂的社区治理和服务需求&#xff0c;我们迫切…

蓝桥杯:分数

题目 思路 等比数列求和&#xff0c;手算然后输出 代码&#xff08;已过&#xff09; #include <iostream> using namespace std; int main() {// 请在此输入您的代码int a1024*1024-1;int b1024*512;cout<<a<<"/"<<b;return 0; }

eclipse的安装与配置详细教程(包括UML插件 汉化 JDK 代码补全 导入导出等)

Eclipse安装与配置详细教程 1.Eclipse安装与配置 1.将JDK与Eclipse这两个软件安装包放在一个文件夹下&#xff0c;方便之后安装使用。 2.安装JDK 在D&#xff1a;LeStoreDownload\Java文件夹下另外新建三个文件夹分别命名为java、jdk和eclipse&#xff08;分别用于Java、jdk…

关于unity中 编辑器相关逻辑的记录

prefab 在场景中 , 用这个方法可以获取它的磁盘路径: [MenuItem("Gq_Tools/↓获取prefab路径")] public static void SaveDecalParameters() { var objs Selection.objects; var obj objs[0] as GameObject; Object parentObject Prefab…

SAP 开发查找增强程序

参考文章https://blog.csdn.net/SAPmatinal/article/details/129987722?ops_request_misc%257B%2522request%255Fid%2522%253A%2522169949816116800225559526%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id16994981611680022555…

关于视频封装格式和视频编码格式的简介

文章目录 简介视频封装格式&#xff08;Video Container Format&#xff09;视频编码格式&#xff08;Video Compression Format&#xff09;两者关系总结webm 格式简介webm视频编码格式webm音频编码格式webm总结 简介 视频封装格式&#xff08;Video Container Format&#x…

2023年【起重机司机(限门式起重机)】新版试题及起重机司机(限门式起重机)找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 起重机司机(限门式起重机)新版试题考前必练&#xff01;安全生产模拟考试一点通每个月更新起重机司机(限门式起重机)找解析题目及答案&#xff01;多做几遍&#xff0c;其实通过起重机司机(限门式起重机)作业模拟考试…

另辟蹊径者 PoseiSwap:背靠潜力叙事,构建 DeFi 理想国

前不久&#xff0c;灰度在与 SEC 就关于 ETF 受理的诉讼案件中&#xff0c;以灰度胜诉告终。灰度的胜利&#xff0c;也被加密行业看做是加密 ETF 在北美地区阶段性的胜利&#xff0c; 该事件也带动了加密市场的新一轮复苏。 此前&#xff0c;Nason Smart Money 曾对加密市场在 …

大语言模型(LLM)综述(七):大语言模型设计应用与未来方向

A Survey of Large Language Models 前言8 A PRACTICAL GUIDEBOOK OF PROMPT DESIGN8.1 提示创建8.2 结果与分析 9 APPLICATIONS10 CONCLUSION AND FUTURE DIRECTIONS 前言 随着人工智能和机器学习领域的迅速发展&#xff0c;语言模型已经从简单的词袋模型&#xff08;Bag-of-…

攻防世界题目练习——Web引导模式(四)(持续更新)

题目目录 1. shrine2. very_easy_sql3. fakebook 1. shrine 打开网页题目内容如下&#xff1a; 是一段代码&#xff0c;我们把它还原一下&#xff1a; import flask import osapp flask.Flask(__name__) app.config[FLAG] os.environ.pop(FLAG) #这里应该是将config配置里…

Linux/centos上如何配置管理Web服务器?

Linux/centos上如何配置管理Web服务器&#xff1f; 1 Web简单了解2 关于Apache3 如何安装Apache服务器&#xff1f;3.1 Apache服务安装3.2 httpd服务的基本操作 4 如何配置Apache服务器&#xff1f;4.1 关于httpd.conf配置4.2 常用指令 5 简单实例 1 Web简单了解 Web服务器称为…

一篇文章带你全面了解智能地面水处理一体机

一、智能地面水处理一体机 1、设备外壳常规尺寸有&#xff1a;1630*760*560&#xff08;mm&#xff09;&#xff1b;1630*900*560&#xff08;mm&#xff09; 2、外壳有不锈钢、碳钢材质 二、产品构成&#xff08;电气控制柜雨水过滤、消毒处理机&#xff09; 1. 上半部为雨…

【慢SQL性能优化】 一条SQL的生命周期 | 京东物流技术团队

一、 一条简单SQL在MySQL执行过程 一张简单的图说明下&#xff0c;MySQL架构有哪些组件和组建间关系&#xff0c;接下来给大家用SQL语句分析 例如如下SQL语句 SELECT department_id FROM employee WHERE name Lucy AND age > 18 GROUP BY department_id其中name为索引&a…

k8s 目录和文件挂载到宿主机

k8s生产中常用的volumes挂载方式有&#xff1a;hostPath、pv&#xff0c;pvc、nfs 1.hostPath挂载 hostPath是将主机节点文件系统上的文件或目录挂载到Pod 中&#xff0c;同时pod中的目录或者文件也会实时存在宿主机上&#xff0c;如果pod删除&#xff0c;hostpath中的文…

线性代数 | 矩阵运算 加减 数乘 矩阵的幂运算

文章目录 1. 矩阵加减和数乘2.矩阵与矩阵的乘法2.1相乘条件&#xff1a;看中间&#xff0c;取两头2.2 相乘计算方法 3. 矩阵的幂3.1 观察归纳法3.2 邻项相消法3.3 化为对角 4.矩阵求逆&#xff08;除法&#xff09;4.1 判断是否可逆&#xff08;证明题或者要求求出逆矩阵&#…

centos 7部署Mysql8.0主从

Mysql官网中关于部署主从的网址 环境准备&#xff1a; 搭建虚拟机和安装Mysql之前的文章中已经涉及&#xff0c;在此不再赘述。 主从IPMysql账号密码主192.168.213.4root/Root1234!从192.168.213.5root/Root1234! 1、主数据库设置 配置my.cnf 一般存放于/etc/。 主从配…