【问题标题】:Keras: val_loss is increasing and evaluate loss is too highKeras:val_loss 正在增加并且评估损失太高
【发布时间】:2020-05-26 13:28:16
【问题描述】:

我是 Keras 的新手,我正在使用它来构建一个普通的神经网络来对数字 MNIST 数据集进行分类。
事先我已经将数据分成 3 部分:55000 用于训练、5000 用于评估和 10000 用于测试,并且我已经缩小了像素密度(将其除以 255.0)
我的模型如下所示:

model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28,28]))
model.add(keras.layers.Dense(100, activation='relu'))
model.add(keras.layers.Dense(10, activation='softmax'))

这里是编译:

model.compile(loss='sparse_categorical_crossentropy',
              optimizer = 'Adam',
              metrics=['accuracy'])

我训练模型:

his = model.fit(xTrain, yTrain, epochs = 20, validation_data=(xValid, yValid))

首先 val_loss 减小,然后增加,但准确率在增加。

Train on 55000 samples, validate on 5000 samples
Epoch 1/20
55000/55000 [==============================] - 5s 91us/sample - loss: 0.2822 - accuracy: 0.9199 - val_loss: 0.1471 - val_accuracy: 0.9588
Epoch 2/20
55000/55000 [==============================] - 5s 82us/sample - loss: 0.1274 - accuracy: 0.9626 - val_loss: 0.1011 - val_accuracy: 0.9710
Epoch 3/20
55000/55000 [==============================] - 5s 83us/sample - loss: 0.0899 - accuracy: 0.9734 - val_loss: 0.0939 - val_accuracy: 0.9742
Epoch 4/20
55000/55000 [==============================] - 5s 84us/sample - loss: 0.0674 - accuracy: 0.9796 - val_loss: 0.0760 - val_accuracy: 0.9770
Epoch 5/20
55000/55000 [==============================] - 5s 94us/sample - loss: 0.0541 - accuracy: 0.9836 - val_loss: 0.0842 - val_accuracy: 0.9742

Epoch 15/20
55000/55000 [==============================] - 4s 82us/sample - loss: 0.0103 - accuracy: 0.9967 - val_loss: 0.0963 - val_accuracy: 0.9788
Epoch 16/20
55000/55000 [==============================] - 5s 84us/sample - loss: 0.0092 - accuracy: 0.9973 - val_loss: 0.0956 - val_accuracy: 0.9774
Epoch 17/20
55000/55000 [==============================] - 5s 82us/sample - loss: 0.0081 - accuracy: 0.9977 - val_loss: 0.0977 - val_accuracy: 0.9770
Epoch 18/20
55000/55000 [==============================] - 5s 85us/sample - loss: 0.0076 - accuracy: 0.9977 - val_loss: 0.1057 - val_accuracy: 0.9760
Epoch 19/20
55000/55000 [==============================] - 5s 83us/sample - loss: 0.0063 - accuracy: 0.9980 - val_loss: 0.1108 - val_accuracy: 0.9774
Epoch 20/20
55000/55000 [==============================] - 5s 85us/sample - loss: 0.0066 - accuracy: 0.9980 - val_loss: 0.1056 - val_accuracy: 0.9768

而当我评估损失太高时:

model.evaluate(xTest, yTest)

结果:

10000/10000 [==============================] - 0s 41us/sample - loss: 25.7150 - accuracy: 0.9740
[25.714989705941953, 0.974]

这样可以吗,还是过度拟合的迹象?我应该做些什么来改善它吗?提前致谢。

【问题讨论】:

    标签: python tensorflow machine-learning keras neural-network


    【解决方案1】:

    通常情况下是不行的。您希望损失率尽可能小。您的结果是典型的过度拟合。您的网络“知道”其训练数据,但无法分析新图像。您可能想要添加一些图层。也许卷积层、Dropout 层……另一个想法是增加你的训练图像。 Keras 提供的ImageDataGenerator-Class 可能会帮助你

    要查看的另一件事可能是您的超参数。为什么在第一个dense 层中使用 100 个节点?如果你想从dense 层开始,也许像 784 (28*28) 这样的东西看起来更有趣。我建议Convolutional-Dropout-Dense 的一些组合。那么您的dense -layer 可能不需要那么多节点...

    【讨论】:

    • 这个答案不清楚。如果过拟合是问题,随机添加层只会导致更多过拟合。另一方面,Dropout 层可能会有所帮助。您所说的“损失率”和“通常情况下,这不好”是什么意思?为什么 784 的尺寸“看起来更有趣”?
    • @ Mathias Müller 我从来没有说过“随机”添加层我只是提到 2 个密集层可能还不够,这就是为什么我建议使用卷积层,因为它们高度用于图像-数据解读……当然,问题的作者不能随便添加一些层……他可能需要更好更大的层结构。使用“损失率”,我指的是他在“结果”中的损失为 25,7150,他问如果它那么高(问题的最后)是否“可以”,所以回答不是。
    • @Mathias Müller 似乎“更有趣”,因为 100 个节点听起来有点随机,使用 784 等节点可能会带来更好的结果。但是没有像“正确”数量的节点这样的东西......它总是需要调整和微调,所以我建议使用在某种程度上与他的数据集相关的值,而不仅仅是 100 的随机值
    • 这与 - 同时 - 1) 指出问题是过度拟合和 2) 建议为模型增加容量是矛盾的。添加更多层会导致 more 过拟合。这是个坏建议。推荐一个大容量模型并结合验证数据的早期停止会更有帮助。
    • @Mathias Müller 抱歉,如果我不清楚。我正在解决2个问题。第一个是过拟合,可以通过 dropout 和数据增强来解决。第二个是模型结构本身,我的观点是,当他的网络停止过度拟合时,他仍然可能想考虑使用可能产生更好结果的 CNN。就我的经验而言,添加更多的层并不总是会导致更多的过度拟合,这可能是这种情况,但在我的一些项目中,这似乎并没有发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 2021-11-19
    • 2020-02-28
    • 2019-12-04
    • 2018-03-10
    相关资源
    最近更新 更多