예제 #1
0
    def prepare_network(self, run, epoch):
        if self.model is None:
            if self.network == 'dir':
                model = DirectArch(miniXception_loader, self.net_input_shape, objective="malignancy", output_size=self.net_out_size,
                                   normalize=self.net_normalize, pooling=self.net_pool)

            elif self.network == 'siam':
                model = SiamArch(miniXception_loader, self.net_input_shape, distance='l2', output_size=self.net_out_size, normalize=self.net_normalize,
                                 pooling=self.net_pool)

            elif self.network == 'dirR':
                model = DirectArch(miniXception_loader, self.net_input_shape, objective="rating", output_size=self.net_out_size,
                                   normalize=self.net_normalize, pooling=self.net_pool)

            elif self.network == 'siamR':
                model = SiamArch(miniXception_loader, self.net_input_shape, distance='l2', output_size=self.net_out_size, normalize=self.net_normalize,
                                 pooling=self.net_pool, objective="rating")
            elif self.network == 'trip':
                model = TripArch(miniXception_loader, self.net_input_shape, distance='l2', output_size=self.net_out_size, normalize=self.net_normalize,
                                 pooling=self.net_pool, categorize=self.categorize)
            else:
                assert (False)
        else:
            model = self.model

        w = self.Weights(run=run, epoch=epoch)
        assert (w is not None)

        if self.network == 'dir':
            embed_model = model.extract_core(weights=w, repool=False)
        else:
            embed_model = model.extract_core(weights=w)

        return embed_model
예제 #2
0
    def predict_malignancy(self,
                           weights_file,
                           out_filename,
                           data_subset_id,
                           dataset_type='Clean',
                           configuration=None):

        input_shape = (self.model_size, self.model_size, 1)

        # prepare model
        model = DirectArch(miniXception_loader,
                           input_shape,
                           objective="malignancy",
                           pooling=self.pooling,
                           output_size=self.out_size,
                           normalize=True)
        if weights_file is not None:
            model.load_weights(weights_file)
            print('Load from: {}'.format(weights_file))
        else:
            print('Model without weights')

        # prepare test data
        images_test, labels_test, classes_test, masks_test, meta_test = \
            prepare_data_direct(
                load_nodule_dataset(size=self.data_size, res=self.res, sample=self.sample, dataset_type=dataset_type, configuration=configuration)[data_subset_id],
                    size=self.model_size, return_meta=True, objective="malignancy", verbose=1, balanced=False)

        print("Data ready: images({}), labels({})".format(
            images_test[0].shape, labels_test.shape))
        print("Range = [{:.2f},{:.2f}]".format(np.min(images_test[0]),
                                               np.max(images_test[0])))

        images_test = np.array([
            crop_center(im, msk, size=self.model_size)[0]
            for im, msk in zip(images_test, masks_test)
        ])

        print("Image size changed to {}".format(images_test.shape))
        print('Mask not updated')

        # eval
        print("Begin Predicting...")
        pred = model.predict(images_test, round=False)
        print("Predication Ready")
        print("\tshape = {}\n\trange [{}, {}]".format(pred.shape, np.min(pred),
                                                      np.max(pred)))

        pickle.dump((images_test, pred, meta_test, labels_test, masks_test),
                    open(out_filename, 'bw'))
        print("Saved to: {}".format(out_filename))

        return (images_test, pred, meta_test, labels_test,
                masks_test), out_filename
예제 #3
0
    def __init__(self, pooling='max'):
        self.pred_file_format = '.\output\embed\predR_dirR{}_E{}_{}.p'
        self.pooling = pooling

        # Setup
        self.in_size = 128
        self.out_size = 128
        input_shape = (self.in_size, self.in_size, 1)

        # prepare model
        self.model = DirectArch(miniXception_loader,
                                input_shape,
                                objective="rating",
                                pooling=self.pooling,
                                output_size=self.out_size,
                                normalize=True)
예제 #4
0
print("Raw Data Loaded: {} entries".format(len(dataset)))

# prepare test data
images_test, labels_test = prepare_data(load_nodule_dataset()[0],
                                        classes=2,
                                        size=size)
print("Data ready: images({}), labels({})".format(images_test.shape,
                                                  labels_test.shape))
print("Range = [{},{}]".format(np.min(images_test), np.max(images_test)))

assert len(dataset) == images_test.shape[0]

#model = miniXception(None, (size, size,1),'avg', weights='w_002_37-0.95-0.82.h5')
#compile(model, learning_rate=0.01)

model = DirectArch(miniXception_loader, input_shape, 2)
#model.summary()
#model.compile()
model.load_weights('w_007_36-0.91-0.86.h5')

start = timer()
try:

    if load:
        pred, Size = pickle.load(open('pred_test.p', 'br'))
        print("loaded saved dump of predications")
    else:
        Size = [
            getAnnotation(entry['info']).estimate_diameter()
            for entry in dataset
        ]
