CNN переоснащение набора проверки увеличивает производительность набора тестирования - PullRequest
2 голосов
/ 16 мая 2019

Я на самом деле использую CNN для классификации изображений. Я получил 16 классов и около 3000 изображений (очень маленький набор данных). Это набор данных дисбаланса. Я делаю 60/20/20 сплит, с одинаковым процентом каждого класса во всем наборе. Я использую регуляризацию весов. Я сделал тест с дополнением данных (keras augmenteur, SMOTE, ADSYN), которые помогают предотвратить переобучение

Когда я одеваюсь (epoch=350, loss=2), моя модель демонстрирует лучшую (70 +%) точность (и другие показатели, такие как оценка F1), чем когда я не одеваюсь (epoch=50, loss=1). составляет около 60%. Точность указана для ТЕСТА, установленного, когда потеря - это потеря набора проверки.

Неужели плохая модель - это лучшая модель? Так как производительность на тестовом наборе лучше?

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

РЕДАКТИРОВАТЬ: Что касается того, что я прочитал, потеря проверки не всегда является лучшим показателем для подтверждения того, что модель является чрезмерной. В моей ситуации лучше использовать балл F1 для проверки и вспомнить, когда он начинает уменьшаться, тогда модель, вероятно, перегружена. Я до сих пор не понимаю, почему потеря оценки является плохим показателем для оценки модели, тем не менее, потеря обучения используется моделью для изучения

1 Ответ

2 голосов
/ 16 мая 2019

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

Чтобы избежать чрезмерной подгонки, используйте увеличение изображения, чтобы сбалансировать и увеличить количество сэмплов для обучения.Также попытайтесь увеличить долю выпадения, чтобы избежать перебора.Я лично использую ImageGenerator от Keras для увеличения изображений и их сохранения.

from keras.preprocessing.image import ImageDataGenerator,img_to_array, load_img
import glob
import numpy as np

#There are other parameters too. Check the link given at the end of the answer
datagen = ImageDataGenerator(
        brightness_range = (0.4, 0.6),
        horizontal_flip = True,
        fill_mode='nearest'
        )

for i, image_path in enumerate(glob.glob(path_to_images)):
    img = load_img(image_path)

    x = img_to_array(img)  # creating a Numpy array

    x = x.reshape((1,) + x.shape)

    i = 0
    num_of_samples_per_image_augmentation = 8

    for batch in datagen.flow(x, save_to_dir='augmented-images/preview/fist', save_prefix='fist', save_format='jpg'):
        i += 1
        if i > num_of_samples_per_image_augmentation : # 
            break

Вот ссылка на параметры увеличения изображения с использованием Keras, https://keras.io/preprocessing/image/

Не стесняйтесь использовать другие библиотеки по вашему усмотрению.

Несколько других способов уменьшитьпереоснащение:

1) Настройте модель CNN, добавив дополнительные параметры обучения.

2) Сократите полностью подключенные слои.

3) Используйте трансферное обучение (предварительно обученные модели))

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