本文对脑电波信号进行分类。人类大脑在接受不同的刺激(光照、声音)时,脑电波的形状是不一样的。
因而,想通过对脑电波进行学习,从而判断大脑接受了哪种刺激。
我们在人的大脑上安装了32个芯片,芯片的分布如下图所示。这些芯片每隔一定的秒数就会测得信号、这些信号就是脑电波信号。显然,脑电波数据是时间序列。
脑电波的时间序列如下:
每一条脑电波都对应了一种刺激(共6种),结构如下:
本文构建了LSTM模型来对脑电波数据进行分类,深度学习平台采用的keras。核心代码如下:
# code for building an LSTM with 100 neurons and dropout. Runs for 50 epochs
model = Sequential()
model.add(LSTM(100, return_sequences=False, input_shape=(time_steps, n_features)))
参数解释:
1)每个脑电波信号都由time_steps个单元组成,而每个单元用n_features维的向量表示。
2)return_sequences:布尔值,默认False,控制返回类型。若为True则返回整个序列,否则仅返回输出序列的最后一个输出
model.add(Dropout(0.5)) model.add(Dense(1, activation='sigmoid')) pile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy']) model.fit(X_train, y_train, batch_size=16, epochs=50)
score = model.evaluate(X_test, y_test, batch_size=16)
模型核心结构如下图所示:
(1)V1为32维的向量
(2)通过第一个LSTM输出为维度100,而return_sequences=True,我们可以获得time_steps个100维的向量,最后因为return_sequences=False,所以只输出了最后一个红色的向量
(3)为输入数据施加Dropout。Dropout将在训练过程中每次更新参数时随机断开一定百分比(p)的输入神经元连接,Dropout层用于防止过拟合。
keras.layers.core.Dropout(p)
p:0~1的浮点数,控制需要断开的链接的比例
(4)100维度的红色的向量输入到Dense层(全连接层),激活函数是sigmod
(5)全连接层的输出是类标向量