예제 #5
0
def run(choose_model="DIR",
        epochs=200,
        config=0,
        skip_validation=False,
        no_training=False):

    np.random.seed(1337)
    random.seed(1337)
    tf.set_random_seed(1234)
    K.set_session(tf.Session(graph=tf.get_default_graph()))

    ## --------------------------------------- ##
    ## ------- General Setup ----------------- ##
    ## --------------------------------------- ##

    #data
    dataset_type = 'Primary'
    data_size = 160
    if no_training:
        data_size = 160
    res = 0.5  # 'Legacy' #0.7 #0.5 #'0.5I'
    sample = 'Normal'  # 'UniformNC' #'Normal' #'Uniform'
    use_gen = True
    #model
    model_size = 128
    input_shape = (model_size, model_size, 1)
    normalize = True
    out_size = 128
    do_augment = True
    if no_training:
        do_augment = False
    preload_weight = None

    print("-" * 30)
    print("Running {} for --** {} **-- model, with #{} configuration".format(
        "training" if not no_training else "validation", choose_model, config))
    print(
        "\tdata_size = {},\n\tmodel_size = {},\n\tres = {},\n\tdo_augment = {}"
        .format(data_size, model_size, res, do_augment))
    print("\tdataset_type = {}".format(dataset_type))
    print("-" * 30)

    model = None

    data_augment_params = {
        'max_angle': 30,
        'flip_ratio': 0.5,
        'crop_stdev': 0.15,
        'epoch': 0
    }

    data_loader = build_loader(size=data_size,
                               res=res,
                               sample=sample,
                               dataset_type=dataset_type,
                               configuration=config)

    ## --------------------------------------- ##
    ## ------- Prepare Direct Architecture ------- ##
    ## --------------------------------------- ##

    if choose_model is "DIR":
        # run = '300'  # SPIE avg-pool (data-aug, balanced=False,class_weight=True)
        # run = '301'  # SPIE max-pool (data-aug, balanced=False,class_weight=True)
        # run = '302'  # SPIE rmac-pool (data-aug, balanced=False,class_weight=True)

        # run = 'zzz'

        model = DirectArch(miniXception_loader,
                           input_shape,
                           output_size=out_size,
                           normalize=normalize,
                           pooling='msrmac')
        model.model.summary()
        model.compile(learning_rate=1e-3, decay=0)
        if use_gen:
            generator = DataGeneratorDir(
                data_loader,
                val_factor=0 if skip_validation else 1,
                balanced=False,
                data_size=data_size,
                model_size=model_size,
                batch_size=32,
                do_augment=do_augment,
                augment=data_augment_params,
                use_class_weight=True,
                use_confidence=False)
            model.load_generator(generator)
        else:
            dataset = load_nodule_dataset(size=data_size,
                                          res=res,
                                          sample=sample)
            images_train, labels_train, class_train, masks_train, _ = prepare_data_direct(
                dataset[2], num_of_classes=2)
            images_valid, labels_valid, class_valid, masks_valid, _ = prepare_data_direct(
                dataset[1], num_of_classes=2)
            images_train = np.array([
                crop_center(im, msk, size=model_size)[0]
                for im, msk in zip(images_train, masks_train)
            ])
            images_valid = np.array([
                crop_center(im, msk, size=model_size)[0]
                for im, msk in zip(images_valid, masks_valid)
            ])
            model.load_data(images_train,
                            labels_train,
                            images_valid,
                            labels_valid,
                            batch_size=32)

    if choose_model is "DIR_RATING":

        ### CLEAN SET
        # run = '800'  # rmac conf:size
        # run = '801'  # rmac conf:none
        # run = '802'  # rmac conf:rating-std
        # run = '803'  # max conf:none

        ### PRIMARY SET
        # run = '810'  # rmac conf:size
        # run = '811'  # rmac conf:none
        # run = '812'  # rmac conf:rating-std
        run = '813'  # max conf:none

        # run = 'zzz'

        obj = 'rating'  # 'distance-matrix' 'rating' 'rating-size'

        rating_scale = 'none'
        reg_loss = None  # {'SampleCorrelation': 0.0}  # 'Dispersion', 'Std', 'FeatureCorrelation', 'SampleCorrelation'
        batch_size = 32

        epoch_pre = 20
        preload_weight = None  # FileManager.Weights('dirR', output_dir=input_dir).name(run='251c{}'.format(config), epoch=epoch_pre)

        model = DirectArch(miniXception_loader,
                           input_shape,
                           output_size=out_size,
                           objective=obj,
                           separated_prediction=False,
                           normalize=normalize,
                           pooling='max',
                           l1_regularization=None,
                           regularization_loss=reg_loss,
                           batch_size=batch_size)
        model.model.summary()

        if preload_weight is not None:
            model.load_core_weights(preload_weight)

        # scheduale 02
        should_use_scheduale = (reg_loss is not None) or (obj == 'rating_size')
        sched = [{'epoch': 00, 'weights': [0.1, 0.9]},
                 {'epoch': 20, 'weights': [0.4, 0.6]},
                 {'epoch': 40, 'weights': [0.6, 0.4]},
                 {'epoch': 60, 'weights': [0.9, 0.1]},
                 {'epoch': 80, 'weights': [1.0, 0.0]}] \
            if should_use_scheduale else []

        loss = 'logcosh' if obj is not 'distance-matrix' else pearson_correlation
        model.compile(
            learning_rate=1e-3, decay=0, loss=loss, scheduale=sched
        )  # mean_squared_logarithmic_error, binary_crossentropy, logcosh

        if use_gen:
            generator = DataGeneratorDir(
                data_loader,
                val_factor=0 if skip_validation else 1,
                data_size=data_size,
                model_size=model_size,
                batch_size=batch_size,
                objective=obj,
                rating_scale=rating_scale,
                weighted_rating=(obj == 'distance-matrix'),
                balanced=False,
                do_augment=do_augment,
                augment=data_augment_params,
                use_class_weight=False,
                use_confidence=False)
            model.load_generator(generator)
        else:
            dataset = load_nodule_dataset(size=data_size,
                                          res=res,
                                          sample=sample,
                                          dataset_type=dataset_type)
            images_train, labels_train, masks_train = prepare_data_direct(
                dataset[2], objective='rating', rating_scale=rating_scale)
            images_valid, labels_valid, masks_valid = prepare_data_direct(
                dataset[1], objective='rating', rating_scale=rating_scale)
            images_train = np.array([
                crop_center(im, msk, size=model_size)[0]
                for im, msk in zip(images_train, masks_train)
            ])
            images_valid = np.array([
                crop_center(im, msk, size=model_size)[0]
                for im, msk in zip(images_valid, masks_valid)
            ])
            model.load_data(images_train,
                            labels_train,
                            images_valid,
                            labels_valid,
                            batch_size=batch_size)

    ## --------------------------------------- ##
    ## ------- Prepare Siamese Architecture ------ ##
    ## --------------------------------------- ##

    if choose_model is "SIAM":
        # run = '300'  # l1, avg-pool (data-aug, balanced=True, class_weight=False)
        # run = '301'  # l1, max-pool (data-aug, balanced=True, class_weight=False)
        # run = '302'  # l1, rmac-pool (data-aug, balanced=True, class_weight=False)
        # run = '310'  # l2, avg-pool (data-aug, balanced=True, class_weight=False)
        # run = '311'  # l2, max-pool (data-aug, balanced=True, class_weight=False)
        # run = '312'  # l2, rmac-pool (data-aug, balanced=True, class_weight=False)
        # run = '320'  # cos, avg-pool (data-aug, balanced=True, class_weight=False)
        # run = '321'  # cos, max-pool (data-aug, balanced=True, class_weight=False)
        # run = '322b'  # cos, rmac-pool (data-aug, balanced=True, class_weight=False)

        # b/c - changed margin-loss params
        # run = '313c'  # l2, max-pool MARGINAL-LOSS (data-aug, balanced=True, class_weight=False)
        # run = '314c'  # l2, rmac-pool MARGINAL-LOSS (data-aug, balanced=True, class_weight=False)
        # run = '323c'  # cos, max-pool MARGINAL-LOSS (data-aug, balanced=True, class_weight=False)
        # run = '324c'  # cos, rmac-pool MARGINAL-LOSS (data-aug, balanced=True, class_weight=False)

        # run = 'zzz'

        batch_size = 64 if local else 128

        # model
        generator = DataGeneratorSiam(data_loader,
                                      data_size=data_size,
                                      model_size=model_size,
                                      batch_size=batch_size,
                                      val_factor=0 if skip_validation else 3,
                                      balanced=True,
                                      objective="malignancy",
                                      do_augment=do_augment,
                                      augment=data_augment_params,
                                      use_class_weight=False)

        model = SiamArch(miniXception_loader,
                         input_shape,
                         output_size=out_size,
                         batch_size=batch_size,
                         distance='l2',
                         normalize=normalize,
                         pooling='msrmac')
        model.model.summary()
        model.compile(learning_rate=1e-3, decay=0)
        if use_gen:
            model.load_generator(generator)
        else:
            imgs_trn, lbl_trn = generator.next_train().__next__()
            imgs_val, lbl_val = generator.next_val().__next__()
            model.load_data(imgs_trn, lbl_trn, imgs_val, lbl_val)

    if choose_model is "SIAM_RATING":
        ### clean set
        # run = '400'  # l2-rmac no-conf
        # run = '401'  # cosine-rmac no-conf
        # run = '402'  # l2-rmac conf
        # run = '403'  # cosine-rmac conf
        # run = '404'  # l2-max no-conf
        # run = '405'  # cosine-max no-conf

        ### primary set
        # run = '410'  # l2-rmac no-conf
        # run = '411'  # cosine-rmac no-conf
        # run = '412'  # l2-rmac conf
        # run = '413'  # cosine-rmac conf
        # run = '414'  # l2-max no-conf
        # run = '415'  # cosine-max no-conf

        # run = 'zzz'

        obj = 'rating'  # rating / size / rating_size
        batch_size = 16 if local else 64
        reg_loss = None  # {'SampleCorrating_clusters_distance_and_stdrelation': 0.1}  # 'Dispersion', 'Std', 'FeatureCorrelation', 'SampleCorrelation'

        epoch_pre = 60
        preload_weight = None  # FileManager.Weights('dirR', output_dir=input_dir).name(run='251c{}'.format(config), epoch=70)

        should_use_scheduale = (reg_loss is not None) or (obj == 'rating_size')
        '''
        sched = [{'epoch': 00, 'weights': [0.1, 0.9]},
                 {'epoch': 30, 'weights': [0.4, 0.6]},
                 {'epoch': 60, 'weights': [0.6, 0.4]},
                 {'epoch': 80, 'weights': [0.9, 0.1]},
                 {'epoch': 100, 'weights': [1.0, 0.0]}] \
            if should_use_scheduale else []
        '''
        sched = [{'epoch': 00, 'weights': [0.1, 0.9]},
                 {'epoch': 20, 'weights': [0.4, 0.6]},
                 {'epoch': 30, 'weights': [0.6, 0.4]},
                 {'epoch': 50, 'weights': [0.9, 0.1]},
                 {'epoch': 80, 'weights': [1.0, 0.0]}] \
            if should_use_scheduale else []
        # model
        generator = DataGeneratorSiam(data_loader,
                                      data_size=data_size,
                                      model_size=model_size,
                                      batch_size=batch_size,
                                      train_facotr=2,
                                      val_factor=0 if skip_validation else 3,
                                      balanced=False,
                                      objective=obj,
                                      weighted_rating=True,
                                      do_augment=do_augment,
                                      augment=data_augment_params,
                                      use_class_weight=False,
                                      use_confidence=False)

        model = SiamArch(miniXception_loader,
                         input_shape,
                         output_size=out_size,
                         objective=obj,
                         batch_size=batch_size,
                         distance='cosine',
                         normalize=normalize,
                         pooling='rmac',
                         regularization_loss=reg_loss,
                         l1_regularization=False)

        if preload_weight is not None:
            model.load_core_weights(preload_weight)
        model.model.summary()
        model.compile(learning_rate=1e-3,
                      decay=0,
                      loss='logcosh',
                      scheduale=sched)  # mean_squared_error, logcosh
        model.load_generator(generator)

    ## --------------------------------------- ##
    ## ------- Prepare Triplet Architecture ------ ##
    ## --------------------------------------- ##

    if choose_model is "TRIPLET":
        #run = 'trip011XXX'  # mrg-loss, decay(0.01), max-pool
        #run = 'trip012X'  # mrg-loss, decay(0.05), rmac-pool
        #run = 'trip013'  # cosine
        #run = 'trip014' # ortogonal initialization
        #run = 'trip015X'  # objective rating
        #run = 'trip016XXXX'  # softplus-loss
        #run = 'trip017'  # softplus-loss, no decay
        #run = 'trip018'  # binary
        #run = 'trip019'  # categorize
        #run = 'trip020X'  # rating-conf-tryout

        #run = 'trip021' # pretrained
        #run = 'trip022XXX'  # pretrained rmac
        #run = 'trip023X'  # pretrained categorize
        #run = 'trip024'  # pretrained confidence
        #run = 'trip025'  # pretrained cat,conf
        #run = 'trip026Z'  # class_weight='rating_distance', cat

        #run = 'trip027'  # obj:malig, rmac, categorize, no-decay
        #run = 'trip028'  # obj:malig, max, categorize, no-decay

        run = 'trip_100'  # obj:malig, msrmac, softplus-loss
        #run = 'trip101'  # obj:malig, msrmac, rank-loss

        objective = 'malignancy'
        use_rank_loss = False

        gen = True
        preload_weight = None  #'./Weights/w_dirR011X_50.h5'

        # model
        model = TripArch(miniXception_loader,
                         input_shape,
                         objective=objective,
                         output_size=out_size,
                         distance='l2',
                         normalize=True,
                         pooling='msrmac',
                         categorize=use_rank_loss)

        if preload_weight is not None:
            model.load_core_weights(preload_weight)
        model.model.summary()
        model.compile(learning_rate=1e-3, decay=0)  #0.05

        generator = DataGeneratorTrip(data_loader,
                                      data_size=data_size,
                                      model_size=model_size,
                                      batch_size=16,
                                      objective=objective,
                                      balanced=(objective == 'malignancy'),
                                      categorize=True,
                                      val_factor=0 if skip_validation else 3,
                                      train_factor=1,
                                      do_augment=do_augment,
                                      augment=data_augment_params,
                                      use_class_weight=False,
                                      use_confidence=False)
        if gen:
            model.load_generator(generator)
        else:
            imgs_trn, lbl_trn = generator.next_train().__next__()
            imgs_val, lbl_val = generator.next_val().__next__()
            model.load_data(imgs_trn, lbl_trn, imgs_val, lbl_val)

    ## --------------------------------------- ##
    ## -------      RUN             ------ ##
    ## --------------------------------------- ##

    print('Current Run: {}{}c{}'.format('', run, config))

    if no_training:
        model.last_epoch = epochs
        model.run = '{}{}c{}'.format('', run, config)
    else:
        model.train(run='{}{}c{}'.format('', run, config),
                    epoch=(0 if preload_weight is None else epoch_pre),
                    n_epoch=epochs,
                    gen=use_gen,
                    do_graph=False)

    return model
