K-кратная перекрестная проверка изображений

#keras #deep-learning

#keras #глубокое обучение

Вопрос:

Допустим, у меня есть несколько изображений, разделенных на 3 категории («кошка», «собака», «мышь»), и моя сеть DL написана на keras. Дизайн, который я использовал, такой же, как на этом рисунке (1):

Рисунок 1

Я разделил данные на три разные папки: обучение, проверка и тестирование. Сеть должна быть способна распознавать кошку, собаку или мышь по изображению. Точность, которую я получаю, составляет около 98%.

Это работает. Но мне нужно по некоторым причинам изменить этот дизайн. Я хотел бы использовать K-кратный процесс перекрестной проверки, и теперь схема должна выглядеть как (2):

Рисунок 2

Теперь моя проблема в том, что я не знаю, как разделить и распределить исходные данные в соответствии со схемой на рис. 2.

Я могу представить только 2 разных способа. Давайте на мгновение забудем о тестовом каталоге:

  1. Я создаю 2 папки: «Обучение» и «Проверка». В обоих случаях структура такая же, как на фиг. 1: Три подкаталога для каждой категории. Теперь проблема в следующем: должен ли я перемещать данные при переходе от сгиба 1 к сгибу 3? Или я могу один раз распределить изображения по подкаталогам?

  2. Я создаю 2 папки: «Обучение» и «Проверка», НО я смешиваю все изображения вместе. Нет подкаталога. В этом случае у меня проблема в том, что я теряю связь между именем изображения и домашним животным на нем. Как я могу сообщить Keras, какое животное следует идентифицировать?

Лично я бы смешал все изображения вместе, независимо от того, что они показывают. Но я бы сохранил информацию о содержимом в файле. В этом случае я передаю Keras каталог (для проверки или обучения) и файл, содержащий имена всех файлов и их содержимое.

Что бы вы предложили?

Ответ №1:

Хорошо, я могу ответить на свой собственный вопрос.

Самый простой способ — просто Kfold создать форму пользователя sklearn в скрипте python

 from sklearn.model_selection import KFold
  

После этого вам необходимо выполнить проверку KFold

 kfold = KFold(n_splits = 4, shuffle = True)
  

и вы выполняете итерацию по разделенному набору данных, например:

 datagen = ImageDataGenerator(rescale = 1. / 255.)


for train, test in kfold.split(df_data):
    
    # df is the whole dataset (all together!)
    df_train = df.iloc[train, :]  # Look that train is coming from the for in .. loop
    df_test  = df.iloc[test, :]  # The same for test

    train_generator = datagen.flow_from_dataframe(dataframe = df_train,
                                                  directory = dataset_dir,
                                                  ... )

    test_generator = datagen.flow_from_dataframe(dataframe = df_test,
                                                 directory = dataset_dir,
                                                 ...)


    model = models.Sequential()
    .....

    model.compile(...)
    model.fit(...)
  

и это сделано! Набор данных теперь разделен на разделы!!!
Обратите внимание, что класс ImageDataGenerator отсутствует в цикле for!!!
И обратите внимание, пожалуйста, что методы (модель creation, compile() and fit() ) должны быть в цикле for.

Приведенный выше код работает для меня очень хорошо.