信号处理--基于gumbel-softmax方法实现运动想象分类的通道选择

目录

背景

亮点

环境配置

数据

方法

结果

代码获取

参考文献


背景

基于Gumbel-softmax方法EEG通道选择层的PyTorch实现。该层可以放置在任何深度神经网络架构的前面,以共同学习给定任务和网络权重的脑电图通道的最佳子集。这一层由选择神经元组成,每个神经元都使用输入通道上离散分布的连续松弛来学习最佳的单热权重向量来选择输入通道,而不是线性组合它们。

亮点

使用Gumbel-softmax方法对多通道脑电数据进行单通道选择(非多通道线性加权)

使用多尺度滤波卷积网络实现运动想象4分类。

环境配置

PyTorch 0.3.1,

CUDA 9.1

数据

High-Gamma Dataset

方法

多尺度滤波卷积网络主要代码:

class MSFBCNN(nn.Module):
	def __init__(self,input_dim,output_dim,FT=10):
		super(MSFBCNN, self).__init__()
		self.T = input_dim[1]
		self.FT = FT
		self.D = 1
		self.FS = self.FT*self.D
		self.C=input_dim[0]
		self.output_dim = output_dim
		
		# Parallel temporal convolutions
		self.conv1a = nn.Conv2d(1, self.FT, (1, 65), padding = (0,32),bias=False)
		self.conv1b = nn.Conv2d(1, self.FT, (1, 41), padding = (0,20),bias=False)
		self.conv1c = nn.Conv2d(1, self.FT, (1, 27), padding = (0,13),bias=False)
		self.conv1d = nn.Conv2d(1, self.FT, (1, 17), padding = (0,8),bias=False)

		self.batchnorm1 = nn.BatchNorm2d(4*self.FT, False)
		
		# Spatial convolution
		self.conv2 = nn.Conv2d(4*self.FT, self.FS, (self.C,1),padding=(0,0),groups=1,bias=False)
		self.batchnorm2 = nn.BatchNorm2d(self.FS, False)

		#Temporal average pooling
		self.pooling2 = nn.AvgPool2d(kernel_size=(1, 75),stride=(1,15),padding=(0,0))

		self.drop=nn.Dropout(0.5)

		#Classification
		self.fc1 = nn.Linear(self.FS*math.ceil(1+(self.T-75)/15), self.output_dim)

	def forward(self, x):

		# Layer 1
		x1 = self.conv1a(x);
		x2 = self.conv1b(x);
		x3 = self.conv1c(x);
		x4 = self.conv1d(x);

		x = torch.cat([x1,x2,x3,x4],dim=1)
		x = self.batchnorm1(x)

		# Layer 2
		x = torch.pow(self.batchnorm2(self.conv2(x)),2)
		x = self.pooling2(x)
		x = torch.log(x)
		x = self.drop(x)
		
		# FC Layer
		x = x.view(-1, self.num_flat_features(x))
		x = self.fc1(x)
		return x

	def num_flat_features(self, x):
		size = x.size()[1:]  # all dimensions except the batch dimension
		num_features = 1
		for s in size:
			num_features *= s
		return num_features

Gumbel-softmax 再参数化主要代码:

class SelectionLayer(nn.Module):
	def __init__(self, N,M,temperature=1.0):

		super(SelectionLayer, self).__init__()
		self.floatTensor = torch.FloatTensor if not torch.cuda.is_available() else torch.cuda.FloatTensor
		self.N = N
		self.M = M
		self.qz_loga = Parameter(torch.randn(N,M)/100)

		self.temperature=self.floatTensor([temperature])
		self.freeze=False
		self.thresh=3.0

	def quantile_concrete(self, x):

		g = -torch.log(-torch.log(x))
		y = (self.qz_loga+g)/self.temperature
		y = torch.softmax(y,dim=1)

		return y

	def regularization(self):
		
		eps = 1e-10
		z = torch.clamp(torch.softmax(self.qz_loga,dim=0),eps,1)
		H = torch.sum(F.relu(torch.norm(z,1,dim=1)-self.thresh))

		return H

	def get_eps(self, size):

		eps = self.floatTensor(size).uniform_(epsilon, 1-epsilon)

		return eps

	def sample_z(self, batch_size, training):

		if training:

			eps = self.get_eps(self.floatTensor(batch_size, self.N, self.M))
			z = self.quantile_concrete(eps)
			z=z.view(z.size(0),1,z.size(1),z.size(2))
	 
			return z

		else:

			ind = torch.argmax(self.qz_loga,dim=0)
			one_hot = self.floatTensor(np.zeros((self.N,self.M)))
			for j in range(self.M):
					one_hot[ind[j],j]=1
			one_hot=one_hot.view(1,1,one_hot.size(0),one_hot.size(1))
			one_hot = one_hot.expand(batch_size,1,one_hot.size(2),one_hot.size(3))

			return one_hot

	def forward(self, x):

		z = self.sample_z(x.size(0),training=(self.training and not self.freeze))
		z_t = torch.transpose(z,2,3)
		out = torch.matmul(z_t,x)
		return out

结果

实现从64通道脑电信号中提取出N个重要通道脑电信号,增强后续分类任务的性能

代码获取

https://download.csdn.net/download/YINTENAXIONGNAIER/88946872

参考文献

  • Strypsteen, Thomas, and Alexander Bertrand. "End-to-end learnable EEG channel selection for deep neural networks with Gumbel-softmax." Journal of Neural Engineering 18.4 (2021): 0460a9.

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

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

相关文章

【Node.js相关问题】npm install报错后重装node版本及npm环境变量配置及npm run dev启动报错原因分析解决办法

一、问题描述 昨天在准备打开b站up主三更草堂的博客项目08-02.基础版本前端联调_哔哩哔哩_bilibili中的前端工程时,使用以下两个命令分别都出现了报错。 命令1: # install dependenciesnpm install 命令2: # serve with hot reload at loca…

[vscode]将命令行参数传递给调试目标

一、简介 本文介绍了在vscode中使用cmake工具时,如何传递参数给编译目标的方法。 前提:使用vscodecmake编译C/C程序。 二、方法 在.vscode/目录下新建settings.json文件,并将待传底的参数写在 cmake.debugConfig里。 下面介绍了一个示例&a…

pymysql连不上mysql的原因

我试了两种解决办法。可以参考一下 第一种:查看有没有打开mysql服务 第二种:刷新 MySQL 用户权限 password改成自己的密码 GRANT ALL PRIVILEGES ON *.* TO root% IDENTIFIED BY password WITH GRANT OPTION;FLUSH PRIVILEGES; 第三种:检…

CCCorelib 点云曲面特征(CloudCompare内置算法库)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里基于每个点的邻域协方差来获取点云中具有的曲面几何特征的点,计算方式如下图所示: 二、实现代码 // CloudCompare #include <CCCoreLib/PointCloudTpl.h> #include <CCCoreLib/

多维时序 | Matlab实现VMD-CNN-BiLSTM变分模态分解结合卷积神经网络结合双向长短期记忆神经网络多变量时间序列预测

多维时序 | Matlab实现VMD-CNN-BiLSTM变分模态分解结合卷积神经网络结合双向长短期记忆神经网络多变量时间序列预测 目录 多维时序 | Matlab实现VMD-CNN-BiLSTM变分模态分解结合卷积神经网络结合双向长短期记忆神经网络多变量时间序列预测预测效果基本介绍程序设计参考资料 预测…

微信小程序小白易入门基础教程1

微信小程序 基本结构 页面配置 页面配置 app.json 中的部分配置&#xff0c;也支持对单个页面进行配置&#xff0c;可以在页面对应的 .json 文件来对本页面的表现进行配置。 页面中配置项在当前页面会覆盖 app.json 中相同的配置项&#xff08;样式相关的配置项属于 app.js…

<2024最新>ChatGPT逆向教程

