Огромное снижение val_a cc в моей модели обучения, в чем причина? - PullRequest
3 голосов
/ 21 марта 2020

Я тренирую классификатор CAT / DOG.

Моя модель:

model.add(layers.Conv2D(32, (3, 3), activation='relu',
                        input_shape=(150, 150, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dropout(0.5))
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy',
            optimizer=optimizers.RMSprop(lr=1e-4),
            metrics=['acc'])
history = model.fit_generator(
                    train_generator,
                    steps_per_epoch = 100,
                    epochs=200,
                    validation_data=validation_generator,
                    validation_steps=50)

Мой val_a cc ~ 83% , мой val_loss ~ 0.36 между 130th- 140-я эпоха - исключая 136-ю эпоху -.

Epoch 130/200
100/100 [==============================] - 69s - loss: 0.3297 - acc: 0.8574 - val_loss: 0.3595 - val_acc: 0.8331
Epoch 131/200
100/100 [==============================] - 68s - loss: 0.3243 - acc: 0.8548 - val_loss: 0.3561 - val_acc: 0.8242
Epoch 132/200
100/100 [==============================] - 71s - loss: 0.3200 - acc: 0.8557 - val_loss: 0.2725 - val_acc: 0.8157
Epoch 133/200
100/100 [==============================] - 71s - loss: 0.3236 - acc: 0.8615 - val_loss: 0.3411 - val_acc: 0.8388
Epoch 134/200
100/100 [==============================] - 70s - loss: 0.3115 - acc: 0.8681 - val_loss: 0.3800 - val_acc: 0.8073
Epoch 135/200
100/100 [==============================] - 70s - loss: 0.3210 - acc: 0.8536 - val_loss: 0.3247 - val_acc: 0.8357

Epoch 137/200
100/100 [==============================] - 66s - loss: 0.3117 - acc: 0.8602 - val_loss: 0.3396 - val_acc: 0.8351
Epoch 138/200
100/100 [==============================] - 70s - loss: 0.3211 - acc: 0.8624 - val_loss: 0.3284 - val_acc: 0.8185

Интересно, почему это произошло в 136-ю эпоху , val_loss повышен до 0,84 :

Epoch 136/200
100/100 [==============================] - 67s - loss: 0.3061 - acc: 0.8712 - val_loss: 0.8448 - val_acc: 0.6881

Это было крайне неудачное выпадение , при этом все важные значения были удалены из матрицы активации или что?

Вот мой окончательный результат:

i.stack.imgur.com/BScxe.png

Как модель может решить эту проблему?

Спасибо: )

Ответы [ 2 ]

1 голос
/ 21 марта 2020

Нормально, что значения колеблются. В вашем случае это может быть объяснено значением вашей скорости обучения и большим количеством эпох.

Вы слишком долго тренируетесь, вы достигли плато (точность не улучшается). Использование больших показателей обучения в конце обучения может вызвать проблемы с плато или конвергенцией.

learning rate vs validation accuracy

На рисунке видно, что для скорости обучения = 0,1 он достигает высокой точности очень быстро, но затем плато и падает в точности. Для скорости обучения = 0,001 она достигает высокой точности медленнее, но постоянно увеличивается.

Так что, в вашем случае, я думаю, что проблема заключается в большой скорости обучения к концу обучения. Вы можете использовать переменную скорость обучения, чтобы получить лучшее из обоих миров, сначала большое, но ближе к концу. Например, после того, как точность не увеличивается более чем на 0,1%, скорость обучения снижается до 0,0000001.

Это можно сделать с помощью LearningRateScheduler или ReduceLROnPlateau из keras callbacks

reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2,
                          patience=5, min_lr=1e-10)
model.fit_generator(
    train_generator,
    steps_per_epoch = 100,
    epochs=200,
    validation_data=validation_generator,
    validation_steps=50,
    callbacks=[reduce_lr])
1 голос
/ 21 марта 2020

Архитектура, которую вы используете, чем-то похожа на VGG.

Это внезапное падение, которое вы экспериментируете, связано с тем, что ваша модель просто начинает сильно переоснащаться после этой эпохи.

Дополнительное наблюдение, исходя из личного опыта, заключается в том, что внезапное / такое огромное расхождение между обучением и проверкой на продвинутом этапе обучения имеет место в сетях, которые не имеют пропускаемых соединений. Обратите внимание, что это явление, о котором я имею в виду, отличается от «простого» переоснащения.

Сети, в которых есть пропускаемые соединения, не демонстрируют этого явления внезапного огромного падения (особенно на продвинутом этапе на этапе обучения). , Основная интуиция заключается в том, что с помощью этих пропущенных соединений поток информации градиента не теряется. Тем не менее, в очень глубокой сверточной нейронной сети, которая не имеет таких соединений, вы можете прийти к точке, где у вас внезапное падение (даже с точки зрения точности обучения из-за исчезающего градиента).

Для получения дополнительной информации о пропущенных / остаточных соединениях, читайте больше здесь: https://www.quora.com/How-do-skip-connections-work-in-a-fully-convolutional-neural-network.

ОБНОВЛЕНИЕ (согласно загруженным фотографиям):

Внезапное падение вызвано только пакетное обучение (надеюсь, вы не в том случае, который я описал выше). Когда мы используем пакетное обучение (так как у нас недостаточно памяти для размещения всего набора данных одновременно). Колебания нормальные, просто так получилось, что в эту конкретную эпоху веса имели такие значения, что точность значительно снизилась. Действительно, снижение скорости обучения поможет вам получить более высокую точность и достоверность проверки, поскольку это поможет нейросети «выйти» из возможного состояния плато.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...