예제 #6
0
def run(choose_model="DIR",
        epochs=200,
        config=0,
        skip_validation=False,
        no_training=False):

    np.random.seed(1337)
    random.seed(1337)
    tf.set_random_seed(1234)
    K.set_session(tf.Session(graph=tf.get_default_graph()))

    ## --------------------------------------- ##
    ## ------- General Setup ----------------- ##
    ## --------------------------------------- ##

    net_type = 'flat'  # 'flat', 'rmac'

    #data
    dataset_type = '3d'
    res = 0.5  # 'Legacy' #0.7 #0.5 #'0.5I'
    sample = 'Normal'  # 'UniformNC' #'Normal' #'Uniform'
    use_gen = True
    data_size = 160

    data_loader = build_loader_3d(configuration=config,
                                  net_type='dirR',
                                  run='251',
                                  epoch=60)

    # model
    out_size = 128
    if net_type == 'flat':
        model_size = 8 * 8 * 128
    elif net_type == 'rmac':
        model_size = 128
    else:
        assert False
    input_shape = (None, model_size)
    do_augment = False
    normalize = True

    print("-" * 30)
    print("Running Sequence {} for --** {} **-- model, with #{} configuration".
          format("training" if not no_training else "validation", choose_model,
                 config))
    print(
        "\tdata_size = {},\n\tmodel_size = {},\n\tres = {},\n\tdo_augment = {}"
        .format(data_size, model_size, res, do_augment))
    print("-" * 30)

    model = None

    ## --------------------------------------- ##
    ## ------- Prepare Direct Architecture ------- ##
    ## --------------------------------------- ##

    if choose_model is "DIR_RATING":

        #run = '0004'
        run = '0005'  # new dataset (Train-Valid-Test)
        obj = 'rating'  # 'distance-matrix' 'rating' 'rating-size'

        rating_scale = 'none'
        reg_loss = None  # {'SampleCorrelation': 0.0}  # 'Dispersion', 'Std', 'FeatureCorrelation', 'SampleCorrelation'
        batch_size = 16

        epoch_pre = 20
        preload_weight = None  # FileManager.Weights('dirR', output_dir=input_dir).name(run='251c{}'.format(config), epoch=epoch_pre)

        model = DirectArch(gru3d_loader,
                           input_shape,
                           output_size=out_size,
                           objective=obj,
                           separated_prediction=False,
                           normalize=normalize,
                           pooling='msrmac',
                           l1_regularization=None,
                           regularization_loss=reg_loss,
                           batch_size=batch_size)
        model.model.summary()

        if preload_weight is not None:
            model.load_core_weights(preload_weight)

        # scheduale 02
        should_use_scheduale = (reg_loss is not None) or (obj == 'rating_size')
        sched = [{'epoch': 00, 'weights': [0.1, 0.9]},
                 {'epoch': 20, 'weights': [0.4, 0.6]},
                 {'epoch': 40, 'weights': [0.6, 0.4]},
                 {'epoch': 60, 'weights': [0.9, 0.1]},
                 {'epoch': 80, 'weights': [1.0, 0.0]}] \
            if should_use_scheduale else []

        loss = 'logcosh' if obj is not 'distance-matrix' else pearson_correlation
        model.compile(
            learning_rate=1e-3,
            decay=0,
            loss=loss,
            scheduale=sched,
            temporal_weights=False
        )  # mean_squared_logarithmic_error, binary_crossentropy, logcosh

        if use_gen:
            generator = DataGeneratorDir(
                data_loader,
                val_factor=0 if skip_validation else 1,
                data_size=data_size,
                model_size=model_size,
                batch_size=batch_size,
                objective=obj,
                rating_scale=rating_scale,
                weighted_rating=False,
                seq_model=True,
                balanced=False,
                do_augment=do_augment,
                use_class_weight=False,
                use_confidence=False)
            model.load_generator(generator)
        else:
            dataset = load_nodule_dataset(size=data_size,
                                          res=res,
                                          sample=sample,
                                          dataset_type=dataset_type)
            images_train, labels_train, masks_train = prepare_data_direct(
                dataset[2], objective='rating', rating_scale=rating_scale)
            images_valid, labels_valid, masks_valid = prepare_data_direct(
                dataset[1], objective='rating', rating_scale=rating_scale)
            images_train = np.array([
                crop_center(im, msk, size=model_size)[0]
                for im, msk in zip(images_train, masks_train)
            ])
            images_valid = np.array([
                crop_center(im, msk, size=model_size)[0]
                for im, msk in zip(images_valid, masks_valid)
            ])
            model.load_data(images_train,
                            labels_train,
                            images_valid,
                            labels_valid,
                            batch_size=batch_size)

    ## --------------------------------------- ##
    ## ------- Prepare Siamese Architecture ------ ##
    ## --------------------------------------- ##

    if choose_model is "SIAM_RATING":
        #run = 'siamR001'  # mse-loss, rating-scaled
        #run = 'siamR002'  # mse-loss, rating-scaled, repeated-epochs
        #run = 'siamR003'  # mse-loss, 0.25*rating-scaled, repeated-epochs(3)
        #run = 'siamR004X'  # mse-loss, 0.25*rating-scaled, repeated-epochs(5)
        #run = 'siamR005'  # mse-loss, 0.25*rating-scaled, repeated-epochs(1)
        #run = 'siamR006XX'  # rmac, mse-loss, 0.25*rating-scaled, repeated-epochs(1)
        #run = 'siamR007'  # rmac, logcosh-loss, 0.25*rating-scaled, repeated-epochs(1)
        #run = 'siamR008X'  # data-aug
        #run = 'siamR009'  # cosine
        #run = '100c'  # l2, max-pooling, train_factor=1
        #run = '101b'  # l2, max-pooling, train_factor=2
        #run = '102'  # l2, max-pooling, train_factor=3
        #run = '103'  # l2, max-pooling, train_factor=1, mse
        #run = '110'  # l2, max-pooling, train_factor=3
        #run = '112'  # l2, msrmac-pooling, train_factor=3
        #run = '122'  # l2, msrmac-pooling, train_factor=2, data-aug
        #run = '132'  # l2, msrmac-pooling, train_factor=2, data-aug, primary
        #run = '142'  # l2, msrmac-pooling, train_factor=2, out=64
        #run = '152'  # l2, msrmac-pooling, train_factor=2, out=32
        #run = '162'  # l2, msrmac-pooling, train_factor=2, out=8
        #run = '172'  # l2, msrmac-pooling, train_factor=2, out=256
        #run = '135'  # l2, msrmac-pooling, train_factor=2, data-aug, primary
        #run = '180'  # baseline, b64
        #run = '181'  # baseline, FeatCorr.1
        #run = '182'  # baseline, SampCorr.1

        run = '200'  # pretrain with dirR251-70

        #run = '300'   # obj: size
        #run = '311'  # obj: rating-size

        #run = 'zzz'  #

        dataset_type = 'Primary'
        obj = 'rating'  # rating / size / rating_size
        batch_size = 16 if local else 64
        reg_loss = None  # {'SampleCorrelation': 0.1}  # 'Dispersion', 'Std', 'FeatureCorrelation', 'SampleCorrelation'

        epoch_pre = 60
        preload_weight = None  # FileManager.Weights('dirR', output_dir=input_dir).name(run='251c{}'.format(config), epoch=70)

        should_use_scheduale = (reg_loss is not None) or (obj == 'rating_size')
        '''
        sched = [{'epoch': 00, 'weights': [0.1, 0.9]},
                 {'epoch': 30, 'weights': [0.4, 0.6]},
                 {'epoch': 60, 'weights': [0.6, 0.4]},
                 {'epoch': 80, 'weights': [0.9, 0.1]},
                 {'epoch': 100, 'weights': [1.0, 0.0]}] \
            if should_use_scheduale else []
        '''
        sched = [{'epoch': 00, 'weights': [0.1, 0.9]},
                 {'epoch': 20, 'weights': [0.4, 0.6]},
                 {'epoch': 30, 'weights': [0.6, 0.4]},
                 {'epoch': 50, 'weights': [0.9, 0.1]},
                 {'epoch': 80, 'weights': [1.0, 0.0]}] \
            if should_use_scheduale else []
        # model
        generator = DataGeneratorSiam(data_loader,
                                      data_size=data_size,
                                      model_size=model_size,
                                      batch_size=batch_size,
                                      train_facotr=2,
                                      val_factor=0 if skip_validation else 3,
                                      balanced=False,
                                      objective=obj,
                                      do_augment=do_augment,
                                      augment=data_augment_params,
                                      use_class_weight=False,
                                      use_confidence=False)

        model = SiamArch(miniXception_loader,
                         input_shape,
                         output_size=out_size,
                         objective=obj,
                         batch_size=batch_size,
                         distance='l2',
                         normalize=normalize,
                         pooling='msrmac',
                         regularization_loss=reg_loss,
                         l1_regularization=False)

        if preload_weight is not None:
            model.load_core_weights(preload_weight)
        model.model.summary()
        model.compile(learning_rate=1e-3,
                      decay=0,
                      loss='logcosh',
                      scheduale=sched)  # mean_squared_error, logcosh
        model.load_generator(generator)

    ## --------------------------------------- ##
    ## ------- Prepare Triplet Architecture ------ ##
    ## --------------------------------------- ##

    if choose_model is "TRIPLET":
        #run = 'trip011XXX'  # mrg-loss, decay(0.01), max-pool
        #run = 'trip012X'  # mrg-loss, decay(0.05), rmac-pool
        #run = 'trip013'  # cosine
        #run = 'trip014' # ortogonal initialization
        #run = 'trip015X'  # objective rating
        #run = 'trip016XXXX'  # softplus-loss
        #run = 'trip017'  # softplus-loss, no decay
        #run = 'trip018'  # binary
        #run = 'trip019'  # categorize
        #run = 'trip020X'  # rating-conf-tryout

        #run = 'trip021' # pretrained
        #run = 'trip022XXX'  # pretrained rmac
        #run = 'trip023X'  # pretrained categorize
        #run = 'trip024'  # pretrained confidence
        #run = 'trip025'  # pretrained cat,conf
        #run = 'trip026Z'  # class_weight='rating_distance', cat

        #run = 'trip027'  # obj:malig, rmac, categorize, no-decay
        #run = 'trip028'  # obj:malig, max, categorize, no-decay

        run = 'trip_100'  # obj:malig, msrmac, softplus-loss
        #run = 'trip101'  # obj:malig, msrmac, rank-loss

        dataset_type = 'Primary'
        objective = 'malignancy'
        use_rank_loss = False

        gen = True
        preload_weight = None  #'./Weights/w_dirR011X_50.h5'

        # model
        model = TripArch(miniXception_loader,
                         input_shape,
                         objective=objective,
                         output_size=out_size,
                         distance='l2',
                         normalize=True,
                         pooling='msrmac',
                         categorize=use_rank_loss)

        if preload_weight is not None:
            model.load_core_weights(preload_weight)
        model.model.summary()
        model.compile(learning_rate=1e-3, decay=0)  #0.05

        generator = DataGeneratorTrip(data_loader,
                                      data_size=data_size,
                                      model_size=model_size,
                                      batch_size=16,
                                      objective=objective,
                                      balanced=(objective == 'malignancy'),
                                      categorize=True,
                                      val_factor=0 if skip_validation else 3,
                                      train_factor=1,
                                      do_augment=do_augment,
                                      augment=data_augment_params,
                                      use_class_weight=False,
                                      use_confidence=False)
        if gen:
            model.load_generator(generator)
        else:
            imgs_trn, lbl_trn = generator.next_train().__next__()
            imgs_val, lbl_val = generator.next_val().__next__()
            model.load_data(imgs_trn, lbl_trn, imgs_val, lbl_val)

    ## --------------------------------------- ##
    ## -------      RUN             ------ ##
    ## --------------------------------------- ##

    if no_training:
        model.last_epoch = epochs
        model.run = '{}{}c{}'.format('', run, config)
    else:
        model.train(run='{}{}c{}'.format('', run, config),
                    epoch=(0 if preload_weight is None else epoch_pre),
                    n_epoch=epochs,
                    gen=use_gen,
                    do_graph=False)

    return model
