Увеличение Keras при обучении и валидации - PullRequest
0 голосов
/ 25 апреля 2019

Я выполняю расширение для целей классификации изображений - используя Keras - как:

# Define Parameters
parameters = {"img_width" : 224,
              "img_height": 224,
              "epochs": 50,
              "batch_size" : 15}

# Define Generators  
train_datagen = ImageDataGenerator(
    rescale = 1. / 255,
    shear_range = 0.2,
    zoom_range = 0.2,
    horizontal_flip = True,
    validation_split = 0.06)

test_datagen = ImageDataGenerator(
    rescale=1/255)

# Define Flows from directories
train_generator = train_datagen.flow_from_directory(
    directory = train_data_dir,
    target_size=(parameters["img_width"], parameters["img_height"]),
    batch_size = parameters["batch_size"],
    class_mode= "categorical", 
    subset = "training", 
    color_mode = "rgb",
    seed = 42)

validation_generator = train_datagen.flow_from_directory(
    directory = train_data_dir,
    target_size = (parameters["img_width"], parameters["img_height"]),
    batch_size = parameters["batch_size"],
    class_mode='categorical',
    subset = "validation",
    color_mode = "rgb",
    seed = 42)

testing_generator = test_datagen.flow_from_dataframe(
        dataframe = testing_df, 
        x_col="path", y_col="label", 
        class_mode="raw", 
        target_size= (parameters["img_width"], parameters["img_height"]), 
        shuffle = False,
        batch_size= parameters["batch_size"])

, и этот код выводит в качестве вывода для обучения, проверки и тестирования: найдено 4911 изображений, относящихся к 69 классам.Найдено 282 изображения, принадлежащих к 69 классам.Найдено 421 проверенных имен файлов изображений.

Однако, если я хотел бы использовать test_datagen вместо train_datagen, для данных проверки:

validation_generator = test_datagen.flow_from_directory(
    # Changing Line        
    directory = train_data_dir,
    target_size = (parameters["img_width"], parameters["img_height"]),
    batch_size = parameters["batch_size"],
    class_mode='categorical',
    subset = "validation",
    color_mode = "rgb",
    seed = 42)

Я получаю вывод: Найдено 0 изображений, принадлежащих69 классов.

Как я могу решить эту проблему?Вкратце, я хотел бы проверить данные на изображениях, на которых модель будет эффективно работать, следовательно, используя test_datagen, который только масштабирует значения.

Ps train_data_dir - это папка, содержащая 69 папок с изображениями из разных классов;

1 Ответ

0 голосов
/ 25 апреля 2019

Я не думаю, что вы должны ссылаться на один и тот же каталог для проверки и обучения.

Попробуйте указать конкретный каталог проверки, например:

validation_generator = test_datagen.flow_from_directory(
    # Changing Line        
    directory = validation_data_dir,
    target_size = (parameters["img_width"], parameters["img_height"]),
    batch_size = parameters["batch_size"],
    class_mode='categorical',
    subset = "validation",
    color_mode = "rgb",
    seed = 42)

Каталоги должны выглядеть примерно так:

train/
    69 folders
validation/
    69 folders
test/ 
    69 folders

Например, настройка, которую я обычно использую:

train_data_dir = (str(cwd) + r'\augmented\train\\')
validation_data_dir = (str(cwd) + r'\augmented\validation\\')

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

test_datagen = ImageDataGenerator(rescale=1. / 255)

train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary')

validation_generator = test_datagen.flow_from_directory(
    validation_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary')

history = model.fit_generator(
    train_generator,
    steps_per_epoch=nb_train_samples // batch_size,
    epochs=epochs,
    validation_data=validation_generator,
    validation_steps=nb_validation_samples // batch_size)

Чтобы увеличить изображения в отдельные каталоги, вы можете сделать что-то вроде следующего, учтите, что это будет немного утомительно, и я рекомендую создать цикл из списка ваших классов.Для моего примера я выполнял только двоичную классификацию 1 или 0. Я взял «исходное» 0 изображение и увеличил его в папках train, validation и test, а затем снова запустил сценарий для 1 изображения.У вас гораздо больше классов, поэтому вы можете сделать цикл из списка.

# rescaling is disabled to allow the images to be viewed
datagen = ImageDataGenerator(
        rotation_range=40,
        width_shift_range=0.2,
        height_shift_range=0.2,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True,
        fill_mode='nearest')

# this is a PIL image # path + filename
img = load_img(r'path_to_single_image_to_be_augmented')
# this is a Numpy array with shape (3, 150, 150)
x = img_to_array(img)
# this is a Numpy array with shape (1, 3, 150, 150)
x = x.reshape((1,) + x.shape)

# the .flow() command below generates batches of randomly transformed
# images and saves the results to save_to_dir - remember to change prefix
i = 0
for batch in datagen.flow(x, batch_size=1,
                          save_to_dir=(str(cwd) + r'\augmented\test\0'),
                          save_prefix='0', save_format='jpeg'):
    i += 1
    if i > 110:  # change the amount of augmented data you want here
        break  # otherwise the generator would loop indefinitely

i = 0
for batch in datagen.flow(x, batch_size=1,
                          save_to_dir=(str(cwd) + r'\augmented\test\0'),
                          save_prefix='0', save_format='jpeg'):
    i += 1
    if i > 280:  
        break  

i = 0
for batch in datagen.flow(x, batch_size=1,
                          save_to_dir=(str(cwd) + r'\augmented\validation\0'),
                          save_prefix='0', save_format='jpeg'):
    i += 1
    if i > 280: 
        break  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...