首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >改进Keras模型精度Conv1D和LSTM

改进Keras模型精度Conv1D和LSTM
EN

Stack Overflow用户
提问于 2021-03-11 08:31:57
回答 1查看 629关注 0票数 0

我有一个需要预测目标的数据集,它是或1

对我来说,很高兴知道这个预测接近,比如0.20,或者接近1,比如0.89等等。

我的模型结构是:

代码语言:javascript
运行
复制
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

培训的详细内容如下:

代码语言:javascript
运行
复制
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码

EN

回答 1

Stack Overflow用户

发布于 2021-03-11 10:45:42

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

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

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

最佳实践regularization,使用诸如退出、批处理规范化和内核&胫骨正则化之类的东西,即(粗略地说)以避免过度拟合。在默认情况下,应该使用而不是,并且这样做是众所周知的,以防止学习(就像这里看起来的那样):

  • 拆下所有脱落层
  • 删除所有批处理归一化层
  • 删除所有内核、偏见和活动正则化器。

您可以考虑在后面一步一步地添加其中的一些,但前提是您看到了过度适应的迹象。

General advice.现在,优化器的首选通常是Adam,因此将其作为第一种方法更改为optimizer='adam'

也就是说,归根结底,一切都取决于您的数据(包括数据的数量和质量)以及需要解决的特定问题。实验是王者(但要记住上面所述的一般原则)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66578873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档