Keras: val_loss увеличивается и оценивает потери слишком высоко - PullRequest
0 голосов
/ 11 февраля 2020

Я новичок в 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]

Это нормально, или это признак переоснащения? Должен ли я сделать что-то, чтобы улучшить это? Заранее спасибо.

1 Ответ

0 голосов
/ 11 февраля 2020

Обычно это не хорошо. Вы хотите, чтобы уровень потерь был как можно меньше. Ваш результат типичен для переоснащения. Ваша Сеть «знает» свои обучающие данные, но не способна анализировать новые Изображения. Вы можете добавить несколько слоев. Может быть, Convolutional Layers, Dropout Layer ... другой идеей было бы улучшить ваши тренировочные образы. Класс ImageDataGenerator, предоставленный Keras, может помочь вам здесь

Еще одна вещь, на которую стоит обратить внимание, это ваши гиперпараметры. Почему вы используете 100 узлов в первом dense слое? может быть, что-то вроде 784 (28 * 28) кажется более интересным, если вы хотите начать со слоя dense. Я хотел бы предложить некоторую комбинацию Convolutional - Dropout - Dense. Тогда вашему dense -уровню, возможно, не нужно столько узлов ...

...