首页 > 解决方案 > 提高 Keras 模型精度 Conv1D 和 LSTM

问题描述

我有一个数据集,我需要预测目标,它是01
对我来说很高兴知道预测接近0,例如 0.20 或接近1,例如 0.89 等等。

我的模型结构是这样的:

model = Sequential()

model.add(Conv1D(filters=32, kernel_size=2, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=1, strides=1))
model.add(LSTM(128, return_sequences=True, recurrent_dropout=0.2,activation='relu'))
model.add(Dense(128, activation="relu",
                kernel_regularizer=regularizers.l1_l2(l1=1e-5, l2=1e-4), 
                bias_regularizer=regularizers.l2(1e-4),
                activity_regularizer=regularizers.l2(1e-5)))
model.add(Dropout(0.4))

model.add(Conv1D(filters=32, kernel_size=2, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=1, strides=1))
model.add(LSTM(64, return_sequences=True,activation='relu'))
model.add(Dense(64, activation="relu",kernel_regularizer=regularizers.l1_l2(l1=1e-5, l2=1e-4), 
    bias_regularizer=regularizers.l2(1e-4),
    activity_regularizer=regularizers.l2(1e-5)))
model.add(Dropout(0.4))

model.add(Conv1D(filters=32, kernel_size=2, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=1, strides=1))
model.add(LSTM(32, return_sequences=True, recurrent_dropout=0.2, activation='relu'))
model.add(Dense(32, activation="relu",kernel_regularizer=regularizers.l1_l2(l1=1e-5, l2=1e-4), 
    bias_regularizer=regularizers.l2(1e-4),
    activity_regularizer=regularizers.l2(1e-5)))
model.add(Dropout(0.4))

model.add(BatchNormalization())

model.add(Dense(1, activation='linear'))

from keras.metrics import categorical_accuracy
model.compile(optimizer='rmsprop',loss="mse",metrics=['accuracy'])
model.fit(X_train,y_train,epochs=1000, batch_size=16, verbose=1, validation_split=0.1, callbacks=callback)

模型摘要在这里:https ://pastebin.com/Ba6ErEzj

训练的详细程度是:

Epoch 58/1000
277/277 [==============================] - 1s 5ms/step - loss: 0.2510 - accuracy: 0.4937 - val_loss: 0.2523 - val_accuracy: 0.4878
Epoch 59/1000
277/277 [==============================] - 1s 5ms/step - loss: 0.2515 - accuracy: 0.4941 - val_loss: 0.2504 - val_accuracy: 0.5122

我该如何改进呢?0 或 1 输出的 0.50 左右的精度是没有用的。
这是我的Colab 代码

标签: pythonkerasdeep-learningconv-neural-networklstm

解决方案


总结建议(一些已经在评论中提供),并有一些理由......

错误。您处于二进制分类设置中,因此:

  • 使用 MSE 是错误的;你应该使用loss='binary_crossentropy'
  • 在最后一个单节点层中,您应该使用activation='sigmoid'.

最佳实践。诸如 dropout、batch normalization 和 kernel & bial regularizers 之类的东西用于正则化,即(粗略地说)以避免过度拟合。默认情况下不应使用它们,众所周知,这样做会阻止学习(这里似乎就是这种情况):

  • 移除所有 dropout 层
  • 删除所有批量标准化层
  • 删除所有内核、偏差和活动正则化器。

您可以考虑稍后逐步添加其中的一些,但前提是您看到过度拟合的迹象。

一般建议。如今,优化器的首选通常是 Adam,因此将 tooptimizer='adam'作为首选方法。

也就是说,归根结底,一切都取决于您的数据(它们的数量和质量)以及要解决的特定问题。实验为王(但请牢记上述一般原则)。


推荐阅读