diff --git a/examples/pascal_voc_jaccard_loss.py b/examples/pascal_voc_jaccard_loss.py new file mode 100644 index 0000000..c561009 --- /dev/null +++ b/examples/pascal_voc_jaccard_loss.py @@ -0,0 +1,84 @@ +''' +Trains a DenseNet-40-12 model on the CIFAR-10 Dataset. + +Gets a 94.84% accuracy score after 100 epochs. +''' +from __future__ import absolute_import +from __future__ import print_function +from __future__ import division + +import numpy as np + +from keras import backend as K +from keras.callbacks import ModelCheckpoint, ReduceLROnPlateau, EarlyStopping +from keras.datasets import pascal_voc +from keras.optimizers import Adam +from keras.preprocessing.image import ImageDataGenerator +from keras.utils import np_utils +from keras_contrib.applications import DenseNet + +batch_size = 64 +nb_classes = 10 +epochs = 100 + +img_rows, img_cols = 32, 32 +img_channels = 3 + +# Parameters for the DenseNet model builder +img_dim = (img_channels, img_rows, img_cols) if K.image_data_format() == 'channels_first' else (img_rows, img_cols, img_channels) +depth = 40 +nb_dense_block = 3 +growth_rate = 12 +nb_filter = 16 +dropout_rate = 0.0 # 0.0 for data augmentation + +# Create the model (without loading weights) +model = DenseNet(depth=depth, nb_dense_block=nb_dense_block, + growth_rate=growth_rate, nb_filter=nb_filter, + dropout_rate=dropout_rate, + input_shape=img_dim, + weights=None) +print('Model created') + +model.summary() + +optimizer = Adam(lr=1e-3) # Using Adam instead of SGD to speed up training +model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['acc']) +print('Finished compiling') + +(trainX, trainY), (testX, testY) = pascal_voc.load_data() + +trainX = trainX.astype('float32') +testX = testX.astype('float32') + +trainX /= 255. +testX /= 255. + +Y_train = np_utils.to_categorical(trainY, nb_classes) +Y_test = np_utils.to_categorical(testY, nb_classes) + +generator = ImageDataGenerator(rotation_range=15, + width_shift_range=5. / 32, + height_shift_range=5. / 32) + +generator.fit(trainX, seed=0) + +weights_file = 'DenseNet-40-12-CIFAR-10.h5' + +lr_reducer = ReduceLROnPlateau(monitor='val_loss', factor=np.sqrt(0.1), + cooldown=0, patience=10, min_lr=0.5e-6) +early_stopper = EarlyStopping(monitor='val_acc', min_delta=1e-4, patience=20) +model_checkpoint = ModelCheckpoint(weights_file, monitor='val_acc', save_best_only=True, + save_weights_only=True, mode='auto') + +callbacks = [lr_reducer, early_stopper, model_checkpoint] + +model.fit_generator(generator.flow(trainX, Y_train, batch_size=batch_size), steps_per_epoch=len(trainX) // batch_size, + epochs=epochs, + callbacks=callbacks, + validation_data=(testX, Y_test), + verbose=2) + +scores = model.evaluate(testX, Y_test, batch_size=batch_size) +print('Test loss : ', scores[0]) +print('Test accuracy : ', scores[1])