使用Transformer训练和测试EEG的公开SEED数据集

下面所有博客是个人对EEG脑电的探索,项目代码是早期版本不完整,需要完整项目代码和资料请私聊。


主要内容:
1、在EEG(脑电)项目中,使用图神经网络对脑电进行处理,具体包括baseline的GCN图架构、复现baseline论文的RGNN架构、注意力机制图架构、Transformer图架构、注重效率的simple图架构等,进行实验和对比。
2、学习图神经网络相关的资料。是学习图神经网络的一个完整项目;



数据集
1、脑电项目探索和实现(EEG) (上):研究数据集选取和介绍SEED
相关论文阅读分析:
1、EEG-SEED数据集作者的—基线论文阅读和分析
2、图神经网络EEG论文阅读和分析:《EEG-Based Emotion Recognition Using Regularized Graph Neural Networks》
3、EEG-GNN论文阅读和分析:《EEG Emotion Recognition Using Dynamical Graph Convolutional Neural Networks》
4、论文阅读和分析:Masked Label Prediction: Unified Message Passing Model for Semi-Supervised Classification
5、论文阅读和分析:《DeepGCNs: Can GCNs Go as Deep as CNNs?》
6、论文阅读和分析: “How Attentive are Graph Attention Networks?”
7、论文阅读和分析:Simplifying Graph Convolutional Networks

8、论文阅读和分析:LightGCN: Simplifying and Powering Graph Convolution Network for Recommendation
9、图神经网络汇总和总结
相关实验和代码实现:
1、用于图神经网络的脑电数据处理实现_图神经网络 脑电
2、使用GCN训练和测试EEG的公开SEED数据集
3、使用GAT训练和测试EEG公开的SEED数据集
4、使用SGC训练和测试SEED数据集
5、使用Transformer训练和测试EEG的公开SEED数据集_eeg transformer
6、使用RGNN训练和测试EEG公开的SEED数据集
辅助学习资料:
1、官网三个简单Graph示例说明三种层次的应用_graph 简单示例
2、PPI数据集示例项目学习图神经网络
3、geometric库的数据处理详解
4、NetworkX的dicts of dicts以及解决Seven Bridges of Königsberg问题
5、geometric源码阅读和分析:MessagePassin类详解和使用
6、cora数据集示例项目学习图神经网络
7、Graph 聚合
8、QM9数据集示例项目学习图神经网络
9、处理图的开源库

部分代码如下:

# -*- coding: utf-8 -*-
#
# Copyright (C) 2022 Emperor_Yang, Inc. All Rights Reserved 
#
# @CreateTime    : 2023/2/9 22:15
# @Author        : Emperor_Yang 
# @File          : ECG_Transformer.py
# @Software      : PyCharm


import torch
import torch.nn.functional as F
from easydict import EasyDict
from torch_geometric.nn import TransformerConv, global_add_pool
from torch_geometric.data import DataLoader
from data_process.seed_loader_gnn_memory import SeedGnnMemoryDataset

config = EasyDict()
config.learn_rate = 0.01
config.epoch = 5
config.note_feature_dim = 5
config.note_num = 62
config.hidden_channels = 16
config.class_num = 3
config.hidden_layers = 2
config.head_num = 2
config.batch_size = 16
config.max_loss_increase_time = 3


class EEG_TransformerConv(torch.nn.Module):
    """
    GCN handle ECG
    """

    def __init__(self, in_channels, hidden_channels, out_channels):
        super(EEG_TransformerConv, self).__init__()

        self.conv_s = torch.nn.ModuleList()
        # output dim is heads * out_channel
        self.conv_s.append(TransformerConv(in_channels, hidden_channels, config.head_num, dropout=0.6))
        for i in range(config.hidden_layers - 1):
            self.conv_s.append(TransformerConv(hidden_channels * config.head_num, hidden_channels, config.head_num, dropout=0.6))

        self.fc1 = torch.nn.Linear(hidden_channels * config.head_num, out_channels)

    def forward(self, x, edge_index, index, edge_weight=None):
        """
        forward
        :param index:
        :param x:note feature
        :param edge_index:edge pair
        :param edge_weight: edge feature
        :return:
        """
        for conv in self.conv_s:
            x = conv(x, edge_index, edge_weight).relu()
        x = global_add_pool(x, index)
        x = self.fc1(x)
        return x


