选自TowardsDataScience,做者:Norman Di Palo,机器之心编译。php
脑电图是一种利用电极记录大脑活动的非侵入式技术,但大脑活动和脑电图信号之间的关系很是复杂,如何「解码」成为困扰研究者的一大难题。本文做者利用 Kaggle 竞赛中的脑电图数据探索与特定手势对应的脑电图模式,并以此设计神经网络。
神经系统是一个极其复杂的结构。人体内有超过十万千米的神经与脊髓和大脑相连。这种「网格」传输控制每个运动的电脉冲。每个指令都从大脑发出,大脑是一个更加神奇的神经元结构,经过电激活信号进行通讯。理解和解释大脑的电模式是神经科学家和神经生物学家的研究热点之一,但事实证实这是一项极具挑战性的任务。git
记录大脑活动的一种非侵入式技术是「脑电图」(EEG),使用固定在患者头皮上的电极记录脑电压波动。一般在头皮周围固定大约 30 个电极,记录脑电波的整体活动。不管如何,大脑活动和 EEG 信号之间的关系很是复杂,若是不借助具体的实验测试,咱们将很难理解。所以,一个巨大的挑战是学习如何「解码」,在某种意义上,这些脑电图扫描能够容许使用非侵入式脑机接口(BCI)来控制机器假肢和其余设备。github
利用 EEG 记录脑电波。CC BY-SA 2.0,来源:commons.wikimedia.org/w/index.php…bash
做为强数据驱动的学科,最近在相关模式识别任务中取得的「深度学习」新突破为使用「神经网络」分析这些电信号创造了一种新方法。在这篇文章中,咱们首先介绍这一主题:阅读 Kaggle 竞赛(Grasp-and-Lift EEG Detection)提供的 EEG 数据,该竞赛旨在检测哪些 EEG 模式对应特定的手臂和手势动做,如抓取或提起物体。在以不一样的方式预处理数据以后,咱们将设计一个神经网络来执行这种分类。此外,我还将展现一些大脑活动的数据可视化,以便大体了解正在使用的数据。这一研究领域的最终目标是开发平价、实用的假肢装置,经过大脑控制假肢,帮助截肢者恢复轻松进行基本活动的能力。相似的技术也能够应用于读取肌肉电激活,从而经过分析激活的肌肉来解码人试图执行的运动类型。网络
数据简介架构
若是你拥有 Kaggle 账户,那么你能够在该网址免费下载数据:www.kaggle.com/c/grasp-and…。数据由几个.csv 文件组成。这些文件分别是:ionic
经过记录不一样人体测试者在执行简单动做(例如抓取和提高物体)时的脑电图来收集数据。所以,咱们按不一样的场景、主题对数据集进行分类。咱们将在稍后的准确率预测中看到,脑电波可能很是个性化,由于模型能够很是准确地预测同一我的在没见过的场景中的意图,但若是训练不够多样,那么与新的测试人员进行一样的训练会很困难。性能
所以,目标是建立一个神经网络,该网络将脑电图数据做为输入,并输出测试者试图实现的 6 个可能动做的几率分布。因为「no action」不属于 6 个类别,所以咱们能够将其添加为类,或者将全部可能的输出设置为 0 到 1 之间的值,并使用阈值来肯定是否检测到动做。若是每个动做都低于阈值,则咱们就认为没有动做。学习
电极位置,来源:www.kaggle.com/c/grasp-and…测试
我制做了这些电极活动的动画数据可视化。因为采样频率至关高(500 Hz),所以我使用了简单的 3 步低通滤波器来平滑数据,并使用前 100 帧(约 1/5 秒)建立动画。
咱们还能够将时序数据可视化为 2D 热图,其中纵轴表明时间(从上到下递增),横轴表示 32 个电极。
这也很是有用,由于正如咱们将看到的,它容许咱们使用「时空卷积」。
数据预处理
为方便学习阶段,咱们应对原始数据进行预处理。例如,与执行动做的较低变化率相比,很是高的 EEG 采样频率会引起许多问题:数据变化很是快,可是动做实际上保持不变,所以波动几乎能够被认为是噪声。此外,时序模型接收大量快速变化的数据,而分类输出从不改变。
第一个可能的步骤是「使用低通滤波器过滤数据」。即便是简单的运行平均值也能起做用:经过这种方式,咱们缓解了数据的高频变化,同时保留了更有用的低频结构,由于咱们即将分类的动做具备很是低的变化频率(最多 1Hz)。以后,咱们能够对数据进行二次采样,即每 10100 个数据点只保留一个数据点。从某种意义上说,这也有助于下降时间维度及数据的相关性,从而使数据更加时间稀疏。
也能够采用其余预处理技术,可是为了简洁起见,咱们就此打住,开始设计神经网络。
神经网络设计与实验
处理时序数据时,咱们首先想到的架构之一是「循环神经网络」。这些网络具有动态结构,其内部状态容许它们对时序数据进行编码,所以这些网络还基于过去的输入计算输出。我在 Keras 中设计了一个 LSTM 网络,并为其提供了具有连续时序结构的训练数据。结果很好,但在这个特定的例子中,我更感兴趣的是展现一个一般用于图像的卷积神经网络如何很好地应用到时序数据上。
如前所述,从某种意义上来讲,咱们其实是在处理时空数据:以上热图的纵轴表示时间演化,而横轴表示各类电极,结果相近的电极在人类头皮上的空间位置每每也很接近。这意味着咱们能够用卷积提取有用特征:2D 卷积核将同时在时间和空间上编码模式。设想一个 3*3 卷积核:它可以在热图中的矩阵上,经过在 3 个不一样时间步(3 个核行)以及在 3 个不一样的电极(3 个核列)上进行加权求和,来提取特征。所以,具备许多核的 CNN 能够发现电极的激活在与想要的动做相关的有限时间周期上的变化特征」。
我在 Keras 中实现了一个简单的 CNN,来检查它在这个数据集上的性能。
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.layers import Embedding
from keras.layers import LSTM, CuDNNLSTM, BatchNormalization, Conv2D, Flatten, MaxPooling2D, Dropout
from keras.optimizers import Adam
model = Sequential()
#model.add(CuDNNLSTM(128, input_shape = (time_steps//subsample, 32)))
model.add(Conv2D(filters = 64, kernel_size = (7,7), padding = "same", activation = "relu", input_shape = (time_steps//subsample, 32, 1)))
model.add(BatchNormalization())
#model.add(MaxPooling2D(pool_size = (3,3)))
model.add(Conv2D(filters = 64, kernel_size = (5,5), padding = "same", activation = "relu", input_shape = (time_steps//subsample, 32, 1)))
model.add(BatchNormalization())
#model.add(MaxPooling2D(pool_size = (3,3)))
model.add(Conv2D(filters = 64, kernel_size = (3,3), padding = "same", activation = "relu", input_shape = (time_steps//subsample, 32, 1)))
model.add(BatchNormalization())
#model.add(MaxPooling2D(pool_size = (3,3)))
model.add(Flatten())
#model.add(Dropout(0.2))
model.add(Dense(32, activation = "relu"))
model.add(BatchNormalization())
# model.add(Dropout(0.2))
model.add(Dense(6, activation = "sigmoid"))
adam = Adam(lr = 0.001)
model.compile(optimizer = adam, loss = "categorical_crossentropy", metrics = ["accuracy"])
model.summary()
复制代码
为了检查模型的性能,如 Kaggle 竞赛中所建议的,咱们能够查看 AUC 分数。若是不熟悉 AUC,建议读一下这个清晰直观的解释(datascience.stackexchange.com/questions/8…)。从代码所在 notebook 中能够看到,咱们能够在快速训练阶段达到约 0.85 的 AUC 分数。
结论
在这篇文章中,咱们介绍了脑电信号与脑电图,后者是一种利用用户头皮上的电极记录有用信号的非侵入式且相对简单的方法。咱们看到了一些直观的数据可视化,以及如何使用神经网络从这些数据中提取运动意向等特征。我相信这一领域(机器假肢、脑机接口)将会由于深度学习而获得深刻发展。
这些技术的影响将是巨大的。拥有可以以天然方式控制的低成本假肢能够极大地改善数百万人的生活。
建议查看近期启动的 Symbionic Project 项目,参与项目的天才们尝试创造一种低成本的智能手臂假肢,该假肢能够利用肌肉激活控制,目的是实现这种装置的平民化。