fcn_vgg16 = FCN(input_shape=(224, 224, 3), classes=21, weight_decay=3e-3, weights='imagenet', trainable_encoder=True) optimizer = keras.optimizers.Adam(1e-4) fcn_vgg16.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy']) fcn_vgg16.fit_generator( datagen.flow_from_imageset(class_mode='categorical', classes=21, batch_size=1, shuffle=True, image_set_loader=train_loader), steps_per_epoch=1112, epochs=100, validation_data=datagen.flow_from_imageset(class_mode='categorical', classes=21, batch_size=1, shuffle=True, image_set_loader=val_loader), validation_steps=1111, verbose=1, callbacks=[ lr_reducer, early_stopper, csv_logger, checkpointer, nan_terminator ])
patience=100) csv_logger = CSVLogger('output/{}_fcn_vgg16.csv'.format( datetime.datetime.now().isoformat())) datagen = PascalVocGenerator(**init_args['pascal_voc_generator']['train']) train_loader = ImageSetLoader(**init_args['image_set_loader']['train']) val_loader = ImageSetLoader(**init_args['image_set_loader']['val']) fcn_vgg16 = FCN(basenet='vgg16', input_shape=(500, 500, 3), num_output=21) fcn_vgg16.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy', 'categorical_accuracy']) flow_args = init_args['pascal_voc_generator']['flow_from_imageset'] train_flow_args = flow_args.copy() train_flow_args['image_set_loader'] = train_loader val_flow_args = flow_args.copy() val_flow_args['image_set_loader'] = val_loader fcn_vgg16.fit_generator( datagen.flow_from_imageset(**train_flow_args), steps_per_epoch=1112, epochs=100, validation_data=datagen.flow_from_imageset(**val_flow_args), validation_steps=1111, verbose=1, max_q_size=100, callbacks=[lr_reducer, early_stopper, csv_logger]) fcn_vgg16.save('output/fcn_vgg16.h5')
def main(): ''' Main function ''' # Define common arguments checkpointer = ModelCheckpoint(filepath='output/fcn_vgg16_weights_tmp.h5', verbose=1, save_best_only=True) lr_reducer = ReduceLROnPlateau(monitor='val_loss', factor=np.sqrt(0.1), cooldown=0, patience=10, min_lr=1e-12) early_stopper = EarlyStopping(monitor='val_loss', min_delta=0.001, patience=30) nan_terminator = TerminateOnNaN() csv_logger = CSVLogger('output/tmp_fcn_vgg16.csv') # Set data generator datagen = PascalVocGenerator(image_shape=[224, 224, 3], image_resample=True, pixelwise_center=True, pixel_mean=[115.85100, 110.50989, 102.16182], pixelwise_std_normalization=True, pixel_std=[70.30930, 69.41244, 72.60676]) # Define training set and validation set train_loader = ImageSetLoader(*arg_gen('train')) val_loader = ImageSetLoader(*arg_gen('val')) # Construct model fcn_vgg16 = model.fcn_vgg16(input_shape=(224, 224, 3), classes=21, weight_decay=3e-3, weights='imagenet', trainable_encoder=False) # Set optimizer optimizer = Adam(1e-4) # Compile model fcn_vgg16.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy']) # Fit model with the above generators fcn_vgg16.fit_generator( datagen.flow_from_imageset(class_mode='categorical', classes=21, batch_size=1, shuffle=True, image_set_loader=train_loader), steps_per_epoch=1112, epochs=40, validation_data=datagen.flow_from_imageset( class_mode='categorical', classes=21, batch_size=1, shuffle=True, image_set_loader=val_loader), validation_steps=1111, verbose=1, callbacks=[ lr_reducer, early_stopper, csv_logger, checkpointer, nan_terminator ]) # Save weights fcn_vgg16.save('output/fcn_vgg16.h5')