CNN имеет высокий уровень переобучения, несмотря на наличие отсевов? - PullRequest
0 голосов
/ 09 мая 2020

Для некоторого фона мой набор данных составляет примерно 75000+ изображений, 200x200 оттенков серого, с 26 классами (буквы алфавита). Моя модель:

model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(200, 200, 1))) 
model.add(MaxPooling2D((2, 2)))
model.add(Dropout(0.2))
model.add(Conv2D(64, (3, 3), activation='relu')) 
model.add(MaxPooling2D((2, 2)))
model.add(Dropout(0.2))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(26, activation='softmax'))


model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=[tf.keras.metrics.CategoricalAccuracy()]) 

model.fit(X_train, y_train, epochs=1, batch_size=64, verbose=1, validation_data=(X_test, y_test))

Результат model.fit:

Train on 54600 samples, validate on 23400 samples
Epoch 1/1
54600/54600 [==============================] - 54s 984us/step - loss: nan - categorical_accuracy: 0.9964 - val_loss: nan - val_categorical_accuracy: 0.9996

99.9 + точность оценки. Когда я запускаю тест, все прогнозы неверны. Итак, я предполагаю, что это переоснащение. Почему это происходит, несмотря на добавление выпадающих слоев? Какие еще варианты у меня есть, чтобы это исправить? Спасибо!

Ответы [ 2 ]

1 голос
/ 09 мая 2020

Единственный способ получить все прогнозы на удерживаемом наборе тестов неверны, одновременно получив почти 100% точность проверки, - это утечка данных. т.е. ваши обучающие данные должны содержать те же изображения, что и ваши данные проверки (или они ОЧЕНЬ похожи до точки идентичности).

Или данные в вашем тестовом наборе сильно отличаются от ваших наборов данных для обучения и проверки.

Чтобы исправить это, убедитесь, что для всех ваших наборов данных ни одно изображение не существует более чем в одном из наборов данных. Также убедитесь, что изображения в целом похожи. т.е. если вы тренируетесь с использованием фотографий с мобильного телефона, не проверяйте их с изображениями, снятыми с помощью DSLR, или изображениями с водяными знаками, взятыми из Google.

Также странно, что ваша потеря составляет nan. Это может быть связано с категориальной точностью. Чтобы исправить это, просто установите метрику c как «точность». Это будет динамически определять наилучшую точность для использования. Один из [binary, categorical or sparse_categorical].

Надеюсь, это поможет.

0 голосов
/ 09 мая 2020

Это совершенно не переобучение, посмотрите на свои потери, они равны нан. Это означает, что ваши градиенты резко выросли во время обучения. Чтобы увидеть, что происходит на самом деле, я рекомендую вам смотреть на потери после каждой мини-партии и видеть, в какой момент они становятся нан.

...