123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- '''This script goes along the blog post
- "Building powerful image classification models using very little data"
- from blog.keras.io.
- ```
- data/
- train/
- final/
- final001.png
- final002.png
- ...
- noisy/
- noisy001.png
- noisy002.png
- ...
- validation/
- final/
- final001.png
- final002.png
- ...
- noisy/
- noisy001.png
- noisy002.png
- ...
- ```
- '''
- from keras.preprocessing.image import ImageDataGenerator
- from keras.models import Sequential
- from keras.layers import Conv2D, MaxPooling2D, AveragePooling2D
- from keras.layers import Activation, Dropout, Flatten, Dense
- from keras import backend as K
- from sklearn.cross_validation import StratifiedKFold
- from keras.utils import plot_model
- # dimensions of our images.
- img_width, img_height = 100, 100
- train_data_dir = 'data/train'
- validation_data_dir = 'data/validation'
- nb_train_samples = 7200
- nb_validation_samples = 3600
- epochs = 50
- batch_size = 16
- if K.image_data_format() == 'channels_first':
- input_shape = (3, img_width, img_height)
- else:
- input_shape = (img_width, img_height, 3)
- def create_model():
- # create your model using this function
- model = Sequential()
- model.add(Conv2D(60, (2, 2), input_shape=input_shape))
- model.add(Activation('relu'))
- model.add(MaxPooling2D(pool_size=(2, 2)))
- model.add(Conv2D(40, (2, 2)))
- model.add(Activation('relu'))
- model.add(MaxPooling2D(pool_size=(2, 2)))
- model.add(Conv2D(20, (2, 2)))
- model.add(Activation('relu'))
- model.add(MaxPooling2D(pool_size=(2, 2)))
- model.add(Conv2D(40, (2, 2)))
- model.add(Activation('relu'))
- model.add(MaxPooling2D(pool_size=(2, 2)))
- model.add(Conv2D(20, (2, 2)))
- model.add(Activation('relu'))
- model.add(MaxPooling2D(pool_size=(2, 2)))
- model.add(Flatten())
- model.add(Dense(256))
- model.add(Activation('relu'))
- model.add(Dropout(0.2))
- model.add(Dense(128))
- model.add(Activation('relu'))
- model.add(Dropout(0.2))
- model.add(Dense(64))
- model.add(Activation('relu'))
- model.add(Dropout(0.2))
- model.add(Dense(32))
- model.add(Activation('relu'))
- model.add(Dropout(0.05))
- model.add(Dense(1))
- model.add(Activation('sigmoid'))
- model.compile(loss='binary_crossentropy',
- optimizer='rmsprop',
- metrics=['accuracy'])
- model.summary()
- plot_model(model, to_file='noise_classification_img100.png', show_shapes=True)
- return model
- def load_data():
- # load your data using this function
- # this is the augmentation configuration we will use for training
- train_datagen = ImageDataGenerator(
- rescale=1. / 255,
- shear_range=0.2,
- zoom_range=0.2,
- horizontal_flip=True)
- # this is the augmentation configuration we will use for testing:
- # only rescaling
- 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')
- return train_generator
- #validation_generator = test_datagen.flow_from_directory(
- # validation_data_dir,
- # target_size=(img_width, img_height),
- # batch_size=batch_size,
- # class_mode='binary')
- def train_and_evaluate_model(model, data_train, data_test):
- model.fit_generator(
- data_train,
- steps_per_epoch=nb_train_samples // batch_size,
- epochs=epochs,
- shuffle=True,
- validation_data=data_test,
- validation_steps=nb_validation_samples // batch_size)
- if __name__ == "__main__":
- n_folds = 10
- data_generator = ImageDataGenerator(rescale=1./255, validation_split=0.33)
- # check if possible to not do this thing each time
- train_generator = data_generator.flow_from_directory(train_data_dir, target_size=(img_width, img_height), shuffle=True, seed=13,
- class_mode='binary', batch_size=batch_size, subset="training")
- validation_generator = data_generator.flow_from_directory(train_data_dir, target_size=(img_width, img_height), shuffle=True, seed=13,
- class_mode='binary', batch_size=batch_size, subset="validation")
- model = create_model()
- train_and_evaluate_model(model, train_generator, validation_generator)
- model.save_weights('noise_classification_img100.h5')
|