model = EEG_TransformerConv(config.note_feature_dim, config.hidden_channels, config.class_num)
data_set = SeedGnnMemoryDataset(root='../data/SEED/', processed_file='1_20131027.pt')
train_data_set = data_set[: int(0.8 * data_set.len())]
test_data_set = data_set[int(0.8 * data_set.len()):]
train_data_loader = DataLoader(train_data_set, batch_size=config.batch_size, shuffle=True)
test_data_loader = DataLoader(test_data_set, batch_size=config.batch_size, shuffle=False)
optimizer = torch.optim.Adam(model.parameters(), lr=config.learn_rate)
criterion = torch.nn.CrossEntropyLoss()


def train():
    loss_sum = 0
    data_size = 0
    for mini_batch in train_data_loader:
        if mini_batch.num_graphs == config.batch_size:
            data_size += mini_batch.num_graphs
            model.train()
            optimizer.zero_grad()
            out = model(mini_batch.x, mini_batch.edge_index, mini_batch.batch)
            loss = criterion(out, mini_batch.y)
            loss.backward()
            optimizer.step()
            loss_sum += loss.item() / mini_batch.num_graphs
    return loss_sum / data_size


def test():
    count = 0
    data_size = 0
    for mini_batch in test_data_loader:
        if mini_batch.num_graphs == config.batch_size:
            out = model(mini_batch.x, mini_batch.edge_index, mini_batch.batch)
            predict = torch.argmax(out, dim=1)
            count += int(predict.eq(mini_batch.y).sum())
            data_size += mini_batch.num_graphs
    print("Test Accuracy:{}%".format(count / data_size * 100))


if __name__ == '__main__':
    loss_increase_time = 0
    last_lost = 1
    for epoch in range(config.epoch):
        avg_loss = train()
        print("epoch:{}, loss:{}".format(epoch+1, avg_loss))
        if avg_loss > last_lost:
            loss_increase_time += 1
        else:
            last_lost = avg_loss
        # 如果连续增加loss大于config.max_loss_increase_time,则停止训练
        if loss_increase_time > config.max_loss_increase_time:
            break
    test()

GAT(Graph Attention Network)结合LSTM(长短时记忆网络)用于处理脑电信号(EEG)是一种深度学习策略,主要用于分析理解复杂的时间序列数据,如脑电图信号中的模式。这种组合利用了GAT的节点自注意力机制来捕获局部特征,而LSTM则提供对长期依赖的有效建模。 在Python中,特别是使用PyTorch或TensorFlow库,处理这样的数据通常会涉及以下步骤: 1. **数据预处理**: - 将EEG信号转换成适合神经网络输入的形式,例如将其归一化或减小尺度。 - 构建邻接矩阵,表示脑电极间的连接关系或相似度,可以基于空间距离、生理连接等信息。 ```python import numpy as np from torch_geometric.data import Data # 假设eeg_data是 EEG 数据数组,adj_matrix是邻接矩阵 data = Data(x=np.expand_dims(eeg_data, axis=-1), edge_index=torch.tensor(adj_matrix)) ``` 2. **构建模型**: 使用`torch.nn.Module`来定义一个GAT-LSTM模块,其中包含GAT层捕获节点特征,然后传递给LSTM层处理时间序列。 ```python class GAT_LSTM(nn.Module): def __init__(self, num_features, num_heads, hidden_size, num_layers): super(GAT_LSTM, self).__init__() self.gat = GraphAttentionLayer(num_features, num_heads) self.lstm = nn.LSTM(hidden_size * num_heads, hidden_size, num_layers) def forward(self, data): x = self.gat(data.x, data.edge_index) x, _ = self.lstm(x.unsqueeze(0)) # LSTM expects a batch dimension return x[-1] # 返回最后一个时间步的隐藏状态 model = GAT_LSTM(num_features, num_heads, hidden_size, num_layers) ``` 3. **训练与评估**: - 定义损失函数优化器。 - 使用`model.train()``model.eval()`模式进行训练验证。 ```python optimizer = optim.Adam(model.parameters()) loss_fn = nn.CrossEntropyLoss() # 如果是分类任务 for epoch in range(num_epochs): optimizer.zero_grad() output = model(data) loss = loss_fn(output, labels) # 假设labels是对应的真实标签 loss.backward() optimizer.step() # 测试阶段 with torch.no_grad(): predictions = model(data).argmax(dim=1) ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KPer_Yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值