예제 #7
0
def run(choose_model="DIR",
        epochs=200,
        config=0,
        skip_validation=False,
        no_training=False,
        config_name='LEGACY',
        load_data_from_predications=False):

    np.random.seed(1337)
    random.seed(1337)
    tf.set_random_seed(1234)
    K.set_session(tf.Session(graph=tf.get_default_graph()))

    ## --------------------------------------- ##
    ## ------- General Setup ----------------- ##
    ## --------------------------------------- ##

    #data
    dataset_type = 'Primary'
    data_size = 160
    if no_training:
        data_size = 160
    res = 0.5  # 'Legacy' #0.7 #0.5 #'0.5I'
    sample = 'Normal'  # 'UniformNC' #'Normal' #'Uniform'
    data_run = '813'
    data_epoch = 70
    return_predicted_ratings = not no_training
    use_gen = True
    #model
    model_size = 128
    input_shape = (model_size, model_size, 1)
    normalize = True
    out_size = 128
    do_augment = True
    if no_training:
        do_augment = False
    preload_weight = None

    print("-" * 30)
    print("Running {} for --** {} **-- model, with #{} configuration".format(
        "training" if not no_training else "validation", choose_model, config))
    if load_data_from_predications:
        print(
            "\tdata_run = {}, \n\tdata_epoch = {}, return_predicted_ratings = {}"
            .format(data_run, data_epoch, return_predicted_ratings))
    else:
        print(
            "\tdata_size = {},\n\tmodel_size = {},\n\tres = {},\n\tdo_augment = {}"
            .format(data_size, model_size, res, do_augment))
        print("\tdataset_type = {}".format(dataset_type))
    print("-" * 30)

    model = None

    data_augment_params = {
        'max_angle': 30,
        'flip_ratio': 0.5,
        'crop_stdev': 0.15,
        'epoch': 0
    }

    data_loader = build_loader(
        size=data_size,
        res=res,
        sample=sample,
        dataset_type=dataset_type,
        config_name=config_name,
        configuration=config,
        run=data_run,
        epoch=data_epoch,
        load_data_from_predictions=load_data_from_predications,
        return_predicted_ratings=return_predicted_ratings)

    ## --------------------------------------- ##
    ## ------- Prepare Direct Architecture ------- ##
    ## --------------------------------------- ##

    if choose_model is "DIR":
        # run = '300'  # SPIE avg-pool (data-aug, balanced=False,class_weight=True)
        # run = '301'  # SPIE max-pool (data-aug, balanced=False,class_weight=True)
        # run = '302'  # SPIE rmac-pool (data-aug, balanced=False,class_weight=True)

        # run = 'zzz'

        model = DirectArch(miniXception_loader,
                           input_shape,
                           output_size=out_size,
                           normalize=normalize,
                           pooling='msrmac')
        model.model.summary()
        model.compile(learning_rate=1e-3, decay=0)
        if use_gen:
            generator = DataGeneratorDir(
                data_loader,
                val_factor=0 if skip_validation else 1,
                balanced=False,
                data_size=data_size,
                model_size=model_size,
                batch_size=32,
                do_augment=do_augment,
                augment=data_augment_params,
                use_class_weight=True,
                use_confidence=False)
            model.load_generator(generator)
        else:
            dataset = load_nodule_dataset(size=data_size,
                                          res=res,
                                          sample=sample)
            images_train, labels_train, class_train, masks_train, _ = prepare_data_direct(
                dataset[2], num_of_classes=2)
            images_valid, labels_valid, class_valid, masks_valid, _ = prepare_data_direct(
                dataset[1], num_of_classes=2)
            images_train = np.array([
                crop_center(im, msk, size=model_size)[0]
                for im, msk in zip(images_train, masks_train)
            ])
            images_valid = np.array([
                crop_center(im, msk, size=model_size)[0]
                for im, msk in zip(images_valid, masks_valid)
            ])
            model.load_data(images_train,
                            labels_train,
                            images_valid,
                            labels_valid,
                            batch_size=32)

    if choose_model is "DIR_RATING":

        ### CLEAN SET
        # run = '800'  # rmac conf:size
        # run = '801'  # rmac conf:none
        # run = '802'  # rmac conf:rating-std
        # run = '803'  # max conf:none

        ### PRIMARY SET
        # run = '810'  # rmac conf:size
        # run = '811'  # rmac conf:none
        # run = '812'  # rmac conf:rating-std
        # run = '813'  # max conf:none
        # run = '814'  # max separated_prediction

        # run = '820'  # dirD, max, logcoh-loss
        # run = '821'  # dirD, max, pearson-loss
        # run = '822'  # dirD, max, KL-rank-loss
        # run = '823'  # dirD, max, poisson-rank-loss
        # run = '824'  # dirD, max, categorical-cross-entropy-loss
        # run = '825'  # dirD, max, ranked-pearson-loss
        # run = '826'  # dirD, max, KL-normalized-rank-loss
        # run = '827'  # dirD, max, KL-normalized-rank-loss (local-scaled) softmax
        # run = '828'  # dirD, max, KL-normalized-rank-loss (local-scaled) l2
        # run = '829'  # dirD, max, ranked-pearson-loss (local-scaled)

        # run = '830'  # dirD, rmac, logcoh-loss
        # run = '831'  # dirD, rmac, pearson-loss
        # run = '832'  # dirD, rmac, KL-rank-loss
        # run = '833'  # dirD, rmac, poisson-rank-loss
        # run = '834'  # dirD, rmac, categorical-cross-entropy-loss
        # run = '835'  # dirD, rmac, ranked-pearson-loss
        # run = '836'  # dirD, rmac, KL-normalized-rank-loss

        # run = '841'  # dirD, max, pearson-loss    pre:dirR813-50
        # run = '842b'  # dirD, max, KL-rank-loss    pre:dirR813-50  (b:lr-4)
        # run = '846'  # dirD, max, KL-norm-loss    pre:dirR813-50

        # run = '851'  # dirD, rmac, pearson-loss   pre:dirR813-50
        # run = '852'  # dirD, rmac, KL-rank-loss   pre:dirR813-50
        # run = '856'  # dirD, rmac, KL-norm-loss   pre:dirR813-50

        # run = '860'  # dirD, max, KL-loss    pre:dirR813-50  (b:lr-4, freeze:7)
        # run = '861'  # dirD, max, KL-loss    pre:dirR813-50  (b:lr-4, freeze:17)
        # run = '862'  # dirD, max, KL-loss    pre:dirR813-50  (b:lr-4, freeze:28)
        # run = '863'  # dirD, max, KL-loss    pre:dirR813-50  (b:lr-4, freeze:39)

        # run = '870'  # dirRD, max, KL-loss    schd: 00
        # run = '871'  # dirRD, max, KL-loss    schd: 01
        # run = '872'  # dirRD, max, KL-loss    schd: 02
        # run = '873'  # dirRD, max, KL-loss    schd: 03
        # run = '874'  # dirRD, max, KL-loss    schd: 04
        # run = '875'  # dirRD, max, KL-loss    schd: 05
        # run = '876'  # dirRD, max, KL-loss    schd: 06
        # run = '877b'  # dirRD, max, KL-loss    schd: 07b
        # run = '878'  # dirRD, max, KL-loss    schd: 08
        # run = '879'  # dirRD, max, KL-loss    schd: 09

        # run = '888'  # dirRD, max, KL-loss    schd: 08, on partial data SUP
        # run = '882'  # dirRD, max, KL-loss    schd:

        run = '898b'  # dirRD, max, KL-loss    schd: 08, on partial data UNSUP
        # run = '890b'  # dirR
        # run = '892b'  # dirRD, max, KL-loss

        # run = 'ccc'

        obj = 'rating_distance-matrix'  # 'distance-matrix' 'rating' 'rating-size'

        rating_scale = 'none'
        reg_loss = None  # {'SampleCorrelation': 0.0}  # 'Dispersion', 'Std', 'FeatureCorrelation', 'SampleCorrelation'
        batch_size = 32

        epoch_pre = 50
        preload_weight = None
        # FileManager.Weights('dirR', output_dir=input_dir).name(run='813c{}'.format(config), epoch=epoch_pre)
        # FileManager.Weights('dirR', output_dir=input_dir).name(run='251c{}'.format(config), epoch=epoch_pre)

        model = DirectArch(miniXception_loader,
                           input_shape,
                           output_size=out_size,
                           objective=obj,
                           separated_prediction=False,
                           normalize=normalize,
                           pooling='max',
                           l1_regularization=None,
                           regularization_loss=reg_loss,
                           batch_size=batch_size)

        if preload_weight is not None:
            model.load_core_weights(preload_weight, 39)
            # 7:    freeze 1 blocks
            # 17:   freeze 2 blocks
            # 28:   freeze 3 blocks
            # 39:   freeze 4 blocks

        model.model.summary()

        should_use_scheduale = (reg_loss is not None) or (obj in [
            'rating_size', 'rating_distance-matrix'
        ])

        # scheduale 00:     870
        # sched = [{'epoch': 00, 'weights': [0.9, 0.1]},
        #         {'epoch': 40, 'weights': [0.5, 0.5]},
        #         {'epoch': 80, 'weights': [0.1, 0.9]}] \
        #    if should_use_scheduale else []

        # scheduale 01:     871
        # sched = [{'epoch': 00, 'weights': [1.0, 0.0]},
        #         {'epoch': 50, 'weights': [0.0, 1.0]}] \
        #    if should_use_scheduale else []

        # scheduale 02:     872
        # sched = [{'epoch': 00, 'weights': [0.9, 0.1]},
        #       {'epoch': 50, 'weights': [0.1, 0.9]}] \
        #   if should_use_scheduale else []

        # scheduale 03:     873
        # sched = [{'epoch': 00, 'weights': [0.9, 0.1]},
        #        {'epoch': 50, 'weights': [0.5, 0.5]},
        #         {'epoch': 100, 'weights': [0.1, 0.9]}] \
        #    if should_use_scheduale else []

        # scheduale 04:     874
        # sched = [{'epoch': 00, 'weights': [1.0, 0.0]},
        #        {'epoch': 50, 'weights': [0.0, 0.1]}] \
        #   if should_use_scheduale else []

        # scheduale 05:     875
        # sched = [{'epoch': 00, 'weights': [1.0, 0.0]},
        #        {'epoch': 50, 'weights': [0.0, 1.0]},
        #         {'epoch': 100, 'weights': [0.0, 0.1]}] \
        #    if should_use_scheduale else []

        # scheduale 06:     876
        # sched = [{'epoch': 00, 'weights': [0.9, 0.1]},
        #         {'epoch': 40, 'weights': [0.5, 0.5]},
        #         {'epoch': 60, 'weights': [0.1, 0.1]},
        #         {'epoch': 80, 'weights': [0.0, 0.1]},
        #         {'epoch': 100, 'weights': [0.0, 0.05]}] \
        #    if should_use_scheduale else []

        # scheduale 07b:     877b
        # sched = [{'epoch': 00,  'weights': [1.0, 0.0]},
        #         {'epoch': 50,  'weights': [0.0, 1.0]},
        #         {'epoch': 80,  'weights': [0.0, 0.1]},
        #         {'epoch': 100, 'weights': [0.0, 0.05]}] \
        #    if should_use_scheduale else []

        # scheduale 08b:     878
        # sched = [{'epoch': 00, 'weights': [0.9, 0.1]},
        #         {'epoch': 40, 'weights': [0.5, 0.5]},
        #         {'epoch': 80, 'weights': [0.0, 0.1]}] \
        #    if should_use_scheduale else []

        # scheduale 09:     879
        # sched = [{'epoch': 00, 'weights': [0.9, 0.1]},
        #         {'epoch': 20, 'weights': [0.7, 0.3]},
        #         {'epoch': 40, 'weights': [0.5, 0.5]},
        #         {'epoch': 60, 'weights': [0.3, 0.3]},
        #         {'epoch': 80, 'weights': [0.0, 0.1]}] \
        #    if should_use_scheduale else []

        # scheduale      892/882
        sched = [{'epoch': 00, 'weights': [0.9, 0.1]},
                 {'epoch': 80, 'weights': [0.5, 0.5]},
                 {'epoch': 120, 'weights': [0.0, 0.1]}] \
            if should_use_scheduale else []

        loss = dict()
        loss['predictions'] = 'logcosh'
        loss['predictions_size'] = 'logcosh'
        loss['distance_matrix'] = distance_matrix_rank_loss_adapter(
            K_losses.kullback_leibler_divergence, 'KL')
        # distance_matrix_logcosh
        # pearson_correlation
        # distance_matrix_rank_loss_adapter(K_losses.kullback_leibler_divergence, 'KL')
        # distance_matrix_rank_loss_adapter(K_losses.poisson, 'poisson')
        # distance_matrix_rank_loss_adapter(K_losses.categorical_crossentropy, 'entropy')
        model.compile(
            learning_rate=1e-3 if (preload_weight is None) else 1e-4,
            loss=loss,
            scheduale=sched
        )  # mean_squared_logarithmic_error, binary_crossentropy, logcosh

        if use_gen:
            generator = DataGeneratorDir(
                data_loader,
                val_factor=0 if skip_validation else 1,
                data_size=data_size,
                model_size=model_size,
                batch_size=batch_size,
                objective=obj,
                rating_scale=rating_scale,
                weighted_rating=('distance-matrix' in obj),
                balanced=False,
                do_augment=do_augment,
                augment=data_augment_params,
                use_class_weight=False,
                use_confidence=False)
            model.load_generator(generator)
        else:
            dataset = load_nodule_dataset(size=data_size,
                                          res=res,
                                          sample=sample,
                                          dataset_type=dataset_type)
            images_train, labels_train, masks_train = prepare_data_direct(
                dataset[2], objective='rating', rating_scale=rating_scale)
            images_valid, labels_valid, masks_valid = prepare_data_direct(
                dataset[1], objective='rating', rating_scale=rating_scale)
            images_train = np.array([
                crop_center(im, msk, size=model_size)[0]
                for im, msk in zip(images_train, masks_train)
            ])
            images_valid = np.array([
                crop_center(im, msk, size=model_size)[0]
                for im, msk in zip(images_valid, masks_valid)
            ])
            model.load_data(images_train,
                            labels_train,
                            images_valid,
                            labels_valid,
                            batch_size=batch_size)

    ## --------------------------------------- ##
    ## ------- Prepare Siamese Architecture ------ ##
    ## --------------------------------------- ##

    if choose_model is "SIAM":
        # run = '300'  # l1, avg-pool (data-aug, balanced=True, class_weight=False)
        # run = '301'  # l1, max-pool (data-aug, balanced=True, class_weight=False)
        # run = '302'  # l1, rmac-pool (data-aug, balanced=True, class_weight=False)
        # run = '310'  # l2, avg-pool (data-aug, balanced=True, class_weight=False)
        # run = '311'  # l2, max-pool (data-aug, balanced=True, class_weight=False)
        # run = '312'  # l2, rmac-pool (data-aug, balanced=True, class_weight=False)
        # run = '320'  # cos, avg-pool (data-aug, balanced=True, class_weight=False)
        # run = '321'  # cos, max-pool (data-aug, balanced=True, class_weight=False)
        # run = '322b'  # cos, rmac-pool (data-aug, balanced=True, class_weight=False)

        # b/c - changed margin-loss params
        # run = '313c'  # l2, max-pool MARGINAL-LOSS (data-aug, balanced=True, class_weight=False)
        # run = '314c'  # l2, rmac-pool MARGINAL-LOSS (data-aug, balanced=True, class_weight=False)
        # run = '323c'  # cos, max-pool MARGINAL-LOSS (data-aug, balanced=True, class_weight=False)
        # run = '324c'  # cos, rmac-pool MARGINAL-LOSS (data-aug, balanced=True, class_weight=False)

        # run = 'zzz'

        batch_size = 64 if local else 128

        # model
        generator = DataGeneratorSiam(data_loader,
                                      data_size=data_size,
                                      model_size=model_size,
                                      batch_size=batch_size,
                                      val_factor=0 if skip_validation else 3,
                                      balanced=True,
                                      objective="malignancy",
                                      do_augment=do_augment,
                                      augment=data_augment_params,
                                      use_class_weight=False)

        model = SiamArch(miniXception_loader,
                         input_shape,
                         output_size=out_size,
                         batch_size=batch_size,
                         distance='l2',
                         normalize=normalize,
                         pooling='msrmac')
        model.model.summary()
        model.compile(learning_rate=1e-3, decay=0)
        if use_gen:
            model.load_generator(generator)
        else:
            imgs_trn, lbl_trn = generator.next_train().__next__()
            imgs_val, lbl_val = generator.next_val().__next__()
            model.load_data(imgs_trn, lbl_trn, imgs_val, lbl_val)

    if choose_model is "SIAM_RATING":
        ### clean set
        # run = '400'  # l2-rmac no-conf
        # run = '401'  # cosine-rmac no-conf
        # run = '402'  # l2-rmac conf
        # run = '403'  # cosine-rmac conf
        # run = '404'  # l2-max no-conf
        # run = '405'  # cosine-max no-conf

        ### primary set
        # run = '410'  # l2-rmac no-conf
        # run = '411'  # cosine-rmac no-conf
        # run = '412'  # l2-rmac conf
        # run = '413'  # cosine-rmac conf
        # run = '414'  # l2-max no-conf
        # run = '415'  # cosine-max no-conf

        run = 'zzz'

        obj = 'rating'  # rating / size / rating_size
        batch_size = 16 if local else 64
        reg_loss = None  # {'SampleCorrating_clusters_distance_and_stdrelation': 0.1}  # 'Dispersion', 'Std', 'FeatureCorrelation', 'SampleCorrelation'

        epoch_pre = 60
        preload_weight = None  # FileManager.Weights('dirR', output_dir=input_dir).name(run='251c{}'.format(config), epoch=70)

        should_use_scheduale = (reg_loss is not None) or (obj == 'rating_size')
        '''
        sched = [{'epoch': 00, 'weights': [0.1, 0.9]},
                 {'epoch': 30, 'weights': [0.4, 0.6]},
                 {'epoch': 60, 'weights': [0.6, 0.4]},
                 {'epoch': 80, 'weights': [0.9, 0.1]},
                 {'epoch': 100, 'weights': [1.0, 0.0]}] \
            if should_use_scheduale else []
        '''
        sched = [{'epoch': 00, 'weights': [0.1, 0.9]},
                 {'epoch': 20, 'weights': [0.4, 0.6]},
                 {'epoch': 30, 'weights': [0.6, 0.4]},
                 {'epoch': 50, 'weights': [0.9, 0.1]},
                 {'epoch': 80, 'weights': [1.0, 0.0]}] \
            if should_use_scheduale else []
        # model
        generator = DataGeneratorSiam(data_loader,
                                      data_size=data_size,
                                      model_size=model_size,
                                      batch_size=batch_size,
                                      train_facotr=2,
                                      val_factor=0 if skip_validation else 3,
                                      balanced=False,
                                      objective=obj,
                                      weighted_rating=True,
                                      do_augment=do_augment,
                                      augment=data_augment_params,
                                      use_class_weight=False,
                                      use_confidence=False)

        model = SiamArch(miniXception_loader,
                         input_shape,
                         output_size=out_size,
                         objective=obj,
                         batch_size=batch_size,
                         distance='cosine',
                         normalize=normalize,
                         pooling='rmac',
                         regularization_loss=reg_loss,
                         l1_regularization=False)

        if preload_weight is not None:
            model.load_core_weights(preload_weight)
        model.model.summary()
        model.compile(learning_rate=1e-3,
                      decay=0,
                      loss='logcosh',
                      scheduale=sched)  # mean_squared_error, logcosh
        model.load_generator(generator)

    ## --------------------------------------- ##
    ## ------- Prepare Triplet Architecture ------ ##
    ## --------------------------------------- ##

    if choose_model is "TRIPLET":

        # run = '000'  # rmac softplus, b16
        # run = '001'  # rmac hinge, b16, pre:dirR813-50
        # run = '002'  # rmac hinge, b32, pre:dirR813-50
        # run = '003'  # rmac hinge, b64, pre:dirR813-50
        # run = '004'  # rmac hinge, b128, pre:dirR813-50
        # run = '005'  # rmac hinge, b64, pre:dirR813-50
        run = '006'  # rmac rank, b64, pre:dirR813-50

        # run = 'zzz'

        objective = 'rating'
        use_rank_loss = True

        batch_size = 16 if local else 64

        gen = True
        epoch_pre = 50
        preload_weight = FileManager.Weights(
            'dirR', output_dir=input_dir).name(run='813c{}'.format(config),
                                               epoch=epoch_pre)

        # model
        model = TripArch(miniXception_loader,
                         input_shape,
                         objective=objective,
                         output_size=out_size,
                         distance='l2',
                         normalize=True,
                         pooling='msrmac',
                         categorize=use_rank_loss)

        if preload_weight is not None:
            model.load_core_weights(preload_weight)
        model.model.summary()
        model.compile(learning_rate=1e-3, decay=0)

        generator = DataGeneratorTrip(data_loader,
                                      data_size=data_size,
                                      model_size=model_size,
                                      batch_size=batch_size,
                                      objective=objective,
                                      balanced=(objective == 'malignancy'),
                                      categorize=use_rank_loss,
                                      val_factor=0 if skip_validation else 1,
                                      train_factor=2,
                                      do_augment=do_augment,
                                      augment=data_augment_params,
                                      use_class_weight=False,
                                      use_confidence=False)
        if gen:
            model.load_generator(generator)
        else:
            imgs_trn, lbl_trn = generator.next_train().__next__()
            imgs_val, lbl_val = generator.next_val().__next__()
            model.load_data(imgs_trn, lbl_trn, imgs_val, lbl_val)

    ## --------------------------------------- ##
    ## -------      RUN             ------ ##
    ## --------------------------------------- ##

    cnf_id = config if config_name == 'LEGACY' else CrossValidationManager(
        config_name).get_run_id(config)
    run_name = '{}{}c{}'.format('', run, cnf_id)
    print('Current Run: {}'.format(run_name))
    if no_training:
        model.last_epoch = epochs
        model.run = run_name
    else:
        model.train(run=run_name,
                    epoch=(0 if preload_weight is None else epoch_pre),
                    n_epoch=epochs,
                    gen=use_gen,
                    do_graph=False)

    return model
