Точность проверки Keras увеличивается - PullRequest
0 голосов
/ 03 марта 2020

Обновлено: увеличен диапазон поворота до 180, добавлен GaussianNoise. см. коды

Я использую CNN для классификации изображений. У меня есть 2 класса 3500 серых фото каждого в наборе учебных данных и 1000 каждого в наборе данных проверки. Проблема в том, что сначала поезд 5-10 эпох a cc действителен, а cc увеличивается, но затем действительный cc начинает столь резко уменьшаться, в то время как поезд cc продолжает увеличиваться.

Старая картинка enter image description here

Я видел, что это из-за перегрузки, но я также пытался справиться с перегрузкой, поместив некоторые параметры в ImageDataGenerator.

train_image_generator = ImageDataGenerator(rescale=1. / 255,
                                           rotation_range=180,
                                           width_shift_range=.15,
                                           height_shift_range=.15,
                                           horizontal_flip=True,
                                           fill_mode='nearest',
                                           shear_range=0.05,
                                           zoom_range=0.5
                                           )

Также я поместил Dropout слоев в архитектуру CNN.

model = Sequential([
    GaussianNoise(0.01, input_shape=(IMG_HEIGHT, IMG_WIDTH, 1)),
    Conv2D(16, 3, padding='same', activation='relu', input_shape=(IMG_HEIGHT, IMG_WIDTH, 1)),
    Dropout(0.7),
    MaxPooling2D(),

    Conv2D(32, 3, padding='same', activation='relu'),
    Dropout(0.7),
    MaxPooling2D(),
    Dropout(0.5),

    Conv2D(64, 3, padding='same', activation='relu'),
    Dropout(0.7),
    MaxPooling2D(),
    Dropout(0.5),

    Flatten(),
    Dropout(0.7),

    Dense(512, activation='relu'),
    Dense(2, activation='softmax')
])

Я настроил Скорость обучения:

adamOpti = Adam(lr=0.00005)
model.compile(optimizer=adamOpti,
              loss="categorical_crossentropy",
              metrics=['accuracy'])

Даже я установил up EarlyStopping тоже:

es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=200)
mc = ModelCheckpoint('best_model.h5', monitor='val_acc', mode='max', verbose=1, save_best_only=True)

TL, DR Список того, что я пробовал для переоснащения сделки:

  1. Увеличение изображения
  2. Уменьшение количества слоев и нейронов
  3. Генератор изображений в случайном порядке
  4. Выпадения
  5. Ранняя остановка
  6. Скорость обучения мелодии
  7. Больше данных (до сих пор не знаю, когда и когда)

Не знаю, осталось ли что-то, что я пропустил. Все комментарии приветствуются. Заранее спасибо

1 Ответ

0 голосов
/ 03 марта 2020

Я бы предложил начать с процесса увеличения изображения. Добавьте размытие, поворот, шум, обрезку и т. Д. c к своим изображениям, чтобы модель не видела один и тот же набор изображений снова и снова. Как бы интуитивно это ни казалось, вам нужно усложнить свою модель, добавив разнообразие. Это позволит лучше обобщать.

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

Наконец, вы можете увеличить размер пакета, если ваше оборудование будет поддерживать его, чтобы увеличить разнообразие изображений в пакете.

Редактировать:

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

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