【问题标题】:Keras Binary Model Getting stuck at 50% AccuracyKeras 二进制模型陷入 50% 的准确度
【发布时间】:2020-12-04 18:39:03
【问题描述】:

我正在训练一个模型来了解新闻对市场波动的影响。模型似乎找到了,并且数据集类是平衡的,所以我不确定到底出了什么问题。

我使用预训练的词嵌入编写了一个基本模型:

model = tf.keras.models.Sequential([
    tf.keras.layers.Embedding(vocab_size+1, embedding_dim, weights=[embedding_matrix]),
    tf.keras.layers.LSTM(300, return_sequences=True, activation='relu'),
    tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(254, activation='relu')),
    tf.keras.layers.Dropout(0.4),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dropout(0.4),
    tf.keras.layers.Dense(32, activation='relu'),
    tf.keras.layers.Dense(1, activation='sigmoid')
])

model.compile(loss='binary_crossentropy', optimizer='Adam', metrics=['binary_accuracy'])

训练模型,我明白了:

109/109 [==============================] - 265s 2s/step - loss: 0.6945 - 
binary_accuracy: 0.5032 - val_loss: 0.6927 - val_binary_accuracy: 0.5161

109/109 [==============================] - 265s 2s/step - loss: 0.6945 - 
binary_accuracy: 0.5032 - val_loss: 0.6978 - val_binary_accuracy: 0.5123

109/109 [==============================] - 265s 2s/step - loss: 0.6945 - 
binary_accuracy: 0.5032 - val_loss: 0.6859 - val_binary_accuracy: 0.5096

109/109 [==============================] - 265s 2s/step - loss: 0.6945 - 
binary_accuracy: 0.5032 - val_loss: 0.6801 - val_binary_accuracy: 0.5245

我想也许我的问题是数据不相关,模型没有什么可学的,但我什至不确定,实际上,我已经发布了dataset and the notebook on GitHub so that you can reproduce the issue, will be great if you can find what is going on.

【问题讨论】:

  • 坚持使用 RNN 的默认激活。

标签: python python-3.x tensorflow keras


【解决方案1】:

对于 5,000 个示例的数据集大小,您的模型似乎过于复杂。我建议如下:

model = tf.keras.models.Sequential([
    tf.keras.layers.Embedding(vocab_size+1, embedding_dim, weights=[embedding_matrix]),
    tf.keras.layers.LSTM(128, return_sequences=True, activation='relu'),
    tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(128, activation='relu')),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(32, activation='relu'),
    tf.keras.layers.Dense(2, activation='sigmoid')
])

model.compile(loss='binary_crossentropy', optimizer='Adam', metrics=['binary_accuracy'])

请注意,您必须将输出层更改为 2 个神经元:

tf.keras.layers.Dense(2, activation='sigmoid')

你可以通过申请pd.get_dummies(y_train)来做到这一点

另外,将 Dropout 减少到 0.2 并提高学习率。不要忘记对区间 0 到 1 中的数据进行归一化:

def norm(x):
    return (x-np.min(x))/(np.max(x)-np.min(x))

【讨论】:

  • 感谢您的回答。我通过norm() 传递一个热编码标签,但我收到完全相同的输入,没有任何变化。输入在 0 到 1 的范围内(0 或 1),所以我得到的结果与输入相同。
  • 你没有规范标签,你已经对它们进行了热编码。你规范特征。
  • 好吧,但特征是标记的文本,我正在使用一个词嵌入和我用来编码文本的标记器,所以规范化特征会使嵌入层不做任何事情,不会吗?对不起,如果我不能很好地理解你。
  • 二元分类使用两个sigmoid神经​​元是不正确的,如果使用二元交叉熵损失只需要一个sigmoid神经​​元。
  • @Dr.Snoopy 数据集(链接到 GitHub 存储库)试图预测 2 个变量:是否有移动以及移动是向上还是向下。这可能是答案包含 2 个输出的原因......这可能仍然不是最理想的,因为当没有更多输出时,向上/向下位没有意义,您需要预测 3 个类别之一:不动,下移,上移。
猜你喜欢
  • 2019-03-26
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多