neural-network - Keras 高损失,不随 epoch 减少

标签 neural-network keras

我正在学习 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 的准确率?

最佳答案

So why the loss is not going down as some NN tutorials I read?



这可能有很多原因 - 一切都取决于您的数据。以下是您可以调整的内容:
  • 您有一个 非常小批量。尽管某些数据实际上可能对此做出回应,但我认为批量大小为 1在大多数情况下会太小 - 没有开始使用批量大小 1 时显示的结构的冗余性。批量大小非常依赖于您拥有的数据量和类型,但尝试在 20 左右的某个地方 - 30 如果你有足够的数据。
  • 尝试不同的激活函数(但在最后一层总是有 softmaxsigmoid 因为你想要在 01 之间的数字)。
  • 增加第一层和/或第二层的单元数(如果您有足够的数据)。
  • 尝试为 Adam 优化器设置学习率( lr ):model.compile(optimizer=keras.optimizers.Adam(lr=0.001), ...)

  • Is it because the data I provided are just noises



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

    As the acc is always around 0.55(so 50%). does it mean the NN actually achieved better than random guessing (33%)?



    不必要。准确率是衡量正确分类的类的数量。假设验证数据(通常是计算准确性的数据集部分)仅包含来自一类的数据。然后,如果 NN 只将所有内容都归类到这一类,则验证数据将具有 100% 的准确度!

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

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

    关于neural-network - Keras 高损失,不随 epoch 减少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51113328/

    相关文章:

    java - 使用感知器 1 层进行错误学习

    keras - 神经网络只预测二进制类中的一个类

    Python 简单的反向传播没有按预期工作

    python - dropout 中的 keep_prob 值以及通过 dropout 获得最差结果

    artificial-intelligence - 权重初始化

    python - 带有 TimeSeriesGenerator 的 Keras LSTM 自定义数据生成器

    java - 将tensorflow keras LSTM模型转换为.tflite或任何工作格式

    tensorflow - 基于过去和 future 值的每个时间序列步骤的二元分类

    python - 自动编码器的正则化太强(Keras 自动编码器教程代码)

    image-processing - Caffe 支持 16 位图像吗?如果没有,如何实现支持?