【脑电分析系列】第19篇:深度学习方法(一):卷积神经网络(CNN)在EEG图像/时频图分类中的应用

摘要:

欢迎回到脑电分析系列!在前几篇中,我们探讨了EEG的预处理、特征提取和传统机器学习分类器。然而,面对EEG信号的复杂非线性模式和日益增长的数据量,深度学习 技术展现出更强大的潜力,尤其是其自动特征提取能力。

本篇博客作为深度学习在EEG分析应用的第一部分,将聚焦于卷积神经网络(Convolutional Neural Network, CNN) 。我们将深入探讨CNN如何将EEG信号处理为图像或时频图(如谱图)进行分类。内容涵盖CNN的核心原理、针对EEG数据优化的模型结构(如EEGNet、DeepConvNet ),以及CNN自动学习特征 的显著优势。本文结合理论、数学公式和Python代码示例 ,使用MNEPyTorch库,帮助你理解并实践CNN在癫痫检测、运动想象BCI和情感识别等任务中的应用。

关键词:

脑电分析, EEG, 深度学习, CNN, 卷积神经网络, 时频图, 谱图, EEGNet, 自动特征提取, PyTorch, 运动想象, 癫痫检测


引言:从手动到自动:CNN的变革性力量

传统的EEG分类流程高度依赖于手动特征工程,即研究人员需要凭借专业知识来设计和提取各种时域、频域或空间域特征。这种方法费时费力,且容易受到主观偏差的影响,可能无法充分捕捉EEG信号中蕴含的复杂非线性模式。

卷积神经网络(CNN)的出现,为EEG分析带来了革命性的变革。CNN能够直接从原始或预处理后的EEG数据(或其转换而来的图像表示)中自动学习具有判别力的层次化特征。这种**端到端(end-to-end)**的学习方式:

  • 减少了对人工特征工程的依赖:避免了繁琐的手动步骤和潜在的主观偏差。

  • 捕捉更复杂的模式:能够发现人眼或传统算法难以识别的深层、非线性特征。

  • 提升分类性能:在许多EEG分类任务中,CNN的准确率显著优于传统方法,如在运动想象任务中可达95%以上。

本篇将深入剖析CNN的魅力,并展示其在EEG领域的强大应用。

一、 CNN的核心原理及其在EEG中的适应性

1.1 定义与基本结构

CNN是一种专门设计用于处理网格状数据 (如图像、时间序列)的前馈神经网络。其核心思想是通过局部连接权重共享来高效提取数据的局部模式,并构建层次化的特征表示。

核心组件包括:

  • 卷积层(Convolutional Layer)

    • 功能:应用可学习的**卷积核(filter)**在输入数据上进行滑动,计算点积,从而提取局部特征(如图像中的边缘、纹理,EEG时频图中的特定频率模式)。

    • 公式:输出特征图 ( O_{i,j} = \sum_{m,n} I_{i+m,j+n} \cdot K_{m,n} + b ),其中 ( I ) 为输入,( K ) 为卷积核,( b ) 为偏置。

  • 激活函数(Activation Function):如ReLU(( f(x) = \max(0, x) )),引入非线性,使网络能够学习更复杂的映射关系。

  • 池化层(Pooling Layer) :如最大池化(Max Pooling)或平均池化(Average Pooling),用于下采样(减少维度),降低计算复杂度的同时,保留最重要的特征,并增强模型的平移不变性。

  • 全连接层(Fully Connected Layer) :在提取完高层特征后,将特征展平,连接到全连接层进行最终的分类,通常末端使用Softmax函数输出类别概率。

1.2 CNN在EEG中的适应性:将EEG视为"图像"

EEG信号具有多通道、时间序列的特性,并非标准的2D图像。然而,CNN可以通过以下几种方式适应EEG数据:

  1. 直接作为2D输入 :将EEG数据组织成(通道数 × 时间点)的2D矩阵,类似于灰度图像,直接输入到2D CNN中。

  2. 时频图表示 :这是CNN在EEG中非常常见的应用方式。通过时频分析 方法(如短时傅里叶变换STFT、连续小波变换CWT、小波包变换WPT)将原始EEG信号转换为时频图(Spectrogram)

    • CWT公式:( \psi(t) = \frac{1}{\sqrt{s}} \int x(t) \overline{\psi(\frac{t-\tau}{s})} dt ),其中 ( x(t) ) 是原始信号,( \psi ) 是小波基函数,( s ) 是尺度因子,( \tau ) 是平移因子。CWT能够生成在时间和频率上都有良好局部化特性的时频图。

    • 这些时频图可以被视为2D图像(例如,频率 × 时间),每一通道一张图,或将所有通道的时频图堆叠成多通道图像,然后输入到2D CNN进行处理。

  3. 1D卷积处理:直接在时间序列维度上使用1D卷积,捕捉时间上的局部模式(类似滤波器)。

