def fit_model():
    early_stop = EarlyStopping(monitor='val_loss', patience=patience)

    return model.fit(train_generator,
                     validation_data=validation_generator,
                     steps_per_epoch=train_steps_per_epoch,
                     epochs=epochs,
                     validation_steps=val_steps_per_epoch,
                     verbose=2,
                     callbacks=[early_stop, tensorboard_callback])


# Run code

# Get and process data
DataHandler.extract_data_files()

num_images = DataHandler.calculate_num_images()
train_steps_per_epoch = np.ceil((num_images * 0.8 / batch_size) - 1)
val_steps_per_epoch = np.ceil((num_images * 0.2 / batch_size) - 1)

train_dir = './data/train/'

# Print image join plots
UtilProvider.print_join_plots(train_dir + 'cartoons/',
                              'images/joinplot_cartoons', 'C')
UtilProvider.print_join_plots(train_dir + 'photos/', 'images/joinplot_photos',
                              'P')

[train_generator, validation_generator
 ] = UtilProvider.create_data_generators(batch_size, image_size)