def main(model_name, batch_size=64, model_params=None, preprocessing_params=None, test_run=False): model_wrapper = model_dict[model_name](*model_params) preprocessor = Preprocessor(**preprocessing_params) model_dir = os.path.join('test_runs' if test_run else 'output', model_wrapper.path(), preprocessor.path()) success_path = os.path.join(model_dir, 'history') if not os.path.exists(success_path): best_model_path = os.path.join(model_dir, 'model-best.hdf5') shutil.rmtree(model_dir, ignore_errors=True) os.makedirs(model_dir) model = model_wrapper.get_model() callbacks = [ ModelCheckpoint(best_model_path, monitor='val_loss', verbose=1, save_best_only=True, mode='min'), EarlyStopping(patience=1 if test_run else 5, verbose=1) ] if test_run: print 'test run' train_generator = preprocessor.get_train_generator( vs.TINY_TRAIN_DIR, batch_size) val_generator = preprocessor.get_test_generator( vs.TINY_VALIDATION_DIR, batch_size) test_generator = preprocessor.get_test_generator( vs.TINY_TEST_DIR, batch_size) print 'class indices' print train_generator.class_indices else: print 'true run' train_generator = preprocessor.get_train_generator( vs.TRAIN_DIR, batch_size) val_generator = preprocessor.get_test_generator( vs.VALIDATION_DIR, batch_size) test_generator = preprocessor.get_test_generator( vs.TEST_DIR, batch_size) train_samples = train_generator.samples val_samples = val_generator.samples history = model.fit_generator( train_generator, train_samples // batch_size, validation_data=val_generator, validation_steps=val_samples // batch_size + 1, epochs=100, callbacks=callbacks).history with open(success_path, 'wb') as f: pickle.dump(history, f) model = load_model(best_model_path) make_submission(model, test_generator, os.path.join(model_dir, 'submission.csv')) with open(success_path, 'rb') as f: history = pickle.load(f) print model_wrapper print preprocessor print 'best loss %.3f' % min(history['val_loss']) print 'best accuracy %.3f' % max(history['val_acc'])