Exemplo n.º 1
0
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'])