예제 #8
0
class Rating:
    def __init__(self, pooling='max'):
        self.pred_file_format = '.\output\embed\predR_dirR{}_E{}_{}.p'
        self.pooling = pooling

        # Setup
        self.in_size = 128
        self.out_size = 128
        input_shape = (self.in_size, self.in_size, 1)

        # prepare model
        self.model = DirectArch(miniXception_loader,
                                input_shape,
                                objective="rating",
                                pooling=self.pooling,
                                output_size=self.out_size,
                                normalize=True)

    def load_dataset(self,
                     data_subset_id,
                     size=160,
                     sample='Normal',
                     res=0.5,
                     rating_scale='none',
                     configuration=None,
                     dataset_type='Clean'):
        # prepare test data
        self.images_test, self.labels_test, self.classes_test, self.masks_test, self.meta_test, _ = \
            prepare_data_direct(
                load_nodule_dataset(size=size, res=res, sample=sample, dataset_type=dataset_type, configuration=configuration)[data_subset_id],
                size=size,
                return_meta=True, objective="rating", rating_scale=rating_scale, verbose=1,
                balanced=False)

        print("Data ready: images({}), labels({})".format(
            self.images_test[0].shape, self.labels_test.shape))
        print("Range = [{:.2f},{:.2f}]".format(np.min(self.images_test[0]),
                                               np.max(self.images_test[0])))

        self.images_test = np.array([
            crop_center(im, msk, size=self.in_size)[0]
            for im, msk in zip(self.images_test, self.masks_test)
        ])

        print("Image size changed to {}".format(self.images_test.shape))
        print('Mask not updated')

    def pred_filename(self, run, epoch, post):
        return self.pred_file_format.format(run, epoch, post)

    def load(self, run, epoch, post):
        filename = self.pred_filename(run=run, epoch=epoch, post=post)
        predict, epochs, images, meta_data, labels, masks = pickle.load(
            open(filename, 'br'))
        return predict, epochs, images, meta_data, labels, masks

    def predict_rating(self, weights_file, out_filename):

        if weights_file is not None:
            self.model.load_weights(weights_file)
            print('Load from: {}'.format(weights_file))
        else:
            print('Model without weights')

        # eval
        print("Begin Predicting...")
        pred = self.model.predict(self.images_test, round=False)
        print("Predication Ready")
        print("\tshape = {}\n\trange [{}, {}]".format(pred.shape, np.min(pred),
                                                      np.max(pred)))

        #pickle.dump((images_test, pred, meta_test, labels_test, masks_test), open(out_filename, 'bw'))
        #print("Saved to: {}".format(out_filename))

        return (self.images_test, pred, self.meta_test, self.classes_test,
                self.labels_test, self.masks_test), out_filename
