CNN-разделить изображения на обучение / валидацию / тестирование - PullRequest
0 голосов
/ 19 января 2019

Я пытаюсь разделить мои изображения (набор данных о кроликах и собаках) на x_train, x_val, y_train, y_val и тестирование.

Вот что я сделал:

Я поместил фотографии каждого класса (собак / кроликов) в отдельные папки в двух папках: обучение и тестирование.

Учебный каталог-> Каталог зайчиков -> Картинки зайчиков

Учебный каталог-> Каталог щенков -> Изображения щенков

Каталог тестирования-> Каталог зайчиков -> изображения зайчиков

Каталог тестирования-> Каталог щенков -> Изображения щенков

Я использовал следующий код для получения изображений из папок:

training_data = train_datagen.flow_from_directory('./images/train',
                                             target_size = (28, 28),
                                             batch_size = 86,
                                             class_mode = 'binary',
                                             color_mode='rgb',
                                             classes=None)


test_data = test_datagen.flow_from_directory('./images/test',
                                        target_size = (28, 28),
                                        batch_size = 86,
                                        class_mode = 'binary',
                                        color_mode='rgb',
                                        classes=None)

Что дает мне следующий вывод:

Найдено 152 изображения 2 классов.

Найдено 23 изображений, относящихся к 2 классам.

Вопрос 1: Я не был уверен, как определить мои метки здесь (y_val / y_train) или нужно ли мне (но похоже, что большинство моделей имеют y_val / y_train).

Вопрос 2: Я пытался запустить

x_train, x_val = train_test_split(training_data, test_size=0.1)

Чтобы хотя бы разделить мои тренировочные данные на валидацию / тренировку, но когда я попытался запустить свою модель, она выдала мне следующую ошибку:

history=classifier.fit_generator(x_train,
                     steps_per_epoch = (8000 / 86),
                     epochs = 2,
                     validation_data = x_val,
                     validation_steps = 8000/86,
                     callbacks=[learning_rate_reduction])

ValueError: validation_data должен быть кортежем (val_x, val_y, val_sample_weight) или (val_x, val_y).

Найдено: [(массив ([[[0.5058095, 0.46913707, 0.42369673], ...

1 Ответ

0 голосов
/ 19 января 2019

Вопрос 1:

По моему опыту, нет никаких заметных ограничений в именовании переменных y, x. Например, в этом ядре человек использует y_train, y_test имен для меток, а здесь человек использует train_Y. Есть правило, что вы должны давать имена, которые показывают, о чем эта переменная.

Вопрос 2:

Я бы рекомендовал использовать параметр validation_split в ImageDataGenerator ( doc ) для настройки части изображений, зарезервированных для проверки. После этого я рекомендую использовать параметр subset в flow_from_directory ( doc ) для определения training_generator и validation generator переменных. (Я хочу указать, что flow_from_directory возвращает генератор, а не данные).

Ваш код будет выглядеть так:

data_generator = ImageDataGenerator(
    validation_split=0.2,
    rescale=1./255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
)

train_generator = data_generator.flow_from_directory(
    './images/train',
    target_size = (28, 28),
    batch_size = 86,
    class_mode = 'binary',
    color_mode='rgb',
    classes=None, subset="training"
)

validation_generator = data_generator.flow_from_directory(
    './images/train',
    target_size = (28, 28),
    batch_size = 86,
    class_mode = 'binary',
    color_mode='rgb',
    classes=None, subset="validation"
)

history=classifier.fit_generator(
    train_generator,
    steps_per_epoch = (8000 / 86),
    epochs = 2,
    validation_data = validation_generator,
    validation_steps = 8000/86,
    callbacks=[learning_rate_reduction]
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...