当前位置: 首页> 科技> 名企 > 东莞网站建设公司服务平台_北京企业名录一览表_全网整合营销推广系统_百度排行榜小说

东莞网站建设公司服务平台_北京企业名录一览表_全网整合营销推广系统_百度排行榜小说

时间:2025/7/11 18:27:14来源:https://blog.csdn.net/SashiMoore/article/details/143988175 浏览次数:0次
东莞网站建设公司服务平台_北京企业名录一览表_全网整合营销推广系统_百度排行榜小说

2024/11/24-2024/11/ :
为了毕设的开题答辩下了个运动想象的数据集,这几天抽空处理一下,顺便记录一下处理过程。
数据集下载位置(官方那没找到.mat格式的数据集)
官方:BCI competition IV 2b
飞桨:BCI competition IV 2b
reference
[1]BCI比赛数据集简介-BCI competition IV 2b
[2]代码部分参考:BCI Competition IV 2a数据集.gdf文件读取与预处理

目录

  • 一、项目依赖
  • 二、数据集信息
  • 三、数据提取
    • 3.1 数据提取函数编写
    • 3.2 dataloader类

一、项目依赖

import os
import mne
import torch
import numpy as np
import matplotlib.pyplot as plt
import torch.utils.data.dataset as Dataset
# 设置环境变量避免库冲突
os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'# 设置seed
seed = 42
np.random.seed(seed)
torch.manual_seed(seed)# cuda
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

  部分库版本:

numpy: 1.23.4
torch: 2.0.0+cu117
mne: 1.3.1
matplotlib: 3.7.1
cuda:11.7

二、数据集信息

  在reference中数据集的基本信息应该很清楚了,且飞桨和官方都可以下载关于数据集的英文说明。这里稍微梳理一下关于数据集的重点信息,实验设置及环境等略去不谈,只讲重点:

def check_data_info(file_path, img_save=False, img_dir='./img'):# 读取gdf文件,exclude参数排除三个EOG通道raw_gdf = mne.io.read_raw_gdf(file_path, stim_channel="auto", verbose='ERROR',exclude=(["EOG:ch01", "EOG:ch02", "EOG:ch03"]))print(raw_gdf.info)# Pre-load the dataraw_gdf.load_data()# correct nan valuesdata = raw_gdf.get_data()for i_chan in range(data.shape[0]):  # 遍历 channel# 将数组中的所有值设置为nan,然后将这些NaN值替换为该数组的均值。this_chan = data[i_chan]data[i_chan] = np.where(this_chan == np.min(this_chan), np.nan, this_chan)mask = np.isnan(data[i_chan])chan_mean = np.nanmean(data[i_chan])data[i_chan, mask] = chan_mean# 获取事件时间位置,返回事件和事件下标events, events_id = mne.events_from_annotations(raw_gdf)# 主要需要注意的事件即MI数据:769, 770分别为左手、右手print('Number of events:', len(events))print(events_id)print(events.shape)# 利用mne.io.RawArray类重新创建Raw对象,已经没有nan数据了raw_gdf = mne.io.RawArray(data, raw_gdf.info, verbose="ERROR")print(raw_gdf.info)# 画出EEG通道图raw_gdf.plot()# 存储图像if img_save:if not os.path.exists(img_dir):os.makedirs(img_dir)plt.savefig(os.path.join(img_dir, 'EEG_channel.png'))plt.show()

  上面就是我们用来查看数据的代码[2],展示一下比较重要的信息:

<Info | 7 non-empty values
bads: [] # 坏导为0
ch_names: EEG:C3, EEG:Cz, EEG:C4 # 去除三个EOG通道后还剩下3个EEG通道
chs: 3 EEG
custom_ref_applied: False
highpass: 0.0 Hz
lowpass: 125.0 Hz # 带通滤波器设置范围
meas_date: 2005-10-25 09:35:11 UTC # 数据集采集时间
nchan: 3
projs: []
sfreq: 250.0 Hz> # 采样频率250hz

Reading 0 … 604802 = 0.000 … 2419.208 secs…
Used Annotations descriptions: [‘1023’, ‘1077’, ‘1078’, ‘1079’, ‘1081’, ‘276’, ‘277’, ‘32766’, ‘768’, ‘769’, ‘770’] # 事件类型,可理解为label
Number of events: 271 # 事件总数量
{‘1023’: 1, ‘1077’: 2, ‘1078’: 3, ‘1079’: 4, ‘1081’: 5, ‘276’: 6, ‘277’: 7, ‘32766’: 8, ‘768’: 9, ‘769’: 10, ‘770’: 11} # 每类事件的数量
(271, 3)
<Info | 7 non-empty values
bads: []
ch_names: EEG:C3, EEG:Cz, EEG:C4 # 通道名称

  函数绘制图像如下:
2通道MIEEG数据
  上面打印的信息基本很清楚了,over。

三、数据提取

3.1 数据提取函数编写

  与BCI competition IV 2a不同的是,BCI competition IV 2b是一个二分类的数据集,所以我们在这做了相应的处理:

# 读取指定路径下的文件数据
def load_data_BCICIV_2b_gdf(root_dir):# 打开文件夹files = os.listdir(root_dir)for file in files:file_path = os.path.join(root_dir, file)# 读取gdf文件raw_gdf = mne.io.read_raw_gdf(file_path, stim_channel="auto", verbose='ERROR',exclude=(["EOG:ch01", "EOG:ch02", "EOG:ch03"]))raw_gdf.load_data()data = raw_gdf.get_data()for i_chan in range(data.shape[0]):  # 遍历channels# 将数组中的所有值设置为nan,然后将这些NaN值替换为该数组的均值。this_chan = data[i_chan]data[i_chan] = np.where(this_chan == np.min(this_chan), np.nan, this_chan)mask = np.isnan(data[i_chan])chan_mean = np.nanmean(data[i_chan])data[i_chan, mask] = chan_mean# 获取事件时间位置,返回事件和事件下标events, events_id = mne.events_from_annotations(raw_gdf)# 利用mne.io.RawArray类重新创建Raw对象,已经没有nan数据了raw_gdf = mne.io.RawArray(data, raw_gdf.info, verbose="ERROR")# 选择范围为Cue后 1s - 4s 的数据tmin, tmax = 1., 4.# 二分类 MI 对应的 events_idevent_id = dict({'769': 10, '770': 11})epochs = mne.Epochs(raw_gdf, events, event_id, tmin, tmax, proj=True, baseline=None, preload=True, verbose=False)print(epochs)label_transfer = {10: 0, 11: 1}# 切片,获取 events 的最后一列labels = epochs.events[:, -1]# 将labels转化为0和1labels = np.array([label_transfer[label] for label in labels])# Get all epochs as a 3D array.data = epochs.get_data()# 测试阶段暂且只加载一份数据return data, labels

  除了对epoch的处理,其他基本与上一个章节相同,接下来看下部分数据的shape以及其他相关信息:

<Epochs | 120 events (all good), 1 - 4 sec, baseline off, ~2.1 MB,
data loaded, ‘769’: 60 ‘770’: 60>

data.shape:
(120, 3, 751)
labels:
[0 1 0 1 1 1 1 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 1 1 1
0 1 1 0 1 0 0 0 0 1 1 1 1 0 0 1 1 0 1 1 1 0 0 1 0 0 0 1 1 0 1 1 0 0 0
1 1 1 1 1 0 0 0 0 1 0 0 1 0 1 1 0 0 1 1 1 1 1 0 0 0 1 0 1 0 0 1 1 1 0
0 1 0 0 0 1 0 1 0 1 0 1 0 1 1]

  可以看到我们获取了两个事件各60份数据以及相关的label。

3.2 dataloader类

  之前一直在逃避使用规范的数据集构建方式,直接塞进模型完事。今天用一下规范的dataloader来做这次的任务:

class EEGDataset(Dataset.Dataset):def __init__(self, Data, Label):# 将数据转化为tensorself.Data = torch.Tensor(Data)self.Label = torch.Tensor(Label)def __len__(self):return len(self.Data)def __getitem__(self, index):data = torch.Tensor(self.Data[index])label = torch.Tensor(self.Label[index])return data, label# 构造数据集dataset = EEGDataset(data, labels)dataloader = DataLoader(dataset, batch_size=16, shuffle=True)print(dataset)print('dataset大小为:', dataset.__len__())print(dataset.__getitem__(0))print(dataset[0])

  在构造数据集之后,我们print一下验证是否工作正常:

<main.EEGDataset object at 0x000001F57B006700>

dataset大小为: 120 (tensor([[-9.0944e-07, 1.6907e-06, 2.0386e-06, …,
5.4658e-06,
4.6265e-06, 3.9246e-06],
[-2.6184e-06, -1.1017e-06, -1.0437e-06, …, 7.4617e-06,
4.4495e-06, 3.5950e-06],
[ 1.1872e-06, 2.6123e-06, 2.6581e-06, …, -2.8290e-06,
-3.4791e-06, -2.9603e-06]]), tensor(0.))
(tensor([[-9.0944e-07, 1.6907e-06, 2.0386e-06, …, 5.4658e-06,
4.6265e-06, 3.9246e-06],
[-2.6184e-06, -1.1017e-06, -1.0437e-06, …, 7.4617e-06,
4.4495e-06, 3.5950e-06],
[ 1.1872e-06, 2.6123e-06, 2.6581e-06, …, -2.8290e-06,
-3.4791e-06, -2.9603e-06]]), tensor(0.))

  任务基本完成,比起实验室里那种没啥信息的数据集,这种公开的数据集好处理很多,但是很久没做EEG有点生疏了。这个星期剩下的时间应该是复现一下优秀论文的实验,做的快的话会尝试优化一下模型。
  这篇尝试着用csdn的md编辑器做了一下,不得不说比起富文本编辑器有方便的部分也有麻烦的部分。

关键字:东莞网站建设公司服务平台_北京企业名录一览表_全网整合营销推广系统_百度排行榜小说

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: