我是 Keras 的新手,正在使用它构建一个普通的神经网络来对 MNIST 数据集中的数字进行分类。
在此之前,我已经将数据分为三部分: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 samplesEpoch 1/2055000/55000 [==============================] - 5s 91us/sample - loss: 0.2822 - accuracy: 0.9199 - val_loss: 0.1471 - val_accuracy: 0.9588Epoch 2/2055000/55000 [==============================] - 5s 82us/sample - loss: 0.1274 - accuracy: 0.9626 - val_loss: 0.1011 - val_accuracy: 0.9710Epoch 3/2055000/55000 [==============================] - 5s 83us/sample - loss: 0.0899 - accuracy: 0.9734 - val_loss: 0.0939 - val_accuracy: 0.9742Epoch 4/2055000/55000 [==============================] - 5s 84us/sample - loss: 0.0674 - accuracy: 0.9796 - val_loss: 0.0760 - val_accuracy: 0.9770Epoch 5/2055000/55000 [==============================] - 5s 94us/sample - loss: 0.0541 - accuracy: 0.9836 - val_loss: 0.0842 - val_accuracy: 0.9742Epoch 15/2055000/55000 [==============================] - 4s 82us/sample - loss: 0.0103 - accuracy: 0.9967 - val_loss: 0.0963 - val_accuracy: 0.9788Epoch 16/2055000/55000 [==============================] - 5s 84us/sample - loss: 0.0092 - accuracy: 0.9973 - val_loss: 0.0956 - val_accuracy: 0.9774Epoch 17/2055000/55000 [==============================] - 5s 82us/sample - loss: 0.0081 - accuracy: 0.9977 - val_loss: 0.0977 - val_accuracy: 0.9770Epoch 18/2055000/55000 [==============================] - 5s 85us/sample - loss: 0.0076 - accuracy: 0.9977 - val_loss: 0.1057 - val_accuracy: 0.9760Epoch 19/2055000/55000 [==============================] - 5s 83us/sample - loss: 0.0063 - accuracy: 0.9980 - val_loss: 0.1108 - val_accuracy: 0.9774Epoch 20/2055000/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]
这是正常的吗,还是过拟合的迹象?我应该做些什么来改进它?提前感谢。
回答:
通常情况下,这是不正常的。你希望损失率尽可能小。你的结果是典型的过拟合现象。你的网络“知道”它的训练数据,但无法分析新的图像。你可能需要添加一些层。也许是卷积层、Dropout层……另一个想法是增强你的训练图像。Keras 提供的 ImageDataGenerator
类可能在这里帮到你。
你还可以看看你的超参数。为什么在第一个 dense
层使用 100 个节点?也许像 784(28*28)这样的数字更有趣,如果你想从 dense
层开始。我建议一些 Convolutional
–Dropout
–Dense
的组合。这样你的 dense
层可能不需要那么多节点…