前言 在使用本篇文章用到的项目以及工具时,需要对其有一定的了解,无法访问以及无法使用的问题作者不承担任何责任,可以自行想办法解决遇到的问题​。 文章若有不合适,有问题的地方,请私聊指出,谢谢~ 准备工具 一台至少 2 核 2G 内存的服务器,推荐是位于香港、新加坡或…

微服务day01 -- SpringCloud01 -- (Eureka , Ribbon , Nacos)

介绍微服务 1.认识微服务(p1-p5) 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构&#…

vue.js项目评估流程图特效

vue.js项目评估流程图特效是一款带节点流程支持增加删除编辑的结构图代码。 下载地址 vue.js项目评估流程图特效

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:RemoteWindow)

远程控制窗口组件&#xff0c;可以通过此组件控制应用窗口&#xff0c;提供启动退出过程中控件动画和应用窗口联动动画的能力。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 该组件为系统接口。…

jmeter发送请求参数如何使用变量

问题描述 发送jmeter请求时&#xff0c;想设置请求参数为变量 解决方法

css3实现3D立方体旋转特效源码

源码介绍 CSS3自动旋转正方体3D特效是一款基于css3 keyframes属性制作的图片相册自动旋转立方体特效 效果展示 下载地址 css3实现3D立方体旋转特效代码

微信小程序实现上下手势滑动切换

效果图 思路 实现一个微信小程序的复合滚动页面&#xff0c;主要通过Swiper组件实现垂直方向的轮播功能&#xff0c;每个轮播项内部使用Scroll-View组件来展示可垂直滚动的长内容&#xff0c;如图片和文本。 代码 <!-- wxml --> <view class"swiper-container…

为什么要分模块开发 以及maven的作用体现

为什么要分模块开发? 我们要知道分模块开发需要先针对模块进行设计再进行编码。 1.模块的创建 首先来看一下模块的创建 我们先理解一个思路我们一般项目是从本地仓库去找资源坐标,如果本地仓库都没有那是不可能找的到的 如果你idea中可以找到不爆红但是compile的时候会报错,除…

JavaParser的快速介绍

开发的工作主要是写代码&#xff0c; 有考虑过使用代码写代码&#xff0c; 使用代码分析和改进代码吗&#xff1f; JavaParser 就可以帮你用来处理Java 代码的这些功能。 Java Parser 的介绍 Java Parser是一个用于解析和分析Java源代码的开源工具。它提供了一个API接口&…

Web 常用的 扩展开发框架

当谈到提升浏览器功能和用户体验时&#xff0c;浏览器扩展成了一股强大的力量&#xff0c;备受用户青睐。在众多的Web扩展开发框架中&#xff0c;WXT和Plasmo凭借其丰富的工具和特性&#xff0c;以及简化的开发流程&#xff0c;成为开发者们的首选。在本文中&#xff0c;我们将…

Jenkins插件Parameterized Scheduler用法

Jenkins定时触发构建的同时设定参数。可以根据不同的定时构建器设置不同参数或环境变量的值。可以设置多个参数。并结合when控制stage流程的执行。结合when和triggeredBy区分定时构建的stage和手动执行的stage。 目录 什么是Parameterized Scheduler&#xff1f;如何配置实现呢…

OGNL表达式

文章目录 一、简介二、快速入门三、详细使用3.1 基本数据类型3.2 对象类型3.3 List集合3.4 Set集合3.5 Map集合3.6 数组3.7 静态调用3.8 算术运算3.9 逻辑运算3.10 同时执行多个表达式3.11 位运算 Ognl使用总结 - 源链接在此 >> 一、简介 OGNL&#xff08;Object-Graph…

【c 语言 】位操作符详解

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

【机器学习300问】33、决策树是如何进行特征选择的?

还记得我在【机器学习300问】的第28问里谈到的&#xff0c;看决策树的定义不就是if-else语句吗怎么被称为机器学习模型&#xff1f;其中最重要的两点就是决策树算法要能够自己回答下面两问题&#xff1a; 该选哪些特征 特征选择该选哪个阈值 阈值确定 今天这篇文章承接上文&…