信号处理--多分辨率单通道注意力脑电睡眠分类

2024-03-05 20:52

本文主要是介绍信号处理--多分辨率单通道注意力脑电睡眠分类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

背景

亮点

环境配置

数据准备和预处理

模型搭建和框架示意图

模型训练可视化

分类结果(SHHS数据集为例)

代码获取地址


背景

睡眠对人类来说是一个至关重要的过程,因为它影响着他们日常活动的各个方面。 研究表明,拥有良好睡眠质量的人会享有更好的健康和大脑功能。 另一方面,睡眠周期中断会导致一些睡眠障碍,例如失眠或睡眠不足。

亮点

  • 多分辨率 CNN 模块,用于从不同频带中提取与低频和高频相对应的特征,并采用自适应特征重新校准来学习特征相互依赖性并增强提取特征的表示能力 。
  • 时间上下文编码器,它部署了具有因果卷积的多头自注意力,以有效捕获提取特征中的时间依赖性。
  • 类感知损失函数来有效地处理类不平衡,而无需引入额外的计算。

环境配置

  • Pytorch 1.4
  • Python 3.7
  • mne 0.20.7

数据准备和预处理

  • Sleep-EDF数据集

  • SHHS数据集

Sleep-EDF数据预处理部分代码:

https://github.com/akaraspt/deepsleepnet
Copyright 2017 Akara Supratak and Hao Dong.  All rights reserved.
'''import argparse
import glob
import math
import ntpath
import os
import shutilfrom datetime import datetimeimport numpy as np
import pandas as pdfrom mne.io import concatenate_raws, read_raw_edfimport dhedfreader# Label values
W = 0
N1 = 1
N2 = 2
N3 = 3
REM = 4
UNKNOWN = 5stage_dict = {"W": W,"N1": N1,"N2": N2,"N3": N3,"REM": REM,"UNKNOWN": UNKNOWN
}class_dict = {0: "W",1: "N1",2: "N2",3: "N3",4: "REM",5: "UNKNOWN"
}ann2label = {"Sleep stage W": 0,"Sleep stage 1": 1,"Sleep stage 2": 2,"Sleep stage 3": 3,"Sleep stage 4": 3,"Sleep stage R": 4,"Sleep stage ?": 5,"Movement time": 5
}EPOCH_SEC_SIZE = 30def main():parser = argparse.ArgumentParser()parser.add_argument("--data_dir", type=str, default="data_edf_20",help="File path to the PSG and annotation files.")parser.add_argument("--output_dir", type=str, default="data_edf_20_npz/fpzcz",help="Directory where to save numpy files outputs.")parser.add_argument("--select_ch", type=str, default="EEG Fpz-Cz",help="The selected channel")args = parser.parse_args()# Output dirif not os.path.exists(args.output_dir):os.makedirs(args.output_dir)else:shutil.rmtree(args.output_dir)os.makedirs(args.output_dir)# Select channelselect_ch = args.select_ch# Read raw and annotation EDF filespsg_fnames = glob.glob(os.path.join(args.data_dir, "*PSG.edf"))ann_fnames = glob.glob(os.path.join(args.data_dir, "*Hypnogram.edf"))psg_fnames.sort()ann_fnames.sort()psg_fnames = np.asarray(psg_fnames)ann_fnames = np.asarray(ann_fnames)

SHHS数据预处理部分代码:

import os
import numpy as npimport argparse
import glob
import math
import ntpathimport shutil
import urllib
# import urllib2from datetime import datetime
import warnings
warnings.filterwarnings("ignore")import pandas as pd
from mne.io import concatenate_raws, read_raw_edf
import dhedfreader
import xml.etree.ElementTree as ET###############################
EPOCH_SEC_SIZE = 30def main():parser = argparse.ArgumentParser()parser.add_argument("--data_dir", type=str, default="/home/abc/shhs/polysomnography/edfs/shhs1",help="File path to the PSG files.")parser.add_argument("--ann_dir", type=str, default="/home/abc/shhs/polysomnography/annotations-events-profusion/shhs1",help="File path to the annotation files.")parser.add_argument("--output_dir", type=str, default="/home/abc/output_npz/shhs",help="Directory where to save numpy files outputs.")parser.add_argument("--select_ch", type=str, default="EEG C4-A1",help="The selected channel")args = parser.parse_args()if not os.path.exists(args.output_dir):os.mkdir(args.output_dir)ids = pd.read_csv("selected_shhs1_files.txt", header=None, names='a')ids = ids['a'].values.tolist()edf_fnames = [os.path.join(args.data_dir, i + ".edf") for i in ids]ann_fnames = [os.path.join(args.ann_dir,  i + "-profusion.xml") for i in ids]edf_fnames.sort()ann_fnames.sort()edf_fnames = np.asarray(edf_fnames)ann_fnames = np.asarray(ann_fnames)

数据加载代码:

import torch
from torch.utils.data import Dataset
import os
import numpy as npclass LoadDataset_from_numpy(Dataset):# Initialize your data, download, etc.def __init__(self, np_dataset):super(LoadDataset_from_numpy, self).__init__()# load filesX_train = np.load(np_dataset[0])["x"]y_train = np.load(np_dataset[0])["y"]for np_file in np_dataset[1:]:X_train = np.vstack((X_train, np.load(np_file)["x"]))y_train = np.append(y_train, np.load(np_file)["y"])self.len = X_train.shape[0]self.x_data = torch.from_numpy(X_train)self.y_data = torch.from_numpy(y_train).long()# Correcting the shape of input to be (Batch_size, #channels, seq_len) where #channels=1if len(self.x_data.shape) == 3:if self.x_data.shape[1] != 1:self.x_data = self.x_data.permute(0, 2, 1)else:self.x_data = self.x_data.unsqueeze(1)def __getitem__(self, index):return self.x_data[index], self.y_data[index]def __len__(self):return self.len

模型搭建和框架示意图

多分辨率CNN代码:

class MRCNN(nn.Module):def __init__(self, afr_reduced_cnn_size):super(MRCNN, self).__init__()drate = 0.5self.GELU = GELU()  # for older versions of PyTorch.  For new versions use nn.GELU() instead.self.features1 = nn.Sequential(nn.Conv1d(1, 64, kernel_size=50, stride=6, bias=False, padding=24),nn.BatchNorm1d(64),self.GELU,nn.MaxPool1d(kernel_size=8, stride=2, padding=4),nn.Dropout(drate),nn.Conv1d(64, 128, kernel_size=8, stride=1, bias=False, padding=4),nn.BatchNorm1d(128),self.GELU,nn.Conv1d(128, 128, kernel_size=8, stride=1, bias=False, padding=4),nn.BatchNorm1d(128),self.GELU,nn.MaxPool1d(kernel_size=4, stride=4, padding=2))self.features2 = nn.Sequential(nn.Conv1d(1, 64, kernel_size=400, stride=50, bias=False, padding=200),nn.BatchNorm1d(64),self.GELU,nn.MaxPool1d(kernel_size=4, stride=2, padding=2),nn.Dropout(drate),nn.Conv1d(64, 128, kernel_size=7, stride=1, bias=False, padding=3),nn.BatchNorm1d(128),self.GELU,nn.Conv1d(128, 128, kernel_size=7, stride=1, bias=False, padding=3),nn.BatchNorm1d(128),self.GELU,nn.MaxPool1d(kernel_size=2, stride=2, padding=1))self.dropout = nn.Dropout(drate)self.inplanes = 128self.AFR = self._make_layer(SEBasicBlock, afr_reduced_cnn_size, 1)

注意力机制代码:

class SELayer(nn.Module):def __init__(self, channel, reduction=16):super(SELayer, self).__init__()self.avg_pool = nn.AdaptiveAvgPool1d(1)self.fc = nn.Sequential(nn.Linear(channel, channel // reduction, bias=False),nn.ReLU(inplace=True),nn.Linear(channel // reduction, channel, bias=False),nn.Sigmoid())def forward(self, x):b, c, _ = x.size()y = self.avg_pool(x).view(b, c)y = self.fc(y).view(b, c, 1)return x * y.expand_as(x)

 不均衡损失函数代码:

import torch
import torch.nn as nndef weighted_CrossEntropyLoss(output, target, classes_weights, device):cr = nn.CrossEntropyLoss(weight=torch.tensor(classes_weights).to(device))return cr(output, target)

模型训练可视化

分类结果(SHHS数据集为例)

混沌矩阵+分类指标

 代码获取地址

信号处理-多分辨率单通道注意力脑电睡眠分类 完整代码

这篇关于信号处理--多分辨率单通道注意力脑电睡眠分类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/777779

相关文章

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

python写个唤醒睡眠电脑的脚本

《python写个唤醒睡眠电脑的脚本》这篇文章主要为大家详细介绍了如何使用python写个唤醒睡眠电脑的脚本,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 环境:win10python3.12问题描述:怎么用python写个唤醒睡眠电脑的脚本?解决方案:1.唤醒处于睡眠状

Go信号处理如何优雅地关闭你的应用

《Go信号处理如何优雅地关闭你的应用》Go中的优雅关闭机制使得在应用程序接收到终止信号时,能够进行平滑的资源清理,通过使用context来管理goroutine的生命周期,结合signal... 目录1. 什么是信号处理?2. 如何优雅地关闭 Go 应用?3. 代码实现3.1 基本的信号捕获和优雅关闭3.2

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

【Tools】大模型中的自注意力机制

摇来摇去摇碎点点的金黄 伸手牵来一片梦的霞光 南方的小巷推开多情的门窗 年轻和我们歌唱 摇来摇去摇着温柔的阳光 轻轻托起一件梦的衣裳 古老的都市每天都改变模样                      🎵 方芳《摇太阳》 自注意力机制(Self-Attention)是一种在Transformer等大模型中经常使用的注意力机制。该机制通过对输入序列中的每个元素计算与其他元素之间的相似性,

如何通俗理解注意力机制?

1、注意力机制(Attention Mechanism)是机器学习和深度学习中一种模拟人类注意力的方法,用于提高模型在处理大量信息时的效率和效果。通俗地理解,它就像是在一堆信息中找到最重要的部分,把注意力集中在这些关键点上,从而更好地完成任务。以下是几个简单的比喻来帮助理解注意力机制: 2、寻找重点:想象一下,你在阅读一篇文章的时候,有些段落特别重要,你会特别注意这些段落,反复阅读,而对其他部分

【Tools】大模型中的注意力机制

摇来摇去摇碎点点的金黄 伸手牵来一片梦的霞光 南方的小巷推开多情的门窗 年轻和我们歌唱 摇来摇去摇着温柔的阳光 轻轻托起一件梦的衣裳 古老的都市每天都改变模样                      🎵 方芳《摇太阳》 在大模型中,注意力机制是一种重要的技术,它被广泛应用于自然语言处理领域,特别是在机器翻译和语言模型中。 注意力机制的基本思想是通过计算输入序列中各个位置的权重,以确

用Pytho解决分类问题_DBSCAN聚类算法模板

一:DBSCAN聚类算法的介绍 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,DBSCAN算法的核心思想是将具有足够高密度的区域划分为簇,并能够在具有噪声的空间数据库中发现任意形状的簇。 DBSCAN算法的主要特点包括: 1. 基于密度的聚类:DBSCAN算法通过识别被低密

PMP–一、二、三模–分类–14.敏捷–技巧–看板面板与燃尽图燃起图

文章目录 技巧一模14.敏捷--方法--看板(类似卡片)1、 [单选] 根据项目的特点,项目经理建议选择一种敏捷方法,该方法限制团队成员在任何给定时间执行的任务数。此方法还允许团队提高工作过程中问题和瓶颈的可见性。项目经理建议采用以下哪种方法? 易错14.敏捷--精益、敏捷、看板(类似卡片)--敏捷、精益和看板方法共同的重点在于交付价值、尊重人、减少浪费、透明化、适应变更以及持续改善等方面。