python - 提高 Keras 模型精度 Conv1D 和 LSTM
问题描述
我有一个数据集,我需要预测目标,它是0或1,
对我来说很高兴知道预测接近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 代码。
解决方案
总结建议(一些已经在评论中提供),并有一些理由......
错误。您处于二进制分类设置中,因此:
- 使用 MSE 是错误的;你应该使用
loss='binary_crossentropy'
- 在最后一个单节点层中,您应该使用
activation='sigmoid'
.
最佳实践。诸如 dropout、batch normalization 和 kernel & bial regularizers 之类的东西用于正则化,即(粗略地说)以避免过度拟合。默认情况下不应使用它们,众所周知,这样做会阻止学习(这里似乎就是这种情况):
- 移除所有 dropout 层
- 删除所有批量标准化层
- 删除所有内核、偏差和活动正则化器。
您可以考虑稍后逐步添加其中的一些,但前提是您看到过度拟合的迹象。
一般建议。如今,优化器的首选通常是 Adam,因此将 tooptimizer='adam'
作为首选方法。
也就是说,归根结底,一切都取决于您的数据(它们的数量和质量)以及要解决的特定问题。实验为王(但请牢记上述一般原则)。
推荐阅读
- r - 用R中的连续有序值替换数组中的有序值
- javascript - 如何使用 php 和 jquery 打印工作表
- elasticsearch - 使用 es2csv 将数据从 Elasticsearch 导出到 CSV 文件
- angular - myCodeMirror.getValue() 为空 Typescript CodeMirror
- c++ - 使用非参数模板参数调用 lambda
- amazon-web-services - 为私有 AMI 的 EC2 实施标签策略
- php - PHP array_values 按给定索引排序
- android - Expo android 应用程序在广告更新后崩溃
- pandas - Pandas DataFrame 组合和扩展
- javascript - 单元格渲染器在反应列中返回对象