【问题标题】:Keras high loss, not decreasing with each epochKeras 高损失,不随每个 epoch 减少
【发布时间】:2018-06-30 08:48:26
【问题描述】:

我正在学习 NN 和 Keras。我的测试数据是这样的:

Result, HomeWinPossibility, DrawPossibility, AwayWinPossibility
[['AwayWin' 0.41 0.28 0.31]
 ['HomeWin' 0.55 0.25 0.2]
 ['AwayWin' 0.17 0.21 0.62]
 .....

这是我的模型:

model = Sequential()
model.add(Dense(16, input_shape=(3,)))
model.add(Activation('sigmoid'))
model.add(Dense(8, activation='relu'))
model.add(Dense(3))
model.add(Activation('softmax'))
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=["accuracy"])
model.fit(train_X, train_y_ohe, epochs=100, batch_size=1, verbose=1);

fit 的输出是:

Epoch 1/100
190/190 [==============================] - 1s 3ms/step - loss: 0.9151 - acc: 0.5737
Epoch 2/100
190/190 [==============================] - 1s 3ms/step - loss: 0.9181 - acc: 0.5474
Epoch 3/100
190/190 [==============================] - 1s 3ms/step - loss: 0.9111 - acc: 0.5526
Epoch 100/100
190/190 [==============================] - 1s 3ms/step - loss: 0.9130 - acc: 0.5579

那么为什么损失没有像我阅读的一些 NN 教程那样下降呢?是不是因为我提供的数据只是噪音,所以 NN 找不到任何线索或我的模型不正确的地方?

由于acc 始终在 0.55 左右(即 50%),这是否意味着 NN 实际上比随机猜测更好(> 33%)?如果这是真的,为什么它在第一个 epoch 就达到了 0.57 的准确率?

【问题讨论】:

  • 我建议修改以下内容。 1. 如果你有足够的数据增加前两层的数量单元 2. 将 sigmoid 激活更改为 relu 3. 增加批量大小,例如到 32 岁
  • 您能否提供有关该问题的更多信息?即输入特征是什么?

标签: neural-network keras


【解决方案1】:

那么为什么损失没有像我阅读的一些 NN 教程那样下降?

可能有很多原因 - 完全取决于您的数据。以下是您可以调整的内容:

  • 您的批次大小非常小。尽管 一些 数据实际上可能会对此做出响应,但我认为在大多数情况下,1 的批处理大小太小了 - 没有开始了解使用批处理大小时显示的结构的冗余性1. 批量大小很大程度上取决于您拥有的数据量和类型,但如果您有足够的数据,请尝试 2​​0-30 左右。

  • 尝试不同的激活函数(但始终在最后一层使用 softmaxsigmoid,因为您需要介于 01 之间的数字)。

  • 增加第一层和/或第二层的单元数量(如果您有足够的数据)。

  • 尝试为 Adam 优化器设置学习率 (lr):model.compile(optimizer=keras.optimizers.Adam(lr=0.001), ...)

是不是因为我提供的数据只是噪音

如果您的数据是跨类的纯噪声,那么很可能,考虑到每个类中的数据点数量大致相同,准确度将在 33% 左右,因为它基本上只是随机猜测。

因为 acc 总是在 0.55 左右(所以 50%)。这是否意味着神经网络实际上比随机猜测更好(33%)?

不一定。准确度是衡量有多少类被正确分类的指标。假设验证数据(通常是计算准确性的数据集部分)仅包含一个类别的数据。那么,如果 NN 只将所有内容归为这一类,则验证数据将具有 100% 的准确率!

这意味着,如果每个类别的数据点数量不同,则不能单独信任准确性!在数据集不平衡的情况下,一个更好的衡量标准是例如AUC(ROC 曲线下面积)或 F1 分数,它也考虑了误报。


我建议您研究一下这背后的理论。只是盲目地跑来跑去可能会很烦人,因为你很难获得好的结果。即使你取得了好的结果,它们也可能往往不如你想象的那么好。一个阅读的地方是Ian Goodfellow's book on deep learning

【讨论】:

  • 非常感谢您的回复。我从某个 bookie 那里收集了数据,想看看 bookie 的概率数据是否与最终结果有任何关系。当然,我不会在每个类中看到相同数量的数据点。
猜你喜欢
  • 2016-07-02
  • 2019-12-04
  • 2020-06-06
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2021-04-13
相关资源
最近更新 更多