# =====================

H_lim, S_lim, Tau_lim, Conc_lim, Crst_lim = (1e6, 0), (1e6, 0), (1e6, 0), (1e6, 0), (1e6, 0)

for p, pooling in enumerate(pooling_options):
    print('Evaluating {} pooling'.format(pooling))
    h, s, tau, conc, crst = [], [], [], [], []
    plot_data_filename = './Plots//Data/init_{}.p'.format(pooling)
    try:
        h, s, tau, conc, crst = pickle.load(open(plot_data_filename, 'br'))
        print('loaded cached data for ' + pooling)
    except:
        start = timer()
        for i in range(repeatitions):
            print('\tRep # {}'.format(i))
            model = DirectArch(miniXception_loader, input_shape, objective="malignancy", pooling=pooling,
                               output_size=out_size, normalize=True)
            core = model.extract_core()
            embed = core.predict(np.expand_dims(images, axis=-1), batch_size=32)

            nbrs = NearestNeighbors(n_neighbors=N, algorithm='auto', metric=metric).fit(embed)
            distances, indices = nbrs.kneighbors(embed)

            distances, indices = distances[:, 1:], indices[:, 1:]

            h += [index.calc_hubness(indices)[0]]
            s += [index.calc_symmetry(indices)[0]]
            tau += [index.kumar(distances, res=0.01)[0]]
            conc += [index.concentration(distances)]
            crst += [index.relative_contrast_imp(distances)]

        pickle.dump((h, s, tau, conc, crst), open(plot_data_filename, 'bw'))