LSTM过度拟合但验证准确性没有提高

时间:2018-03-09 20:55:32

标签: python machine-learning keras lstm

我要做的任务是将脑电信号分为4类。数据分为试验。要求受试者考虑做四个动作中的一个,并且分类任务是基于EEG信号预测他们在想什么。

我有~2500次试验。对于每个试验,有22个EEG传感器输入通道和1000个时间步长。我的基线是单层MLP,我得到~45%的验证准确度。

由于keras LSTM需要y的单热编码矢量,因此我在训练之前将0,1,2,3映射到它们相应的单热编码(y_total_new)。起初,我手动创建了一个80/20列车/测试分割,但之后只是选择让keras进行分割(validation_split = 0.2)。

这是我有史以来的第一次LSTM实验。我选择100个单位开始。我添加了一个带有四个神经元的完全连接层,以便映射到输出类,并使用categorical_crossentropy作为我的损失函数。到目前为止,使用LSTM,我无法获得超过25%的验证准确度。如果我运行以下代码50个纪元而不是3个,则LSTM会过度拟合数据,但验证精度保持在0.25左右。

由于这是我第一次使用LSTM,我想知道是否有人可以深入了解我可能错过的设计线索或指出我正确的方向。

from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.layers import Embedding
from keras.layers import LSTM


time_steps = 1000
n_features = 22

model = Sequential()
model.add(LSTM(1000, return_sequences=False, input_shape=(time_steps, n_features)))
model.add(Dropout(0.2))
model.add(Dense(22, activation='tanh'))
model.add(Dense(4, activation='sigmoid'))

model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

model.fit(X, y_total_new, validation_split=0.2, batch_size=16, epochs=50)
#score = model.evaluate(X_test, y_test_new, batch_size=16)

2 个答案:

答案 0 :(得分:1)

由于验证数据集有限,有时会出现此问题。当验证数据不足时,由于要验证的数据数量有限,模型无法提高准确性。

尝试将验证拆分增加到0.3,以进一步检查问题可能出在哪里。在这种情况下,您可以创建自己的(更具代表性的)验证数据集,并将其传递给模型以提高验证准确性。

如果是这种情况,请尝试应用过度平衡或不足平衡,以确保每个标签的样本数量相等。

使用LSTM时,创建数据集拆分时必须小心,以进一步允许模型生成更准确的序列预测,尤其是在每个创建的 trial 中数据集较小的情况下。

答案 1 :(得分:0)

您是否尝试将卷积图层添加为模型的第一层?我现在正在使用这种方法,以便将EMG信号分类为53个类。卷积层应该自动从数据中学习特征,然后用它们提供LSTM层。有几种可能的架构,DeepConvLstm就是其中之一:

DeepConvLstmArch

DeepConvLstm论文:www.mdpi.com/1424-8220/16/1/115/htm