CNN在EEG时频图中能够自动捕捉特定的频带模式 (如alpha、beta波段的能量变化)及其在时间上的动态演变,这模拟了传统滤波器组(Filter Bank)和共同空间模式(CSP)等方法的优势,但以端到端的方式自动学习这些滤波器和空间模式。

CNN在EEG分类中的优缺点表

优点 缺点
自动特征提取,减少人工偏差 需要大量标注数据,可能易过拟合
学习层次化复杂模式 计算密集,训练时间较长
时空结构敏感 黑箱性强,解释性相对较差
泛化能力强 难以处理长时依赖(对RNN有利)

二、 适用于EEG数据的模型结构

EEG数据具有多通道、非平稳、个体差异大的特点,因此需要设计或选择紧凑且高效的CNN模型。以下是几种经典的EEG-CNN架构:

2.1 EEGNet:紧凑高效的EEG专用CNN

特点 :EEGNet是由Lawhern等人于2018年提出的一种紧凑型CNN架构 ,专门为各种EEG范式(如P300、ERN、运动想象SMR、MRCP)设计。其核心思想是利用深度可分离卷积(Depthwise Separable Convolutions)大幅减少模型参数量(通常只有几千个参数,远少于传统CNN的数十万个),从而在数据量有限的情况下也能取得良好的性能,并减少过拟合。

结构(简化版)

  • Block 1 (时间特征提取)

    • 常规卷积:在时间维度进行1D卷积,学习频率滤波器(类似带通滤波)。

    • 深度卷积(Depthwise Convolution):对每个通道独立进行卷积,学习通道特定的空间滤波器。

    • 批量归一化 (BatchNorm)、ELU激活函数、平均池化和Dropout。

  • Block 2 (空间特征提取)

    • 可分离卷积:由深度卷积和1x1点卷积组成,进一步提取高级空间-时间特征。

    • 批量归一化、ELU激活函数、平均池化和Dropout。

  • 分类层:全连接层(Linear Layer)和Softmax输出最终分类概率。

参数F1(第一层时间滤波器的数量),D(深度乘子),F2 = D*F1(第二层可分离卷积的输出通道数)。

Python示例:EEGNet实现(PyTorch)

Python

复制代码
import torch
import torch.nn as nn
import torch.nn.functional as F

class EEGNet(nn.Module):
    def __init__(self, num_classes, chans, samples, dropoutRate=0.5, kernLength=64, F1=8, D=2, F2=16):
        super(EEGNet, self).__init__()
        self.chans = chans
        self.samples = samples
        self.F1 = F1
        self.D = D
        self.F2 = F2
        self.dropoutRate = dropoutRate

        # Block 1
        self.conv1 = nn.Conv2d(1, F1, (1, kernLength), padding=(0, kernLength // 2), bias=False)
        self.batchnorm1 = nn.BatchNorm2d(F1)
        
        # Depthwise Conv
        self.depthwiseConv = nn.Conv2d(F1, F1 * D, (chans, 1), groups=F1, bias=False)
        self.batchnorm2 = nn.BatchNorm2d(F1 * D)
        self.elu1 = nn.ELU()
        self.avgpool1 = nn.AvgPool2d((1, 4))
        self.dropout1 = nn.Dropout(dropoutRate)

        # Block 2
        self.separableConv = nn.Sequential(
            nn.Conv2d(F1 * D, F1 * D, (1, 16), padding=(0, 16 // 2), groups=F1 * D, bias=False),
            nn.Conv2d(F1 * D, F2, (1, 1), bias=False) # Pointwise Conv
        )
        self.batchnorm3 = nn.BatchNorm2d(F2)
        self.elu2 = nn.ELU()
        self.avgpool2 = nn.AvgPool2d((1, 8))
        self.dropout2 = nn.Dropout(dropoutRate)

        # Classifier
        # 计算全连接层输入维度
        # block1输出后时间维度: samples // 4
        # block2输出后时间维度: (samples // 4) // 8 = samples // 32
        # 所以最终展平的维度是 F2 * (samples // 32)
        self.classifier = nn.Linear(F2 * (samples // 32), num_classes)

    def forward(self, x):
        # x 形状: (batch_size, channels, samples)
        # 添加一个维度使其成为 (batch_size, 1, channels, samples) 适应2D卷积
        x = x.unsqueeze(1) 

        # Block 1
        x = self.conv1(x) 
        x = self.batchnorm1(x)
        x = self.depthwiseConv(x)
        x = self.batchnorm2(x)
        x = self.elu1(x)
        x = self.avgpool1(x)
        x = self.dropout1(x)

        # Block 2
        x = self.separableConv(x)
        x = self.batchnorm3(x)
        x = self.elu2(x)
        x = self.avgpool2(x)
        x = self.dropout2(x)

        # Flatten and classify
        x = x.view(x.size(0), -1)
        x = self.classifier(x)
        return x

# 示例使用:假设3个类别,64个通道,128个时间点
# model = EEGNet(num_classes=3, chans=64, samples=128)
# print(model)
2.2 其他经典CNN架构
  • DeepConvNet:由Schirrmeister等人提出,包含多个卷积-最大池化块,以深度和时间-空间特征提取为特点,通常使用ELU激活函数。适用于通用EEG特征提取,在运动想象任务中表现良好。

  • ShallowConvNet:同样由Schirrmeister等人提出,结构更浅,旨在模拟滤波器组共同空间模式(FBCSP),主要提取频带功率特征。

  • HiRENet:一种结合了希尔伯特变换和原始EEG的多模态输入网络,能够处理更丰富的EEG信息,提升运动想象分类准确率。

EEG-CNN模型比较表

模型 参数量 结构亮点 适用场景 典型准确率
EEGNet 低(~1k) 深度可分离卷积,紧凑 P300, ERN, SMR等多范式BCI 82-98%
DeepConvNet 多层卷积-池化,时间后空间卷积 运动想象BCI 84%
ShallowConvNet 浅层结构,模拟FBCSP,提取带功率特征 带功率主导的分类任务 82%
HiRENet 希尔伯特变换+原始EEG,多模态输入 运动想象分类 90%+

三、 CNN的杀手锏:自动特征提取

CNN最显著的优势在于其端到端自动特征提取能力,彻底改变了EEG分析的范式。

3.1 过程解析
  1. 输入表示:将原始EEG数据转换成CNN能够处理的"图像"形式。这包括:

    • 将原始EEG信号直接塑造成(通道数 × 时间点)的2D矩阵。

    • 通过STFT或CWT等方法生成时频图 (例如,(频率 × 时间)),每一通道一张,或将所有通道的时频图堆叠起来。

  2. 层次化学习

    • 浅层卷积核 :学习低级、局部的特征,如时频图中的特定频率边缘 、时间序列中的短时节律 。在EEG中,这类似于自动学习了带通滤波器

    • 深层卷积核 :将这些低级特征组合起来,学习更抽象、更高级的表示,如特定频段的功率变化不同通道间的空间同步模式 。这类似于自动学习了空间滤波器(如CSP)

    • 通过多层堆叠和池化操作,网络能够构建出鲁棒且具有判别力的高级特征表示。

3.2 自动特征提取的优势
  • 减少人工偏差:避免了手动特征工程的主观性和繁琐性,确保了分析的客观性。

  • 捕捉隐藏模式:能够发现传统方法难以捕捉的复杂非线性模式和交互作用。

  • 提升泛化能力:学习到的特征通常具有更好的泛化能力,即使面对新的、未见过的数据也能保持良好性能。

  • 分类性能提升:研究表明,CNN在BCI任务中相比传统FBCSP等方法,中位准确率可提升5.4%甚至更多。

Python示例:时频图生成与简单CNN分类(PyTorch)

Python

复制代码
import mne
import torch
import torch.nn as nn
import torch.nn.functional as F
from mne.time_frequency import tfr_morlet
from mne.datasets import sample
import numpy as np

# 1. 加载并预处理EEG数据 (沿用之前的epochs和y)
data_path = sample.data_path()
raw = mne.io.read_raw_fif(data_path / 'MEG' / 'sample' / 'sample_audvis_raw.fif', preload=True)
raw.pick_types(eeg=True)
raw.filter(0.5, 40, fir_design='firwin')
events = mne.make_fixed_length_events(raw, duration=2.0)
epochs = mne.Epochs(raw, events, tmin=0, tmax=2, preload=True, baseline=(None, 0))
n_epochs = len(epochs)
y = torch.tensor(np.random.randint(0, 3, n_epochs), dtype=torch.long) # 模拟3分类标签

# 2. 生成时频图(Morlet小波)
freqs = np.logspace(*np.log10([8, 30]), num=20)  # α到β波段,生成20个频率点
tfr = tfr_morlet(epochs, freqs=freqs, n_cycles=4.0, return_itc=False, average=False)
tfr_data_np = tfr.data  # 形状: (epochs, channels, freqs, times)

# 将NumPy数组转换为PyTorch张量
tfr_data_tensor = torch.tensor(tfr_data_np, dtype=torch.float32)

# 3. 定义一个简单的2D CNN模型来处理时频图
class SimpleTFRCNN(nn.Module):
    def __init__(self, num_classes, num_channels, num_freqs, num_times):
        super(SimpleTFRCNN, self).__init__()
        # 假设我们将 (channels, freqs, times) 视为 (in_channels, height, width)
        # 这里我们将每个通道的时频图视为独立输入,然后通过一个1x1卷积来融合通道信息
        # 简化处理,直接将 (channels * freqs) 视为高度,times为宽度
        # 或者更合理地,将 (channels, freqs, times) 视为一个3D张量,用3D卷积
        # 但为了演示2D CNN,我们可以将channels维度视为batch的一部分或直接在freqs-times维度上操作
        
        # 简单演示,将(channels, freqs)展平为一个特征维度,times为另一个维度
        # 或者更直观地,我们可以为每个通道单独跑CNN,然后将结果聚合
        # 这里我们考虑将 (epochs, channels, freqs, times) reshape为 (epochs * channels, 1, freqs, times)
        # 然后在全连接层前聚合,或者直接用3D ConvNet
        
        # 为了简洁和符合常见的2D CNN输入,我们假设输入是 (batch, 1, freqs, times)
        # 也就是处理每个通道的时频图,如果需要融合所有通道,可以后续操作
        
        # 更实际的做法是将 (epochs, channels, freqs, times) 转化为 (epochs, in_channels=channels, height=freqs, width=times)
        # 或者将 (epochs, 1, channels*freqs, times)
        
        # 这里为了简化,我们假设输入x的形状是 (batch_size, num_channels, num_freqs, num_times)
        # 我们对每个通道的时频图单独处理,然后聚合
        
        self.conv1 = nn.Conv2d(num_channels, 32, kernel_size=(3, 3), padding=1) # 对每个通道的时频图进行卷积,输出32个特征图
        self.pool = nn.MaxPool2d(kernel_size=(2, 2))
        self.conv2 = nn.Conv2d(32, 64, kernel_size=(3, 3), padding=1)
        
        # 计算经过两次池化后的维度
        pooled_freqs = num_freqs // 4
        pooled_times = num_times // 4
        
        self.fc1 = nn.Linear(64 * pooled_freqs * pooled_times, 128)
        self.fc2 = nn.Linear(128, num_classes)

    def forward(self, x):
        # x 形状: (batch_size, num_channels, num_freqs, num_times)
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        
        x = x.view(x.size(0), -1) # Flatten
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return x

# 示例使用:假设3个类别,num_channels, num_freqs, num_times 从tfr_data_tensor中获取
batch_size, num_channels, num_freqs, num_times = tfr_data_tensor.shape
simple_cnn_model = SimpleTFRCNN(num_classes=3, num_channels=num_channels, num_freqs=num_freqs, num_times=num_times)
print(simple_cnn_model)

# 模拟输入 (batch_size, channels, freqs, times)
# dummy_input = tfr_data_tensor[0:10] # 取前10个epochs作为batch
# output = simple_cnn_model(dummy_input)
# print(f"CNN输出形状: {output.shape}")

注意 :上述SimpleTFRCNNforward函数和初始化中的维度计算,是为了演示目的的简化处理。实际中,多通道时频图的CNN处理可能需要更复杂的3D卷积 ,或者将通道维度与频率/时间维度合并后使用2D卷积,或者采用多分支网络对不同通道进行独立处理后再聚合。EEGNet正是通过巧妙的深度可分离卷积来高效处理这些多通道特征。

四、 CNN在EEG分类中的实际应用与性能

CNN已在多个EEG应用中取得显著成功:

  • 癫痫检测与预测 :通过将原始EEG信号或其时频图输入CNN,模型能够学习区分正常脑活动与癫痫发作或发作前兆的模式。例如,使用SST-based CNN对时频图像进行分类,准确率可达98%

  • 运动想象(Motor Imagery, MI)BCI:在BCI领域,MI任务的目的是让用户通过想象运动来控制外部设备。EEGNet等模型在MI分类中表现出色,跨主体准确率通常在**82-98%**之间,显著优于传统的FBCSP方法。

  • 情感识别 :通过分析EEG信号中与情绪相关的模式,CNN能够对不同情感状态进行分类。例如,利用时频图作为输入,CNN在情感识别任务中的准确率可达93%

  • 睡眠分期:CNN能够自动识别不同睡眠阶段(如REM、NREM)的EEG特征,辅助睡眠障碍的诊断。

CNN在不同EEG应用中的性能总结表

应用 CNN变体 输入类型 典型准确率 优势
癫痫检测 SST-CNN / 2D CNN 时频图像 98% 对噪声鲁棒,自动捕捉癫痫特征
运动想象BCI EEGNet / DeepConvNet 原始/时频 82-98% 泛化强,参数少,适应多范式
情感识别 2D CNN 谱图/时频图 93% 捕捉复杂情感模式
睡眠分期 1D/2D CNN 原始EEG/时频 80-90%+ 自动学习睡眠阶段特有生物标志物

挑战与未来展望 :尽管CNN表现出色,但仍面临挑战,如对大规模高质量标注数据的依赖、模型解释性不足、以及如何更好地处理EEG的长时依赖性 。未来的研究方向包括:结合迁移学习 以应对小样本问题、开发更具解释性的CNN模型、以及探索CNN与其他深度学习模型(如RNN/Transformer)的混合架构,以捕捉EEG数据的多尺度、多模态信息。

结论:CNN --- 开启EEG智能分析新纪元

本篇博客全面阐述了卷积神经网络(CNN)在EEG图像/时频图分类中的应用。我们深入理解了CNN的核心原理,学习了EEGNet等专门为EEG设计的紧凑高效模型,并见证了CNN在自动特征提取方面的变革性力量。从癫痫检测到BCI控制,再到情感识别,CNN已经显著提升了EEG分析的准确性和自动化水平。

CNN通过将EEG视为"图像",并利用其强大的局部模式识别和层次化特征学习能力,成功克服了传统手动特征工程的局限。它为我们提供了一个端到端的解决方案,使得从复杂的脑电信号中提取有意义的生物标志物和认知状态成为可能。

在实践中,成功的CNN应用离不开仔细的数据预处理合理的输入表示 (特别是时频图的生成),以及对模型架构和超参数的精心调优。随着深度学习技术的不断发展,CNN将继续在EEG研究和临床应用中发挥关键作用,开启EEG智能分析的新纪元。

下期预告:

【脑电分析系列】第20篇:深度学习方法(二):循环神经网络(RNN)与长短期记忆网络(LSTM)在EEG序列分析中的优势

相关推荐
极度畅想9 小时前
【脑电分析系列】第25篇:情绪识别与认知研究中的EEG应用:一个完整的实验设计与数据分析流程
情绪识别·eeg·功率谱·多模态融合·神经科学·脑电分析·行为学
蒋星熠11 天前
深度学习实战指南:从神经网络基础到模型优化的完整攻略
人工智能·python·深度学习·神经网络·机器学习·卷积神经网络·transformer
猫天意15 天前
【CVPR2023】奔跑而非行走:追求更高FLOPS以实现更快神经网络
人工智能·深度学习·神经网络·算法·机器学习·卷积神经网络
淬炼之火22 天前
笔记:深层卷积神经网络(CNN)中的有效感受野简单推导
笔记·cnn·卷积神经网络
山烛1 个月前
深度学习:卷积神经网络(CNN)
图像处理·人工智能·python·深度学习·cnn·卷积神经网络
数据饕餮1 个月前
PyTorch 深度学习实战教程-番外篇04:卷积层详解与实战指南
人工智能·pytorch·深度学习·卷积神经网络
旧时光巷2 个月前
【机器学习③】 | CNN篇
人工智能·pytorch·python·机器学习·cnn·卷积神经网络·lenet-5
martian6652 个月前
深度学习核心:卷积神经网络 - 原理、实现及在医学影像领域的应用
人工智能·深度学习·机器学习·cnn·卷积神经网络·dicom医学影像
zzc9212 个月前
多信号实采数据加噪版本
matlab·usrp·高斯·gauss·时频图·多信号·实采信号