利用LSTM(长短期记忆网络)来处理脑电数据

摘要:
LSTM还用于表示短期和长期存储器网络。LSTM是一种特殊的RNN网络。LSTM网络可以通过称为门的结构删除或添加信息到单元状态。为了逐步理解LSTM,我们提到LSTM通过三个门控制单元状态,这三个门被称为遗忘门、输入门和输出门。最常见的LSTM结构如上所述。代码案例:接下来,我们将从代码的角度来看LSTM对EEG数据的分类效果。
目录

本分享为脑机学习者Rose整理发表于公众号:脑机接口社区(微信号:Brain_Computer).QQ交流群:903290195
利用LSTM(长短期记忆网络)来处理脑电数据第1张

Rose小哥今天介绍一下用LSTM来处理脑电数据。

LSTM 原理介绍

LSTMs(Long Short Term Memory networks,长短期记忆网络)简称LSTMs,很多地方用LSTM来指代它。本文也使用LSTM来表示长短期记忆网络。LSTM是一种特殊的RNN网络(循环神经网络)。想要说清楚LSTM,就很有必要先介绍一下RNN。下面我将简略介绍一下RNN原理。

所有循环神经网络都具有神经网络的重复模块链的形式。在标准的RNN中,该重复模块将具有非常简单的结构,比如单个tanh层。标准的RNN网络如下图所示:
利用LSTM(长短期记忆网络)来处理脑电数据第2张
LSTM也具有这种链式结构,不过它的重复单元与标准RNN网络里的单元只有一个网络层不同,它的内部有四个网络层。LSTM的结构如下图所示。
利用LSTM(长短期记忆网络)来处理脑电数据第3张
在解释LSTM的详细结构时先定义一下图中各个符号的含义,符号包括下面几种,图中黄色类似于CNN里的激活函数操作,粉色圆圈表示点操作,单箭头表示数据流向,箭头合并表示向量的合并(concat)操作,箭头分叉表示向量的拷贝操作。
利用LSTM(长短期记忆网络)来处理脑电数据第4张

LSTM的核心思想

LSTM的核心是细胞状态,用贯穿细胞的水平线表示。
细胞状态像传送带一样。它贯穿整个细胞却只有很少的分支,这样能保证信息不变的流过整个RNNs。细胞状态如下图所示。
利用LSTM(长短期记忆网络)来处理脑电数据第5张
LSTM网络能通过一种被称为门的结构对细胞状态进行删除或者添加信息。
门能够有选择性的决定让哪些信息通过。

而门的结构很简单,就是一个sigmoid层和一个点乘操作的组合。如下图所示
利用LSTM(长短期记忆网络)来处理脑电数据第6张
因为sigmoid层的输出是0-1的值,这代表有多少信息能够流过sigmoid层。0表示都不能通过,1表示都能通过。
一个LSTM里面包含三个门来控制细胞状态。

一步一步理解LSTM

前面提到LSTM由三个门来控制细胞状态,这三个门分别称为忘记门、输入门和输出门。下面将分别讲述。
利用LSTM(长短期记忆网络)来处理脑电数据第7张
利用LSTM(长短期记忆网络)来处理脑电数据第8张

上面描述的是最普通的LSTM结构。随着研究人员对LSTM的研究,在实际的文章中提出了很多LSTM结构的各种变式,这里就不讨论了。

代码案例

下面将从代码的角度来看一下LSTM对脑电数据进行分类效果。

数据集来源于BCI Competition II。使用的深度学习框架为Keras。

# 导入工具包
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.layers import Embedding
from keras.layers import SimpleRNN, LSTM, GRU
from keras.optimizers import SGD, Nadam, Adam, RMSprop
from keras.callbacks import TensorBoard
from keras.utils import np_utils
import scipy.io 
import numpy as np

第一步:导入数据

data = scipy.io.loadmat('F:BCI Competition IIsp1s_aa_1000Hz.mat')
y_test = np.loadtxt('F:BCI Competition IIlabels_data_set_iv.txt',encoding="utf-8")

第二步:预处理数据

"""
将训练数据调整为LSTM的正确输入尺寸
并将数据转换为float 32
"""
x_train = data['x_train'].reshape((316,500,28))
x_train /= 200
x_train = x_train.astype('float32')
"""
将测试数据调整为LSTM的正确输入尺寸
并将数据转换为float 32
"""
x_test = data['x_test'].reshape((100,500,28))
x_test /= 200
x_test = x_test.astype('float32')

