2017-02-17 17 views
3

Я пытаюсь подогнать мою модель Keras с довольно большим объемом данных.Установка модели Keras с большим объемом данных с использованием генератора настраиваемых данных

Для этого я использую собственные генераторы данных и функцию model.fit_generator.

Однако я не могу понять, правильно ли я делаю это.

Вот что у меня есть:

from os.path import join 

import cv2 
import numpy as np 
from keras.models import Sequential 
from keras.layers.core import Flatten, Dense, Dropout 
from keras.layers.convolutional import Convolution2D, MaxPooling2D, ZeroPadding2D 
from keras.preprocessing.image import ImageDataGenerator 
from keras.optimizers import SGD 
from keras.callbacks import TensorBoard, ModelCheckpoint, ReduceLROnPlateau 

# The function returns a list of image names from folder 
from data.preprocessing import get_list_of_images 


class VGG19(object): 
    def __init__(self, weights_path=None, train_folder='data/train', validation_folder='data/val'): 
     self.weights_path = weights_path 
     self.model = self._init_model() 

     if weights_path: 
      self.model.load_weights(weights_path) 
     else: 
      self.datagen = self._init_datagen() 
      self.train_folder = train_folder 
      self.validation_folder = validation_folder 
      self.model.compile(
       loss='binary_crossentropy', 
       optimizer='adam', 
       metrics=['accuracy'] 
      ) 

    def fit(self, batch_size=32, nb_epoch=10): 
     self.model.fit_generator(
      self._generate_data_from_folder(self.train_folder), 32, 
      nb_epoch, 
      verbose=1, 
      callbacks=[ 
       TensorBoard(log_dir='./logs', write_images=True), 
       ModelCheckpoint(filepath='weights.{epoch:02d}-{val_loss:.2f}.hdf5', monitor='val_loss'), 
       ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=5, min_lr=0.001) 
      ], 
      validation_data=self._generate_data_from_folder(self.validation_folder), 
      nb_val_samples=32 
     ) 

    def predict(self, X, batch_size=32, verbose=1): 
     return self.model.predict(X, batch_size=batch_size, verbose=verbose) 

    def predict_proba(self, X, batch_size=32, verbose=1): 
     return self.model.predict_proba(X, batch_size=batch_size, verbose=verbose) 

    def _init_model(self): 
     model = Sequential() 
     # model definition goes here... 
     return model 

    def _init_datagen(self): 
     return ImageDataGenerator(
      featurewise_center=True, 
      samplewise_center=False, 
      featurewise_std_normalization=True, 
      samplewise_std_normalization=False, 
      zca_whitening=False, 
      rotation_range=20, 
      width_shift_range=0.2, 
      height_shift_range=0.2, 
      horizontal_flip=True, 
      vertical_flip=True 
     ) 

    def _generate_data_from_folder(self, folder_path): 
     while 1: 
      images = get_list_of_images(folder_path) 

      for image_path in images: 
       x = cv2.imread(join(folder_path, image_path)) 
       y = 0 if image_path.split('.')[0] == 'dog' else 1 

       yield (x, y) 

Мой набор данных состоит из изображений с именами как:

  • cat.[number].jpg, то есть: cat.124.jpg

  • dog.[number].jpg, то есть: dog.64.jpg

Итак, в основном, я пытаюсь подготовить модель для выполнения двоичной классификации кошачьих собак.


ли моя _generate_data_from_folder функция корректно реализована мини-пакетной оптимизации?

Как добавить ImageDataGenerator в мою функцию _generate_data_from_folder (от функции _init_datagen)?

+0

Что вы имеете в виду под «добавить использование»? – nemo

+0

@nemo Я хотел бы добавить расширение данных с помощью 'ImageDataGenerator', однако я не уверен, как это сделать. Должен ли я помещать генератор 'ImageDataGenerator.flow() в мой другой генератор или использовать его как-то иначе? И я не уверен, правильно ли работает функция генератора данных –

ответ

 Смежные вопросы

  • Нет связанных вопросов^_^