代码之家  ›  专栏  ›  技术社区  ›  jonnyd42

LSTM过度拟合,但验证精度没有提高

  •  1
  • jonnyd42  · 技术社区  · 7 年前

    我正在尝试的任务是将EEG信号分为4类。数据分为试验。受试者被要求思考四个动作中的一个,分类任务是根据脑电图信号预测他们在想什么。

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

    由于keras LSTM需要y的一个热编码向量,所以在进行训练之前,我将0,1,2,3映射到相应的一个热编码(y\u total\u new)。起初,我手动创建了一个80/20列车/测试分割,但后来选择让keras进行分割(validation\u split=0.2)。

    这是我第一次做LSTM实验。我从100个单元开始。为了映射到输出类,我添加了一个具有四个神经元的完全连接层,并将categorical\u 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 回复  |  直到 7 年前
        1
  •  1
  •   JonDel    6 年前

    您是否尝试将卷积层添加为模型的第一层?我现在正在使用这种方法,以便将肌电信号分为53类。卷积层应该自动从数据中学习特征,并向LSTM层提供这些特征。有几种可能的体系结构,DeepConvLstm就是其中之一:

    DeepConvLstmArch

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

        2
  •  1
  •   Ahmed El Bakry    4 年前

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

    尝试将验证拆分增加到0.3,以进一步检查问题可能来自何处。如果是这种情况,您可以创建自己的(更具代表性的)验证数据集,并将其传递给模型以提高验证精度。

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

    使用LSTM时,在创建数据集拆分时必须小心,以进一步允许模型生成更精确的序列预测,尤其是当每个 试验 已创建。