"""
将标签数据调整为LSTM的正确输入尺寸
并将数据转换为float 32
"""
y_train = data['y_train'].reshape(316,1)
tmp_train = []
for i in y_train:
    if i == 1:
        tmp_train.append(1)
    elif i == 0:
        tmp_train.append(-1)
y_train = np.array(tmp_train)
y_train = np_utils.to_categorical(y_train, 2)
y_train = y_train.astype('float32')

y_test = y_test.reshape(100,1)
tmp_test = []
for i in y_test:
    if i == 1:
        tmp_test.append(1)
    elif i == 0:
        tmp_test.append(-1)       
y_test = np.array(tmp_test)
y_test = np_utils.to_categorical(y_test, 2)
y_test = y_test.astype('float32')

第三步:构建训练模型

model = Sequential()
model.add(LSTM(10, return_sequences = True, input_shape=(500, 28)))
model.add(LSTM(10, return_sequences = True))
model.add(LSTM(5))
model.add(Dense(2, activation = 'softmax'))

model.summary()

"""
优化器设置
学习率为0.001
"""
optim = Nadam(lr = 0.001)
# 设置损失函数为交叉熵损失函数
model.compile(loss = 'categorical_crossentropy', optimizer = optim, metrics = ['accuracy'])

第四步:训练模型

"""
epochs设置为10
batch_size设置为20
"""
model.fit(x_train, y_train, epochs=15, batch_size=20)  

第五步:计算最后得分和精度

score, acc = model.evaluate(x_test, y_test,
                            batch_size=1)
print('测试得分:', score)
print('测试精度:', acc)

利用LSTM(长短期记忆网络)来处理脑电数据第9张
利用LSTM(长短期记忆网络)来处理脑电数据第10张

参考
利用LSTM(长短期记忆网络)来处理脑电数据
1.https://www.jianshu.com/p/95d5c461924c
2.http://colah.github.io/posts/2015-08-Understanding-LSTMs/
3.https://github.com/kevinchangwang
本文章由脑机学习者Rose笔记分享,QQ交流群:903290195
更多分享,请关注公众号
利用LSTM(长短期记忆网络)来处理脑电数据第1张

免责声明:文章转载自《利用LSTM(长短期记忆网络)来处理脑电数据》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇iOS实现地图半翻页效果--老代码备用参考EMQX_AUTH_USERNAME 使用指南下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Maven测试篇

 Maven的生命周期:   讲解Maven测试篇之前将首先介绍一下Maven生命周期的相关概念,如果你熟知这部分概念可以略过此小节内容。   通常,我们在构建一个项目的时候,不外乎是对其进行清理、编译、测试和部署等操作。对于大多数项目,我们每次都要重复这些必要的过程,而Maven正是对这些必要的构建过程进行了抽象,它以项目的清理、初始化、编译、测试、...

VS2010-如何建立并运行多个含有main函数的文件

    一、先说两个概念,解决方案与工程   在VS2010中,工程都是在解决方案管理之下的。一个解决方案可以管理多个工程,可以把解决方案理解为多个有关系或者没有关系的工程的集合。 每个应用程序都作为一个工程来处理,它包含了头文件、源文件和资源文件等,这些文件通过工程集中管理。 VS2010提供了一个Solution Explorer解决方案浏览器视图,可...

Spring Boot 2.4 配置文件将加载机制大变化

Spring Boot 2.4.0.M2 刚刚发布,它对 application.properties 和 application.yml 文件的加载方式进行重构。如果应用程序仅使用单个 application.properties 或 application.yml 作为配置文件,那么可能感受不到任何区别。但是如果您的应用程序使用更复杂的配置(例如,Sp...

gcc/g++编译

1. gcc/g++在执行编译工作的时候,总共需要4步 (1).预处理,生成.i的文件[预处理器cpp] (2).汇编,将预处理后的文件转换成汇编语言,生成文件.s[编译器egcs] (3).编译,将汇编语言文件编译为目标代码(机器代码)生成.o的文件[汇编器as] (4).链接,将目标代码,生成可执行程序[链接器ld] [参数详解]   -x lang...

hbase安装配置(整合到hadoop)

如果想详细了解hbase的安装:http://abloz.com/hbase/book.html 和官网http://hbase.apache.org/ 1.  快速单击安装 在单机安装Hbase的方法。会引导你通过shell创建一个表,插入一行,然后删除它,最后停止Hbase。只要10分钟就可以完成以下的操作。 1.1下载解压最新版本 选择一个 ...

Caused by: java.lang.IllegalStateException: javax.websocket.server.ServerContainer not available

java.lang.IllegalStateException: Failed to load ApplicationContext    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwar...