示例#1
0
def run(image_shape, batch_size, device, data_dir, ckpt_file, dataset_seed,
        train_n_patches, test_n_patches, patches_used_in_eval, arch, n_jobs):
    tf_config = tf.ConfigProto(allow_soft_placement=True)
    sess = tf.Session(config=tf_config)
    K.set_session(sess)

    vangogh = VanGogh(base_dir=data_dir,
                      image_shape=image_shape,
                      random_state=dataset_seed,
                      train_n_patches=train_n_patches,
                      valid_n_patches=train_n_patches,
                      test_n_patches=test_n_patches,
                      n_jobs=n_jobs)

    phases = ('train', 'valid', 'test')

    print('loading data...')
    start = time()
    data = dict(zip(phases, vangogh.load_patches(*phases)))
    print('done (%.1f sec).' % (time() - start))

    data['train'] = list(map(np.concatenate, zip(data['train'],
                                                 data['valid'])))
    del data['valid']

    data['train'][0] /= 127.5
    data['train'][0] -= 1.
    data['test'][0] /= 127.5
    data['test'][0] -= 1.

    with tf.device(device):
        model = build_siamese_model(x_shape=image_shape,
                                    arch=arch,
                                    weights=None)
        model.load_weights(ckpt_file)
        scores = evaluate(model=model,
                          data=data,
                          batch_size=batch_size,
                          patches_used=patches_used_in_eval)
        print('max test score: %.2f%%' % (100 * scores['test']))
示例#2
0
def run(dataset_seed, image_shape, batch_size, device, data_dir, output_dir,
        phases, architecture,
        o_meta, limb_weights, joint_weights, weights, pooling,
        dense_layers, use_gram_matrix, last_base_layer, override,
        embedded_files_max_size, selected_layers):
    os.makedirs(output_dir, exist_ok=True)

    with tf.device(device):
        print('building model...')
        model = build_siamese_model(image_shape, architecture, 0.0, weights,
                                    last_base_layer=last_base_layer,
                                    use_gram_matrix=use_gram_matrix,
                                    dense_layers=dense_layers, pooling=pooling,
                                    include_base_top=False, include_top=True,
                                    trainable_limbs=False,
                                    limb_weights=limb_weights,
                                    predictions_activation=[o['a'] for o in o_meta],
                                    predictions_name=[o['n'] for o in o_meta],
                                    classes=[o['u'] for o in o_meta],
                                    embedding_units=[o['e'] for o in o_meta],
                                    joints=[o['j'] for o in o_meta])
        # Restore best parameters.
        print('loading weights from:', joint_weights)
        model.load_weights(joint_weights)
        model = model.get_layer('model_2')

        available_layers = [l.name for l in model.layers]
        if set(selected_layers) - set(available_layers):
            print('available layers:', available_layers)
            raise ValueError('selection contains unknown layers: %s' % selected_layers)

        style_features = [model.get_layer(l).output for l in selected_layers]

        if use_gram_matrix:
            gram_layer = layers.Lambda(gram_matrix, arguments=dict(norm_by_channels=False))
            style_features = [gram_layer(f) for f in style_features]

        model = Model(inputs=model.inputs, outputs=style_features)

    g = ImageDataGenerator(preprocessing_function=get_preprocess_fn(architecture))

    for phase in phases:
        phase_data_dir = os.path.join(data_dir, phase)
        output_file_name = os.path.join(output_dir, phase + '.%i.pickle')
        already_embedded = os.path.exists(output_file_name % 0)
        phase_exists = os.path.exists(phase_data_dir)

        if already_embedded and not override or not phase_exists:
            print('%s transformation skipped' % phase)
            continue

        # Shuffle must always be off in order to keep names consistent.
        data = g.flow_from_directory(phase_data_dir,
                                     target_size=image_shape[:2],
                                     class_mode='sparse',
                                     batch_size=batch_size, shuffle=False,
                                     seed=dataset_seed)
        print('transforming %i %s samples from %s' % (data.n, phase, phase_data_dir))
        part_id = 0
        samples_seen = 0
        displayed_once = False

        while samples_seen < data.n:
            z, y = {n: [] for n in selected_layers}, []
            chunk_size = 0
            chunk_start = samples_seen

            while chunk_size < embedded_files_max_size and samples_seen < data.n:
                _x, _y = next(data)

                outputs = model.predict_on_batch(_x)
                chunk_size += sum(o.nbytes for o in outputs)

                for l, o in zip(selected_layers, outputs):
                    z[l].append(o)

                y.append(_y)
                samples_seen += _x.shape[0]
                chunk_p = int(100 * (samples_seen / data.n))

                if chunk_p % 10 == 0:
                    if not displayed_once:
                        print('\n%i%% (%.2f MB)'
                              % (chunk_p, chunk_size / 1024 ** 2),
                              flush=True, end='')
                        displayed_once = True
                else:
                    displayed_once = False
                    print('.', end='')

            for layer in selected_layers:
                z[layer] = np.concatenate(z[layer])

            with open(output_file_name % part_id, 'wb') as f:
                pickle.dump({'data': z,
                             'target': np.concatenate(y),
                             'names': np.asarray(data.filenames[chunk_start: samples_seen])},
                            f, pickle.HIGHEST_PROTOCOL)
            part_id += 1
    print('done.')
def run(_run, image_shape, data_dir, patches, estimator_type, submission_info,
        solution, architecture, weights, batch_size, last_base_layer,
        use_gram_matrix, pooling, dense_layers, device, num_classes,
        limb_weights, predictions_activation, joint, embedding_units,
        dropout_rate, ckpt, results_file, submission_file, use_multiprocessing,
        workers):
    report_dir = _run.observers[0].dir

    with tf.device(device):
        print('building...')
        model = build_siamese_model(
            image_shape,
            architecture,
            dropout_rate,
            weights,
            num_classes,
            last_base_layer,
            use_gram_matrix,
            dense_layers,
            pooling,
            include_base_top=False,
            include_top=True,
            predictions_activation=predictions_activation,
            limb_weights=limb_weights,
            trainable_limbs=False,
            embedding_units=embedding_units,
            joints=joint)
        model.summary()
        print('loading weights from', ckpt)
        model.load_weights(ckpt)

        limb, rest = model.get_layer('model_2'), model.layers[3:]
        x = i = Input(shape=(num_classes, ))
        for l in limb.layers[-5:]:
            x = l(x)
        limb = Model(inputs=i, outputs=x)

        ia, ib = Input(shape=(num_classes, )), Input(shape=(num_classes, ))
        ya = limb(ia)
        yb = limb(ib)

        x = [ya, yb]
        for l in rest:
            x = l(x)

        model = Model(inputs=[ia, ib], outputs=x)

        print('loading submission and solution...')
        pairs = pd.read_csv(submission_info, quotechar='"',
                            delimiter=',').values[:, 1:]
        labels = pd.read_csv(solution, quotechar='"',
                             delimiter=',').values[:, 1:].flatten()

        print('loading sequential predictions...')
        d = load_pickle_data(data_dir, phases=['test'], keys=['data', 'names'])
        d, names = d['test']
        samples = d['predictions']
        del d
        samples, names = group_by_paintings(samples, names=names)
        names = np.asarray([n.split('/')[1] + '.jpg' for n in names])

        print('test data shape:', samples.shape)

        print('\n# test evaluation')
        test_data = ArrayPairsSequence(samples, names, pairs, labels,
                                       batch_size)
        probabilities = model.predict_generator(
            test_data,
            use_multiprocessing=use_multiprocessing,
            workers=workers,
            verbose=1).reshape(-1, patches)
        del model
        K.clear_session()

    layer_results = evaluate(labels, probabilities, estimator_type)
    layer_results['phase'] = 'test'
    evaluation_results = [layer_results]

    # generate results file.
    with open(os.path.join(report_dir, results_file), 'w') as file:
        json.dump(evaluation_results, file)

    # generate submission file to Kaggle.
    for v in layer_results['evaluations']:
        predictions_field = 'binary_probabilities' if 'binary_probabilities' in v else 'p'
        p = v[predictions_field]

        with open(submission_file.format(strategy=v['strategy']), 'w') as f:
            f.write('index,sameArtist\n')
            f.writelines(['%i,%f\n' % (i, _p) for i, _p in enumerate(p)])
def run(_run, image_shape, train_info, data_dir, train_pairs, valid_pairs,
        train_shuffle, valid_shuffle, subdirectories, architecture, weights,
        batch_size, last_base_layer, pooling, device, opt_params, dropout_rate,
        resuming_ckpt, ckpt, steps_per_epoch, epochs, validation_steps,
        workers, use_multiprocessing, initial_epoch, early_stop_patience,
        use_gram_matrix, dense_layers, limb_weights, trainable_limbs,
        outputs_meta):
    report_dir = _run.observers[0].dir

    print('reading train-info...')
    outputs, name_map = load_multiple_outputs(train_info,
                                              outputs_meta,
                                              encode='sparse')

    g = ImageDataGenerator(
        horizontal_flip=True,
        vertical_flip=True,
        zoom_range=.2,
        rotation_range=.2,
        height_shift_range=.2,
        width_shift_range=.2,
        fill_mode='reflect',
        preprocessing_function=get_preprocess_fn(architecture))

    print('loading train meta-data...')
    train_data = BalancedDirectoryPairsMultipleOutputsSequence(
        os.path.join(data_dir, 'train'),
        outputs,
        name_map,
        g,
        batch_size=batch_size,
        target_size=image_shape[:2],
        subdirectories=subdirectories,
        shuffle=train_shuffle,
        pairs=train_pairs)

    print('loading valid meta-data...')
    valid_data = BalancedDirectoryPairsMultipleOutputsSequence(
        os.path.join(data_dir, 'valid'),
        outputs,
        name_map,
        g,
        batch_size=batch_size,
        target_size=image_shape[:2],
        subdirectories=subdirectories,
        shuffle=valid_shuffle,
        pairs=valid_pairs)

    with tf.device(device):
        print('building...')
        model = build_siamese_model(
            image_shape,
            architecture,
            dropout_rate,
            weights,
            last_base_layer=last_base_layer,
            use_gram_matrix=use_gram_matrix,
            dense_layers=dense_layers,
            pooling=pooling,
            include_base_top=False,
            include_top=True,
            trainable_limbs=trainable_limbs,
            limb_weights=limb_weights,
            predictions_activation=[o['a'] for o in outputs_meta],
            predictions_name=[o['n'] for o in outputs_meta],
            classes=[o['u'] for o in outputs_meta],
            embedding_units=[o['e'] for o in outputs_meta],
            joints=[o['j'] for o in outputs_meta])

        print('siamese model summary:')
        model.summary()
        if resuming_ckpt:
            print('loading weights...')
            model.load_weights(resuming_ckpt)

        model.compile(optimizer=optimizers.Adam(**opt_params),
                      loss=dict((o['n'] + '_binary_predictions', o['l'])
                                for o in outputs_meta),
                      metrics=dict((o['n'] + '_binary_predictions', o['m'])
                                   for o in outputs_meta))

        print('training from epoch %i...' % initial_epoch)
        try:
            model.fit_generator(
                train_data,
                steps_per_epoch=steps_per_epoch,
                epochs=epochs,
                validation_data=valid_data,
                validation_steps=validation_steps,
                initial_epoch=initial_epoch,
                use_multiprocessing=use_multiprocessing,
                workers=workers,
                verbose=2,
                callbacks=[
                    callbacks.TerminateOnNaN(),
                    callbacks.EarlyStopping(patience=early_stop_patience),
                    callbacks.ReduceLROnPlateau(min_lr=1e-10,
                                                patience=early_stop_patience //
                                                3),
                    callbacks.TensorBoard(report_dir, batch_size=batch_size),
                    callbacks.ModelCheckpoint(os.path.join(report_dir, ckpt),
                                              save_best_only=True,
                                              verbose=1),
                ])
        except KeyboardInterrupt:
            print('interrupted by user')
        else:
            print('done')
示例#5
0
def run(image_shape, data_dir, valid_pairs, classes, num_classes, architecture,
        weights, batch_size, last_base_layer, pooling, device,
        predictions_activation, dropout_rate, ckpt, validation_steps,
        use_multiprocessing, use_gram_matrix, dense_layers, embedding_units,
        limb_weights, trainable_limbs):
    if isinstance(classes, int):
        classes = sorted(os.listdir(os.path.join(data_dir, 'train')))[:classes]

    g = ImageDataGenerator(
        preprocessing_function=utils.get_preprocess_fn(architecture))
    valid_data = BalancedDirectoryPairsSequence(os.path.join(
        data_dir, 'valid'),
                                                g,
                                                target_size=image_shape[:2],
                                                pairs=valid_pairs,
                                                classes=classes,
                                                batch_size=batch_size)
    if validation_steps is None:
        validation_steps = len(valid_data)

    with tf.device(device):
        print('building...')
        model = build_siamese_model(
            image_shape,
            architecture,
            dropout_rate,
            weights,
            num_classes,
            last_base_layer,
            use_gram_matrix,
            dense_layers,
            pooling,
            include_base_top=False,
            include_top=True,
            predictions_activation=predictions_activation,
            limb_weights=limb_weights,
            trainable_limbs=trainable_limbs,
            embedding_units=embedding_units,
            joints='multiply')
        print('siamese model summary:')
        model.summary()
        if ckpt:
            print('loading weights...')
            model.load_weights(ckpt)

        enqueuer = None
        try:
            enqueuer = OrderedEnqueuer(valid_data,
                                       use_multiprocessing=use_multiprocessing)
            enqueuer.start()
            output_generator = enqueuer.get()

            y, p = [], []
            for step in range(validation_steps):
                x, _y = next(output_generator)
                _p = model.predict(x, batch_size=batch_size)
                y.append(_y)
                p.append(_p)

            y, p = (np.concatenate(e).flatten() for e in (y, p))

            print('actual:', y[:80])
            print('expected:', p[:80])
            print('accuracy:', metrics.accuracy_score(y, p >= 0.5))
            print(metrics.classification_report(y, p >= 0.5))
            print(metrics.confusion_matrix(y, p >= 0.5))

        finally:
            if enqueuer is not None:
                enqueuer.stop()
示例#6
0
def run(batch_size, data_dir, train_dir, valid_dir, balanced_classes,
        image_shape, train_augmentations, train_shuffle, train_dataset_seed,
        valid_augmentations, valid_shuffle, valid_dataset_seed, device,
        opt_params, ckpt_file, pre_trained_weights, arch, network_weights,
        train_samples_per_epoch, nb_epoch, nb_val_samples, nb_worker,
        early_stop_patience, reduce_lr_on_plateau_patience, tensorboard_file,
        initial_epoch):
    os.makedirs(os.path.dirname(ckpt_file), exist_ok=True)

    tf_config = tf.ConfigProto(allow_soft_placement=True)
    tf_config.gpu_options.allow_growth = True
    sess = tf.Session(config=tf_config)
    K.set_session(sess)

    g = ImageDataGenerator(featurewise_center=True,
                           horizontal_flip=True,
                           vertical_flip=True,
                           rotation_range=30,
                           height_shift_range=.2,
                           width_shift_range=.2,
                           rescale=2. / 255.,
                           fill_mode='reflect')
    g.mean = 1.
    train_data = BalancedDirectoryPairsSequence(
        train_dir,
        image_data_generator=g,
        target_size=image_shape[:2],
        augmentations=train_augmentations,
        batch_size=batch_size,
        balanced_classes=balanced_classes,
        shuffle=train_shuffle,
        seed=train_dataset_seed)
    valid_data = BalancedDirectoryPairsSequence(
        valid_dir,
        image_data_generator=g,
        target_size=image_shape[:2],
        augmentations=valid_augmentations,
        batch_size=batch_size,
        balanced_classes=balanced_classes,
        shuffle=valid_shuffle,
        seed=valid_dataset_seed)

    with tf.device(device):
        model = build_siamese_model(x_shape=image_shape,
                                    arch=arch,
                                    weights=network_weights)
        opt = optimizers.Adam(**opt_params)
        model.compile(optimizer=opt, loss=contrastive_loss)

        if pre_trained_weights:
            model.load_weights(pre_trained_weights)
        elif initial_epoch > 0:
            print('re-loading weights...')
            model.load_weights(ckpt_file)

        print('training network...')
        try:
            model.fit_generator(
                train_data,
                samples_per_epoch=train_samples_per_epoch,
                nb_epoch=nb_epoch,
                validation_data=valid_data,
                nb_val_samples=nb_val_samples,
                nb_worker=nb_worker,
                callbacks=[
                    callbacks.ReduceLROnPlateau(
                        min_lr=1e-10, patience=reduce_lr_on_plateau_patience),
                    callbacks.EarlyStopping(patience=early_stop_patience),
                    callbacks.TensorBoard(tensorboard_file, histogram_freq=5),
                    callbacks.ModelCheckpoint(ckpt_file,
                                              verbose=1,
                                              save_best_only=True),
                ],
                initial_epoch=initial_epoch)
        except KeyboardInterrupt:
            print('training interrupted by user.')
        else:
            print('done.')
def run(_run, image_shape, data_dir, train_pairs, valid_pairs, classes,
        num_classes, architecture, weights, batch_size, last_base_layer,
        pooling, device, predictions_activation, opt_params, dropout_rate,
        resuming_ckpt, ckpt, steps_per_epoch, epochs, validation_steps, joints,
        workers, use_multiprocessing, initial_epoch, early_stop_patience,
        use_gram_matrix, dense_layers, embedding_units, limb_weights,
        trainable_limbs, tensorboard_tag):
    report_dir = _run.observers[0].dir

    if isinstance(classes, int):
        classes = sorted(os.listdir(os.path.join(data_dir, 'train')))[:classes]

    g = ImageDataGenerator(
        horizontal_flip=True,
        vertical_flip=True,
        zoom_range=.2,
        rotation_range=.2,
        height_shift_range=.2,
        width_shift_range=.2,
        fill_mode='reflect',
        preprocessing_function=utils.get_preprocess_fn(architecture))

    train_data = BalancedDirectoryPairsSequence(os.path.join(
        data_dir, 'train'),
                                                g,
                                                target_size=image_shape[:2],
                                                pairs=train_pairs,
                                                classes=classes,
                                                batch_size=batch_size)
    valid_data = BalancedDirectoryPairsSequence(os.path.join(
        data_dir, 'valid'),
                                                g,
                                                target_size=image_shape[:2],
                                                pairs=valid_pairs,
                                                classes=classes,
                                                batch_size=batch_size)
    if steps_per_epoch is None:
        steps_per_epoch = len(train_data)
    if validation_steps is None:
        validation_steps = len(valid_data)

    with tf.device(device):
        print('building...')
        model = build_siamese_model(
            image_shape,
            architecture,
            dropout_rate,
            weights,
            num_classes,
            last_base_layer,
            use_gram_matrix,
            dense_layers,
            pooling,
            include_base_top=False,
            include_top=True,
            predictions_activation=predictions_activation,
            limb_weights=limb_weights,
            trainable_limbs=trainable_limbs,
            embedding_units=embedding_units,
            joints=joints)
        print('siamese model summary:')
        model.summary()
        if resuming_ckpt:
            print('loading weights...')
            model.load_weights(resuming_ckpt)

        model.compile(loss='binary_crossentropy',
                      metrics=['accuracy'],
                      optimizer=optimizers.Adam(**opt_params))

        print('training from epoch %i...' % initial_epoch)
        try:
            model.fit_generator(
                train_data,
                steps_per_epoch=steps_per_epoch,
                epochs=epochs,
                validation_data=valid_data,
                validation_steps=validation_steps,
                initial_epoch=initial_epoch,
                use_multiprocessing=use_multiprocessing,
                workers=workers,
                verbose=2,
                callbacks=[
                    callbacks.TerminateOnNaN(),
                    callbacks.EarlyStopping(patience=early_stop_patience),
                    callbacks.ReduceLROnPlateau(min_lr=1e-10,
                                                patience=int(
                                                    early_stop_patience // 3)),
                    callbacks.TensorBoard(os.path.join(report_dir,
                                                       tensorboard_tag),
                                          batch_size=batch_size),
                    callbacks.ModelCheckpoint(os.path.join(report_dir, ckpt),
                                              save_best_only=True,
                                              save_weights_only=True,
                                              verbose=1),
                ])
        except KeyboardInterrupt:
            print('interrupted by user')
        else:
            print('done')