Сборка модели CNN с керасом для неравномерного обучения и тестирования данных папок с изображениями - PullRequest
0 голосов
/ 19 марта 2019

У меня есть две папки для обучения и тестирования набора данных изображений, но обе содержат разные метки, подобные этой,

training-
         |-a  -img1.png
               img2.png
         |-as -img1.png
               img2.png
         |-are-img1.png
testing -
         |-as -img1.png
         |-and-img1.png
               img1.png

Как я могу создать ytrain и ytest с этим набором данных?

я пробовалследующий код,

datagen = ImageDataGenerator(rescale=1. / 255)  
generator = datagen.flow_from_directory(train_data_dir,  
target_size=(img_width, img_height),  
batch_size=batch_size,  
class_mode=None,  
shuffle=False)  

nb_train_samples = len(generator.filenames)  
num_classes = len(generator.class_indices)  

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

generator = datagen.flow_from_directory(  
test_data_dir,  
target_size=(img_width, img_height),  
batch_size=batch_size,  
class_mode=None,  
shuffle=False)  
nb_test_samples = len(generator.filenames)

Найдено 226 изображений, относящихся к 48 классам.
Это правильный способделать маркировку ?? Поскольку оба набора данных содержат разные имена папок (a, as, are) и (as, and)

Когда я строю модель, я получаю точность 0%

model = Sequential()  
model.add(Flatten(input_shape=train_data.shape[1:]))  
model.add(Dense(256, activation='relu'))  
model.add(Dropout(0.5))  
model.add(Dense(num_classes, activation='sigmoid'))  

model.compile(optimizer='rmsprop',  
          loss='categorical_crossentropy', metrics=['accuracy'])  

history = model.fit(train_data, 
train_labels,epochs=epochs,batch_size=batch_size,test_data=(test_data, test_labels))  

model.save_weights(top_model_weights_path)  

(eval_loss, eval_accuracy) = model.evaluate(  
 test_data, test_labels, batch_size=batch_size, verbose=1)

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Разрыв довольно гибок для этих типов проблем. Мой любимый способ объединить отдельный набор данных обучения и тестирования - использовать функцию слияния набора данных Gap (оператор + =) следующим образом:

# load the images from the Training directory
images = Images('name_of_dataset', 'training', config=['resize=(224,224)', 'store'])

# load the images from the Testing directory and merge them with the Training data
images += Images('name_of_dataset', 'testing', config=['resize=(224,224)', 'store'])
1 голос
/ 21 марта 2019

Я бы порекомендовал вам объединить оба набора данных, перемешать их, а затем снова разделить, чтобы получить наборы данных для обучения и тестирования с одинаковыми метками.Это правильный способ маркировки, потому что модели необходимо «увидеть» все возможные метки и сравнить их с набором тестовых данных.

Для этого вы можете использовать gapcv:

Установитьбиблиотека:

pip install gapcv

микс папок:

from gapcv.utils.img_tools import ImgUtils
gap = ImgUtils(root_path='root_folder{}/training'.format('_t2'))
gap.transf='2to1'
gap.transform()

Это создаст папку со следующей структурой:

root_folder-
         |-a  -img1.png
               img2.png
         |-as -img1.png
               img2.png
         |-are-img1.png
         |-and-img1.png
               img1.png

Вариант 1

Используйте gapcv для предварительной обработки набора данных в файл h5 и совместного использования и используйте его для встраивания изображений в модель keras:

import os
if not os.path.isfile('name_data_set.h5'):
    # this will create the `h5` file if it doesn't exist
    images = Images('name_data_set', 'root_folder', config=['resize=(224,224)', 'store'])

# this will stream the data from the `h5` file so you don't overload your memory
images = Images(config=['stream'], augment=['flip=both', 'edge', 'zoom=0.3', 'denoise']) # augment if it's needed if not use just Images(config=['stream']), norm 1.0/255.0 by default.
images.load('name_data_set')

#Metadata

print('images train')
print('Time to load data set:', images.elapsed)
print('Number of images in data set:', images.count)
print('classes:', images.classes)

генератор:

images.split = 0.2
images.minibatch = 32
gap_generator = images.minibatch
X_test, Y_test = images.test

Fit keras модель:

model.fit_generator(generator=gap_generator,
                    validation_data=(X_test, Y_test),
                    epochs=epochs,
                    steps_per_epoch=steps_per_epoch)

зачем использовать gapcv?ну, это в два раза быстрее подходит для модели, чем ImageDataGenerator():)

Опция 2

Используйте gapcv, чтобы перемешать и разделить набор данных с одинаковыми метками:

gap = ImgUtils(root_path='root_folder')

# Tree 2
gap.transform(shufle=True, img_split=0.2)

продолжайте использовать keras ImageDataGenerator() как обычно.

Документация:

Обучение Блокнот для смешивания и разделенияпапки.
gapcv документация.

Дайте мне знать, как это происходит.:)

...