Пример #1
0
    def __init__(self, pathModel, nnArchitecture, nnClassCount, transCrop):

        #---- Initialize the network
        if nnArchitecture == 'DENSE-NET-121': model = densenet121(False).cuda()
        elif nnArchitecture == 'DENSE-NET-169':
            model = densenet169(False).cuda()
        elif nnArchitecture == 'DENSE-NET-201':
            model = densenet201(False).cuda()

        model = torch.nn.DataParallel(model).cuda()

        modelCheckpoint = torch.load(pathModel)
        model.load_state_dict(modelCheckpoint['best_model_wts'], strict=False)

        self.model = model.module.features
        self.model.eval()

        #---- Initialize the weights
        self.weights = list(self.model.parameters())[-2]

        #---- Initialize the image transform - resize + normalize
        normalize = transforms.Normalize([0.485, 0.456, 0.406],
                                         [0.229, 0.224, 0.225])
        transformList = []
        transformList.append(transforms.Resize(transCrop))
        transformList.append(transforms.ToTensor())
        transformList.append(normalize)

        self.transformSequence = transforms.Compose(transformList)
Пример #2
0
def go_test():
    print("=" * 30)
    model = densenet.densenet201(pretrained=True)
    # Replace classification layer
    model.classifier = torch.nn.Linear(model.classifier.in_features,
                                       num_classes)
    model.to(device)
    # Load best performing model based on validation score
    model.load_state_dict(
        torch.load(f"snapshots/densenet201_best_{MODEL_NAME}.pth"))

    print("[-] Performing validation...")
    train_loader, val_loader, val_loader2 = get_train_val_split(batch_size)

    with torch.no_grad():
        val_accuracy = validate(model, val_loader, -1)
        print("[*] Validation accuracy: {}".format(val_accuracy))
        val_accuracy2 = validate(model, val_loader2, -1)
        print("[*] Validation2 accuracy: {}\n".format(val_accuracy2))

    print("[-] Performing testing...")

    test_loader = get_test(batch_size)
    with torch.no_grad():
        test(model, test_loader)
def main():
    ##################
    # Initialization #
    ##################

    # Load a model pretrained on ImageNet
    ensemble_model = ensemble.ensemble_ver3()
    ensemble_model.to(device)

    trained_models = [densenet.densenet201(pretrained=True) for i in range(5)]
    # Replace classification layer
    for i, model in enumerate(trained_models):
        model.classifier = torch.nn.Linear(model.classifier.in_features, num_classes)
        model.to(device)
        # Load best performing model based on validation score
        model.load_state_dict(torch.load(f"snapshots/densenet201_best_{MODEL_NAMES[i]}.pth"))

    criterion = torch.nn.CrossEntropyLoss()
    optimizer = torch.optim.Adam(model.parameters(), lr=base_lr)

    ############
    # Training #
    ############
    train_loader, val_loader, val_loader2 = get_train_val_split(batch_size)

    # Use model that performs best on validation for testing
    best_val_accuracy = 0

    for epoch in range(num_epochs):
        # Train
        print("="*30)
        train(ensemble_model, trained_models, train_loader, optimizer, criterion, epoch)

        # Validate
        val_accuracy = validate(ensemble_model, trained_models, val_loader, epoch)
        print("[*] Validation accuracy: {}".format(val_accuracy))
        val_accuracy2 = validate(ensemble_model, trained_models, val_loader2, epoch)
        print("[*] Validation2 accuracy: {}\n".format(val_accuracy2))

        # New best performing model
        if val_accuracy2 > best_val_accuracy:
            best_val_accuracy = val_accuracy2
            print("[*] New best accuracy!\n")
            torch.save(ensemble_model.state_dict(), f"snapshots/densenet201_experiment_usual.pth")

    ###########
    # Testing #
    ###########
    print("="*30)
    print("[-] Performing testing...")

    # Load best performing model based on validation score
    ensemble_model.load_state_dict(torch.load(f"snapshots/densenet201_experiment_usual.pth"))

    test_loader = get_test(batch_size)
    test(ensemble_model, trained_models, test_loader)
def go_test():
    print("="*30)
    ensemble_model = ensemble.ensemble_ver3()
    ensemble_model.to(device)
    ensemble_model.load_state_dict(torch.load(f"snapshots/densenet201_experiment_usual.pth"))

    trained_models = [densenet.densenet201(pretrained=True) for i in range(5)]
    for i, model in enumerate(trained_models):
        model.classifier = torch.nn.Linear(model.classifier.in_features, num_classes)
        model.to(device)
        # Load best performing model based on validation score
        model.load_state_dict(torch.load(f"snapshots/densenet201_best_{MODEL_NAMES[i]}.pth"))


    print("[-] Performing testing...")


    test_loader = get_test(batch_size)
    test(ensemble_model, trained_models, test_loader)
Пример #5
0
def CreatNet(name):
    if name == 'LSTM':
        return LSTM(100, 27 * 5, 5)
    elif name == 'CNN':
        return CNN()
    elif name == 'resnet18_1d':
        return resnet18_1d()
    elif name == 'dfcnn':
        return dfcnn()
    elif name in ['resnet101', 'resnet50', 'resnet18']:
        if name == 'resnet101':
            net = torchvision.models.resnet101(pretrained=False)
            net.fc = nn.Linear(2048, 5)
        elif name == 'resnet50':
            net = torchvision.models.resnet50(pretrained=False)
            net.fc = nn.Linear(2048, 5)
        elif name == 'resnet18':
            net = torchvision.models.resnet18(pretrained=False)
            net.fc = nn.Linear(512, 5)
        net.conv1 = nn.Conv2d(1, 64, 7, 2, 3, bias=False)

        return net

    elif 'densenet' in name:
        if name == 'densenet121':
            net = densenet.densenet121(pretrained=False, num_classes=5)
        elif name == 'densenet201':
            net = densenet.densenet201(pretrained=False, num_classes=5)
        # net.features = nn.Sequential(OrderedDict([
        #     ('conv0', nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3, bias=False)),
        #     ('norm0', nn.BatchNorm2d(64)),
        #     ('relu0', nn.ReLU(inplace=True)),
        #     ('pool0', nn.MaxPool2d(kernel_size=3, stride=2, padding=1)),
        # ]))
        # net.classifier = nn.Linear(64, 5)
        return net
def te():
    retrain_log = "-" * 20 + "retrain" + "-" * 20 + '\n'
    batch_size = 64
    epoch = 200

    with tf.Session() as sess:
        data_x = tf.placeholder(tf.float32, [64, 32, 32, 3], name='input')
        labels = tf.placeholder(tf.int32, [64, 100], name="label")
        train_flag = tf.placeholder(tf.bool, name='train_flag')

        # for block in pre_block:
        #     graph = block.graph + [[]]
        #     cell_list = []
        #     for cell in block.cell_list:
        #         if cell.type == 'conv':
        #             cell_list.append(
        #                 Cell(cell.type, cell.filter_size * 2, cell.kernel_size, cell.activation))
        #         else:
        #             cell_list.append(cell)
        #     cell_list.append(Cell('pooling', 'max', 1))
        #     # repeat search
        #     for _ in range(NAS_CONFIG['nas_main']['repeat_search'] - 1):
        #         retrain_log = retrain_log + str(graph) + str(cell_list) + '\n'
        #         logits = self._inference(logits, graph, cell_list, train_flag)
        #         self.block_num += 1
        #     # add pooling layer only in last repeat block
        #     cell_list[-1] = Cell('pooling', 'max', 2)
        #     retrain_log = retrain_log + str(graph) + str(cell_list) + '\n'
        logits = densenet201(data_x,
                             reuse=False,
                             is_training=True,
                             kernel_initializer=tf.orthogonal_initializer())

        # logits = tf.nn.dropout(logits, keep_prob=1.0)
        # softmax
        # logits = self._makedense(logits, ('', [256, self.NUM_CLASSES], 'relu'))
        retrain = True

        global_step = tf.Variable(0, trainable=False, name='global_step')
        accuracy = cal_accuracy(logits, labels)
        loss = loss_(labels, logits)
        train_op = train_op_(global_step, loss)

        saver = tf.train.Saver(tf.global_variables())
        sess.run(tf.global_variables_initializer())

        train_data, train_label, test_data, test_label = inputs()
        max_steps = (50000) // batch_size
        num_iter = len(test_label) // batch_size

        log = ''
        run_metadata = tf.RunMetadata()
        cost_time = 0
        precision = np.zeros([epoch])
        for ep in range(epoch):
            # print("epoch", ep, ":")
            # train step
            start_time = time.time()
            for step in range(max_steps):
                batch_x = train_data[step * batch_size:(step + 1) * batch_size]
                batch_y = train_label[step * batch_size:(step + 1) *
                                      batch_size]
                batch_x = DataSet().process(batch_x)
                _, loss_value, acc = sess.run(
                    [train_op, loss, accuracy],
                    feed_dict={
                        data_x: batch_x,
                        labels: batch_y,
                        train_flag: True
                    },
                    options=tf.RunOptions(
                        trace_level=tf.RunOptions.FULL_TRACE),
                    run_metadata=run_metadata)
                if np.isnan(loss_value):
                    return -1, saver, log
                sys.stdout.write("\r>> train %d/%d loss %.4f acc %.4f" %
                                 (step, max_steps, loss_value, acc))
            sys.stdout.write("\n")
            trace = timeline.Timeline(step_stats=run_metadata.step_stats)
            trace_file = open('timeline.ctf.json', 'w')
            trace_file.write(trace.generate_chrome_trace_format())

            # evaluation step
            for step in range(num_iter):
                batch_x = test_data[step * batch_size:(step + 1) * batch_size]
                batch_y = test_label[step * batch_size:(step + 1) * batch_size]
                l, acc_ = sess.run([loss, accuracy],
                                   feed_dict={
                                       data_x: batch_x,
                                       labels: batch_y,
                                       train_flag: False
                                   })
                precision[ep] += acc_ / num_iter
                sys.stdout.write("\r>> valid %d/%d loss %.4f acc %.4f" %
                                 (step, num_iter, l, acc_))
            sys.stdout.write("\n")

            cost_time += (float(time.time() - start_time)) / 200
            log += 'epoch %d: precision = %.3f, cost time %.3f\n' % (
                ep, precision[ep], float(time.time() - start_time))
        retrain_log += log

    # NAS_LOG << ('eva', retrain_log)
    return float(precision)
    def retrain(self, pre_block):
        tf.reset_default_graph()
        assert self.train_num >= self.batch_size
        self.block_num = len(
            pre_block) * NAS_CONFIG['nas_main']['repeat_search'] + 1

        retrain_log = "-" * 20 + "retrain" + "-" * 20 + '\n'

        with tf.Session() as sess:
            data_x, labels, logits, train_flag = self._get_input(sess, [])

            # for block in pre_block:
            #     graph = block.graph + [[]]
            #     cell_list = []
            #     for cell in block.cell_list:
            #         if cell.type == 'conv':
            #             cell_list.append(
            #                 Cell(cell.type, cell.filter_size * 2, cell.kernel_size, cell.activation))
            #         else:
            #             cell_list.append(cell)
            #     cell_list.append(Cell('pooling', 'max', 1))
            #     # repeat search
            #     for _ in range(NAS_CONFIG['nas_main']['repeat_search'] - 1):
            #         retrain_log = retrain_log + str(graph) + str(cell_list) + '\n'
            #         logits = self._inference(logits, graph, cell_list, train_flag)
            #         self.block_num += 1
            #     # add pooling layer only in last repeat block
            #     cell_list[-1] = Cell('pooling', 'max', 2)
            #     retrain_log = retrain_log + str(graph) + str(cell_list) + '\n'
            logits = densenet201(
                data_x,
                reuse=False,
                is_training=True,
                kernel_initializer=tf.orthogonal_initializer())

            # logits = tf.nn.dropout(logits, keep_prob=1.0)
            # softmax
            # logits = self._makedense(logits, ('', [256, self.NUM_CLASSES], 'relu'))
            retrain = True

            global_step = tf.Variable(0,
                                      trainable=False,
                                      name='global_step' + str(self.block_num))
            accuracy = self._cal_accuracy(logits, labels)
            loss = self._loss(labels, logits)
            train_op = self._train_op(global_step, loss)

            saver = tf.train.Saver(tf.global_variables())
            sess.run(tf.global_variables_initializer())

            if retrain:
                self.train_data = np.concatenate(
                    (np.array(self.train_data), np.array(self.valid_data)),
                    axis=0).tolist()
                self.train_label = np.concatenate(
                    (np.array(self.train_label), np.array(self.valid_label)),
                    axis=0).tolist()
                max_steps = (self.NUM_EXAMPLES_FOR_TRAIN +
                             self.NUM_EXAMPLES_FOR_EVAL) // self.batch_size
                test_data = copy.deepcopy(self.test_data)
                test_label = copy.deepcopy(self.test_label)
                num_iter = len(test_label) // self.batch_size
            else:
                max_steps = self.train_num // self.batch_size
                test_data = copy.deepcopy(self.valid_data)
                test_label = copy.deepcopy(self.valid_label)
                num_iter = self.NUM_EXAMPLES_FOR_EVAL // self.batch_size

            log = ''
            run_metadata = tf.RunMetadata()
            cost_time = 0
            precision = np.zeros([self.epoch])
            for ep in range(self.epoch):
                # print("epoch", ep, ":")
                # train step
                start_time = time.time()
                for step in range(max_steps):
                    batch_x = self.train_data[step *
                                              self.batch_size:(step + 1) *
                                              self.batch_size]
                    batch_y = self.train_label[step *
                                               self.batch_size:(step + 1) *
                                               self.batch_size]
                    batch_x = DataSet().process(batch_x)
                    _, loss_value, acc = sess.run(
                        [train_op, loss, accuracy],
                        feed_dict={
                            data_x: batch_x,
                            labels: batch_y,
                            train_flag: True
                        },
                        options=tf.RunOptions(
                            trace_level=tf.RunOptions.FULL_TRACE),
                        run_metadata=run_metadata)
                    if np.isnan(loss_value):
                        return -1, saver, log
                    sys.stdout.write("\r>> train %d/%d loss %.4f acc %.4f" %
                                     (step, max_steps, loss_value, acc))
                sys.stdout.write("\n")
                trace = timeline.Timeline(step_stats=run_metadata.step_stats)
                trace_file = open('timeline.ctf.json', 'w')
                trace_file.write(trace.generate_chrome_trace_format())

                # evaluation step
                for step in range(num_iter):
                    batch_x = test_data[step * self.batch_size:(step + 1) *
                                        self.batch_size]
                    batch_y = test_label[step * self.batch_size:(step + 1) *
                                         self.batch_size]
                    l, acc_ = sess.run([loss, accuracy],
                                       feed_dict={
                                           data_x: batch_x,
                                           labels: batch_y,
                                           train_flag: False
                                       })
                    precision[ep] += acc_ / num_iter
                    sys.stdout.write("\r>> valid %d/%d loss %.4f acc %.4f" %
                                     (step, num_iter, l, acc_))
                sys.stdout.write("\n")

                # early stop
                if ep > 5 and not retrain:
                    if precision[ep] < 1.2 / self.NUM_CLASSES:
                        precision = [-1]
                        break
                    if 2 * precision[ep] - precision[ep - 5] - precision[
                            ep - 1] < 0.001 / self.NUM_CLASSES:
                        precision = precision[:ep]
                        log += 'early stop at %d epoch\n' % ep
                        break

                cost_time += (float(time.time() - start_time)) / self.epoch
                log += 'epoch %d: precision = %.3f, cost time %.3f\n' % (
                    ep, precision[ep], float(time.time() - start_time))
            retrain_log += log

        # NAS_LOG << ('eva', retrain_log)
        return float(precision)
def test():
    train = unpickle('/data/data/cifar-100-python/train')
    test = unpickle('/data/data/cifar-100-python/test')
    train_data = train[b'data']
    test_data = test[b'data']

    x_train = train_data.reshape(train_data.shape[0], 3, 32, 32)
    x_train = x_train.transpose(0, 2, 3, 1)
    y_train = train[b'fine_labels']

    x_test = test_data.reshape(test_data.shape[0], 3, 32, 32)
    x_test = x_test.transpose(0, 2, 3, 1)
    y_test = test[b'fine_labels']

    x_train = norm_images(x_train)
    x_test = norm_images(x_test)

    if not os.path.exists('./trans/tran.tfrecords'):
        generate_tfrecord(x_train, y_train, './trans/', 'tran.tfrecords')
        generate_tfrecord(x_test, y_test, './trans/', 'test.tfrecords')

    dataset = tf.data.TFRecordDataset('./trans/tran.tfrecords')
    dataset = dataset.map(parse_function)
    dataset = dataset.shuffle(buffer_size=50000)
    dataset = dataset.batch(Evaluator().batch_size)
    iterator = dataset.make_initializable_iterator()
    next_element = iterator.get_next()

    x_input = tf.placeholder(tf.float32, [None, 32, 32, 3])
    y_input = tf.placeholder(tf.int64, [
        None,
    ])
    y_input_one_hot = tf.one_hot(y_input, 100)
    lr = tf.placeholder(tf.float32, [])

    prob = densenet201(x_input,
                       reuse=False,
                       is_training=True,
                       kernel_initializer=tf.orthogonal_initializer())

    loss = tf.reduce_mean(
        tf.nn.softmax_cross_entropy_with_logits(logits=prob,
                                                labels=y_input_one_hot))

    conv_var = [var for var in tf.trainable_variables() if 'conv' in var.name]
    l2_loss = tf.add_n([tf.nn.l2_loss(var) for var in conv_var])
    loss = l2_loss * 5e-4 + loss
    opt = tf.train.MomentumOptimizer(lr, 0.9, use_nesterov=True)

    update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
    with tf.control_dependencies(update_ops):
        train_op = opt.minimize(loss)

    logit_softmax = tf.nn.softmax(prob)
    acc = tf.reduce_mean(
        tf.cast(tf.equal(tf.argmax(logit_softmax, 1), y_input), tf.float32))
    config = tf.ConfigProto()
    config.allow_soft_placement = True
    config.gpu_options.allow_growth = True

    now_lr = 0.001  # Warm Up
    with tf.Session(config=config) as sess:
        sess.run(tf.global_variables_initializer())
        sess.run(tf.local_variables_initializer())

        counter = 0
        max_test_acc = -1
        for i in range(Evaluator().epoch):
            sess.run(iterator.initializer)
            while True:
                try:
                    batch_train, label_train = sess.run(next_element)
                    _, loss_val, acc_val, lr_val = sess.run(
                        [train_op, loss, acc, lr],
                        feed_dict={
                            x_input: batch_train,
                            y_input: label_train,
                            lr: now_lr
                        })

                    counter += 1

                    if counter % 100 == 0:
                        print('counter: ', counter, 'loss_val', loss_val,
                              'acc: ', acc_val)

                except tf.errors.OutOfRangeError:
                    print('end epoch %d/%d , lr: %f' %
                          (i, Evaluator().epoch, lr_val))
                    now_lr = lr_schedule(i)
                    break
Пример #9
0
def generate_model(opt):
    assert opt.model in [
        'resnet', 'preresnet', 'wideresnet', 'resnext', 'densenet'
    ]

    if opt.model == 'resnet':
        assert opt.model_depth in [10, 18, 34, 50, 101, 152, 200]

        from resnet import get_fine_tuning_parameters

        if opt.model_depth == 10:
            model = resnet.resnet10(num_classes=opt.n_classes,
                                    shortcut_type=opt.resnet_shortcut,
                                    sample_size=opt.sample_size,
                                    sample_duration=opt.sample_duration)
        elif opt.model_depth == 18:
            model = resnet.resnet18(num_classes=opt.n_classes,
                                    shortcut_type=opt.resnet_shortcut,
                                    sample_size=opt.sample_size,
                                    sample_duration=opt.sample_duration)
        elif opt.model_depth == 34:
            model = resnet.resnet34(num_classes=opt.n_classes,
                                    shortcut_type=opt.resnet_shortcut,
                                    sample_size=opt.sample_size,
                                    sample_duration=opt.sample_duration)
        elif opt.model_depth == 50:
            model = resnet.resnet50(num_classes=opt.n_classes,
                                    shortcut_type=opt.resnet_shortcut,
                                    sample_size=opt.sample_size,
                                    sample_duration=opt.sample_duration)
        elif opt.model_depth == 101:
            model = resnet.resnet101(num_classes=opt.n_classes,
                                     shortcut_type=opt.resnet_shortcut,
                                     sample_size=opt.sample_size,
                                     sample_duration=opt.sample_duration)
        elif opt.model_depth == 152:
            model = resnet.resnet152(num_classes=opt.n_classes,
                                     shortcut_type=opt.resnet_shortcut,
                                     sample_size=opt.sample_size,
                                     sample_duration=opt.sample_duration)
        elif opt.model_depth == 200:
            model = resnet.resnet200(num_classes=opt.n_classes,
                                     shortcut_type=opt.resnet_shortcut,
                                     sample_size=opt.sample_size,
                                     sample_duration=opt.sample_duration)
    elif opt.model == 'wideresnet':
        assert opt.model_depth in [50]

        from models.wide_resnet import get_fine_tuning_parameters

        if opt.model_depth == 50:
            model = wide_resnet.resnet50(num_classes=opt.n_classes,
                                         shortcut_type=opt.resnet_shortcut,
                                         k=opt.wide_resnet_k,
                                         sample_size=opt.sample_size,
                                         sample_duration=opt.sample_duration)
    elif opt.model == 'resnext':
        assert opt.model_depth in [50, 101, 152]

        from models.resnext import get_fine_tuning_parameters

        if opt.model_depth == 50:
            model = resnext.resnet50(num_classes=opt.n_classes,
                                     shortcut_type=opt.resnet_shortcut,
                                     cardinality=opt.resnext_cardinality,
                                     sample_size=opt.sample_size,
                                     sample_duration=opt.sample_duration)
        elif opt.model_depth == 101:
            model = resnext.resnet101(num_classes=opt.n_classes,
                                      shortcut_type=opt.resnet_shortcut,
                                      cardinality=opt.resnext_cardinality,
                                      sample_size=opt.sample_size,
                                      sample_duration=opt.sample_duration)
        elif opt.model_depth == 152:
            model = resnext.resnet152(num_classes=opt.n_classes,
                                      shortcut_type=opt.resnet_shortcut,
                                      cardinality=opt.resnext_cardinality,
                                      sample_size=opt.sample_size,
                                      sample_duration=opt.sample_duration)
    elif opt.model == 'preresnet':
        assert opt.model_depth in [18, 34, 50, 101, 152, 200]

        from models.pre_act_resnet import get_fine_tuning_parameters

        if opt.model_depth == 18:
            model = pre_act_resnet.resnet18(
                num_classes=opt.n_classes,
                shortcut_type=opt.resnet_shortcut,
                sample_size=opt.sample_size,
                sample_duration=opt.sample_duration)
        elif opt.model_depth == 34:
            model = pre_act_resnet.resnet34(
                num_classes=opt.n_classes,
                shortcut_type=opt.resnet_shortcut,
                sample_size=opt.sample_size,
                sample_duration=opt.sample_duration)
        elif opt.model_depth == 50:
            model = pre_act_resnet.resnet50(
                num_classes=opt.n_classes,
                shortcut_type=opt.resnet_shortcut,
                sample_size=opt.sample_size,
                sample_duration=opt.sample_duration)
        elif opt.model_depth == 101:
            model = pre_act_resnet.resnet101(
                num_classes=opt.n_classes,
                shortcut_type=opt.resnet_shortcut,
                sample_size=opt.sample_size,
                sample_duration=opt.sample_duration)
        elif opt.model_depth == 152:
            model = pre_act_resnet.resnet152(
                num_classes=opt.n_classes,
                shortcut_type=opt.resnet_shortcut,
                sample_size=opt.sample_size,
                sample_duration=opt.sample_duration)
        elif opt.model_depth == 200:
            model = pre_act_resnet.resnet200(
                num_classes=opt.n_classes,
                shortcut_type=opt.resnet_shortcut,
                sample_size=opt.sample_size,
                sample_duration=opt.sample_duration)
    elif opt.model == 'densenet':
        assert opt.model_depth in [121, 169, 201, 264]

        from models.densenet import get_fine_tuning_parameters

        if opt.model_depth == 121:
            model = densenet.densenet121(num_classes=opt.n_classes,
                                         sample_size=opt.sample_size,
                                         sample_duration=opt.sample_duration)
        elif opt.model_depth == 169:
            model = densenet.densenet169(num_classes=opt.n_classes,
                                         sample_size=opt.sample_size,
                                         sample_duration=opt.sample_duration)
        elif opt.model_depth == 201:
            model = densenet.densenet201(num_classes=opt.n_classes,
                                         sample_size=opt.sample_size,
                                         sample_duration=opt.sample_duration)
        elif opt.model_depth == 264:
            model = densenet.densenet264(num_classes=opt.n_classes,
                                         sample_size=opt.sample_size,
                                         sample_duration=opt.sample_duration)

    if not opt.no_cuda:
        model = model.cuda()
        model = nn.DataParallel(model, device_ids=None)

        if opt.pretrain_path:
            print('loading pretrained model {}'.format(opt.pretrain_path))
            pretrain = torch.load(opt.pretrain_path)
            assert opt.arch == pretrain['arch']

            model.load_state_dict(pretrain['state_dict'])

            if opt.model == 'densenet':
                model.module.classifier = nn.Linear(
                    model.module.classifier.in_features,
                    opt.n_finetune_classes)
                model.module.classifier = model.module.classifier.cuda()
            else:
                model.module.fc = nn.Linear(model.module.fc.in_features,
                                            opt.n_finetune_classes)
                model.module.fc = model.module.fc.cuda()

            parameters = get_fine_tuning_parameters(model, opt.ft_begin_index)
            return model, parameters
    else:
        if opt.pretrain_path:
            print('loading pretrained model {}'.format(opt.pretrain_path))
            pretrain = torch.load(opt.pretrain_path)
            assert opt.arch == pretrain['arch']

            model.load_state_dict(pretrain['state_dict'])

            if opt.model == 'densenet':
                model.classifier = nn.Linear(model.classifier.in_features,
                                             opt.n_finetune_classes)
            else:
                model.fc = nn.Linear(model.fc.in_features,
                                     opt.n_finetune_classes)

            parameters = get_fine_tuning_parameters(model, opt.ft_begin_index)
            return model, parameters

    return model, model.parameters()
Пример #10
0
    def __init__(self,
                 base_model,
                 in_channels=3,
                 out_channels=1,
                 dropout_rate=0.2,
                 pretrained=False):
        super().__init__()

        assert base_model in [
            'resnet50', 'resnet101', 'densenet121', 'densenet201',
            'efficientnetb0', 'efficientnetb4'
        ]

        self._in_channels = in_channels
        self._out_channels = out_channels

        if base_model == 'resnet50':
            if pretrained:
                assert in_channels == 3
                self._base_model = resnet50(pretrained=True,
                                            drop_rate=dropout_rate)
            else:
                self._base_model = resnet50(pretrained=False,
                                            in_channels=in_channels,
                                            drop_rate=dropout_rate)
            fc_in_features = 2048
        if base_model == 'resnet101':
            if pretrained:
                assert in_channels == 3
                self._base_model = resnet101(pretrained=True,
                                             drop_rate=dropout_rate)
            else:
                self._base_model = resnet101(pretrained=False,
                                             in_channels=in_channels,
                                             drop_rate=dropout_rate)
            fc_in_features = 2048
        if base_model == 'densenet121':
            if pretrained:
                assert in_channels == 3
                self._base_model = densenet121(pretrained=True,
                                               drop_rate=dropout_rate)
            else:
                self._base_model = densenet121(pretrained=False,
                                               drop_rate=dropout_rate,
                                               in_channels=in_channels)
            fc_in_features = 1024
        if base_model == 'densenet201':
            if pretrained:
                assert in_channels == 3
                self._base_model = densenet201(pretrained=True,
                                               drop_rate=dropout_rate)
            else:
                self._base_model = densenet201(pretrained=False,
                                               drop_rate=dropout_rate,
                                               in_channels=in_channels)
            fc_in_features = 1920
        if base_model == 'efficientnetb0':
            if pretrained:
                assert in_channels == 3
                self._base_model = EfficientNet.from_pretrained(
                    'efficientnet-b0')
            else:
                self._base_model = EfficientNet.from_name(
                    'efficientnet-b0', {'in_channels': in_channels})
            fc_in_features = 1280
        if base_model == 'efficientnetb4':
            if pretrained:
                assert in_channels == 3
                self._base_model = EfficientNet.from_pretrained(
                    'efficientnet-b4')
            else:
                self._base_model = EfficientNet.from_name(
                    'efficientnet-b4', {'in_channels': in_channels})
            fc_in_features = 1792

        self._fc_mu1 = torch.nn.Linear(fc_in_features, fc_in_features)
        self._fc_mu2 = torch.nn.Linear(fc_in_features, out_channels)
        self._fc_logvar1 = torch.nn.Linear(fc_in_features, fc_in_features)
        # self._fc_logvar2 = torch.nn.Linear(fc_in_features, out_channels)
        self._fc_logvar2 = torch.nn.Linear(fc_in_features, 1)

        if 'resnet' in base_model:
            self._base_model.fc = torch.nn.Identity()
        elif 'densenet' in base_model:  # densenet
            self._base_model.classifier = torch.nn.Identity()
        elif 'efficientnet' in base_model:
            self._base_model._fc = torch.nn.Identity()

        self._dropout_T = 25
        self._dropout_p = 0.5
Пример #11
0
def findBadAppleinDualDenseExtClassifier(extClassiferPath, loader):

    # modelPath = r'C:\Users\wzuo\Developer\ML for APT\models\1534191799.996107.model'
    # patchModelPath=r'C:\Users\wzuo\Developer\ML for APT\models\1534191799.996107.patchModel'
    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    wrongs = []
    #model = MD.densenet201()
    model_global = MD.densenet201(pretrained=True)
    model_local = MD.densenet201(pretrained=True)
    # todo change model init
    #patchModel =MD.SimpleNet()
    # todo change second model init
    #num_ftrs = model.classifier.in_features

    num_ftrs_global = model_global.classifier.in_features

    num_ftrs_local = model_local.classifier.in_features

    externalClassifier = nn.Sequential(
        nn.Linear(num_ftrs_global + num_ftrs_local + 1, 128), nn.ReLU(),
        nn.Linear(128, 2))
    # externalClassifier = nn.Sequential(
    #     nn.Linear(num_ftrs_global + num_ftrs_local + 1, 2)
    # )

    # todo init the external classifier instead of the whole two densenet model

    #the_model = TheModelClass(*args, **kwargs)
    #model.load_state_dict(torch.load(modelPath))
    externalClassifier.load_state_dict(torch.load(extClassiferPath))
    # todo load the params in the external classifier
    #patchModel.load_state_dict(torch.load(patchModelPath))
    #model = model.to(device)
    #patchModel = patchModel.to(device)
    model_global = model_global.to(device)
    model_local = model_local.to(device)
    externalClassifier = externalClassifier.to(device)
    # todo send the external classifer to the device

    #patchModel.eval()
    #model.eval()
    model_local.eval()
    model_global.eval()
    externalClassifier.eval()
    # set all separate model to eval()

    for batch_idx, sample in enumerate(loader):
        images = sample['image'].to(device)
        patchs = sample['patch'].to(device)
        ages = sample['age'].to(device)
        labels = sample['label'].to(device)
        ids = sample['id']
        outputLocal = model_local(patchs)
        outputGlobal = model_global(images)
        interim = torch.cat((outputGlobal, outputLocal), 1)
        interim = torch.cat((ages.unsqueeze(1), interim), 1)
        outputs = externalClassifier(interim)
        _, preds = torch.max(outputs, 1)
        #wrongs.append(ids[preds != labels.data])
        #print(ids)
        #print(preds != labels.data)
        if (preds != labels.data)[0]:
            wrongs.append(ids[0])
            # save the entire sample
    return wrongs
Пример #12
0
def main():

    net = densenet.densenet201(sample_size=64,
                               sample_duration=30,
                               num_classes=num_classes)
    if pretrained:
        pretrained_weights = torch.load(pretrained_path)
        net.load_state_dict(pretrained_weights['state_dict'])

    train_dataset = MatrixDataset(base_dir='../data/', num_classes=num_classes)
    # train_loader = DataLoader(train_dataset, batch_size=batch_size, num_workers=num_workers)

    # test_dataset = MatrixDataset(base_dir='../data/test/', mode='test', sample_size=sample_size, num_classes=num_classes)
    # test_loader = DataLoader(test_dataset, batch_size=batch_size, num_workers=num_workers)

    print len(train_dataset), "Train + Val size"
    # print len(test_dataset)

    train_loader, test_loader, class_weights = get_train_valid_loader(
        train_dataset, train_size=0.7,
        shuffle=False)  #shuffle=False since sampler takes continous inputs

    if sample_size:
        class_weights = np.ones((num_classes), dtype=np.float32)
        criterion = nn.CrossEntropyLoss()
    else:
        # class_weights = get_class_weights(train_dataset, train_loader)
        print class_weights
        criterion = nn.CrossEntropyLoss(class_weights)

    optimizer = optim.SGD(filter(lambda p: p.requires_grad, net.parameters()),
                          lr=lr,
                          momentum=momentum,
                          weight_decay=weight_decay)

    make_dir(weights_folder)
    make_dir(plot_folder)

    if use_cuda:
        net.cuda()

    ### Plot Lists
    if resume == False:
        # for replacing whole plots
        train_loss = []
        train_loss_epoch = []
        precision_train = []
        recall_train = []
        avg_precision_train = []
        avg_recall_train = []
        f1_scores_train = []

        precision_test = []
        recall_test = []
        avg_precision_test = []
        avg_recall_test = []
        f1_scores_test = []
        test_loss = []
        test_loss_mean = []

    start_epoch = 0
    best_prec1 = 0
    early_stop_counter = 0

    ### Resuming checkpoints
    if resume:
        checkpoint = torch.load(checkpoint_path)
        net.load_state_dict(checkpoint['state_dict'])
        optimizer.load_state_dict(checkpoint['optimizer'])
        start_epoch = checkpoint['epoch']  # gives next epoch number
        best_prec1 = checkpoint['best_prec1']

    for epoch in xrange(start_epoch, epochs):

        ### As I need shuffled dataset in every epoch!
        # train_dataset = AnatomyDataset(base_dir='../data/train/', mode='train', sample_size=sample_size, num_classes=num_classes)
        # train_loader = DataLoader(train_dataset, batch_size=batch_size, num_workers=num_workers)

        ### Plot lists
        if resume:
            # for appending to the plots
            train_loss = []
            train_loss_epoch = []
            precision_train = []
            recall_train = []
            avg_precision_train = []
            avg_recall_train = []
            f1_scores_train = []

            precision_test = []
            recall_test = []
            avg_precision_test = []
            avg_recall_test = []
            f1_scores_test = []
            test_loss = []
            test_loss_mean = []

        print "------------------------TRAINING {} - EPOCH: {}---------------------------".format(
            modelname, epoch)
        net.train()
        output_labels = []
        target_labels = []
        temp_loss_epoch = []

        train_loss, temp_loss_epoch, output_labels, target_labels = train(
            net, criterion, optimizer, epoch, train_loader, temp_loss_epoch,
            train_loss, output_labels, target_labels)

        ### Accuracies
        train_loss_epoch.append(sum(temp_loss_epoch) / len(temp_loss_epoch))
        precision_train.append(
            np.asarray(
                precision_score(target_labels,
                                output_labels,
                                labels,
                                average=None)))
        recall_train.append(
            np.asarray(
                recall_score(target_labels,
                             output_labels,
                             labels,
                             average=None)))
        avg_precision_train.append(
            precision_score(target_labels,
                            output_labels,
                            labels,
                            average='weighted'))
        avg_recall_train.append(
            recall_score(target_labels,
                         output_labels,
                         labels,
                         average='weighted'))
        f1_scores_train.append(
            f1_score(target_labels, output_labels, labels, average='weighted'))

        ### Printing
        print "precision_train ", precision_train[-1]
        print "recall_train ", recall_train[-1]
        print "train_loss_epoch", train_loss_epoch[-1]
        print "avg_precision_train ", avg_precision_train[-1]
        print "avg_recall_train ", avg_precision_train[-1]
        print "f1_scores_train ", f1_scores_train[-1]

        ### Plotting
        plot_visdom(epoch, train_loss, win='train_loss')
        plot_visdom(epoch, train_loss_epoch, win='train_loss_epoch')
        plot_visdom(epoch, precision_train, win='precision_train')
        plot_visdom(epoch, recall_train, win='recall_train')
        plot_visdom(epoch, avg_precision_train, win='avg_precision_train')
        plot_visdom(epoch, avg_recall_train, win='avg_recall_train')
        plot_visdom(epoch, f1_scores_train, win='f1_scores_train')

        ##### Testing ######

        print "------------------------TESTING EPOCH: {}---------------------------".format(
            epoch)
        net.eval()
        output_labels = []
        target_labels = []
        temp_loss_epoch = []

        test_loss, temp_loss_epoch, output_labels, target_labels = test(
            net, criterion, optimizer, epoch, test_loader, temp_loss_epoch,
            test_loss, output_labels, target_labels)

        ### Accuracies
        test_loss_mean.append(sum(temp_loss_epoch) / len(temp_loss_epoch))
        precision_test.append(
            np.asarray(
                precision_score(target_labels,
                                output_labels,
                                labels,
                                average=None)))
        recall_test.append(
            np.asarray(
                recall_score(target_labels,
                             output_labels,
                             labels,
                             average=None)))
        avg_precision_test.append(
            precision_score(target_labels,
                            output_labels,
                            labels,
                            average='weighted'))
        avg_recall_test.append(
            recall_score(target_labels,
                         output_labels,
                         labels,
                         average='weighted'))
        f1_scores_test.append(
            f1_score(target_labels, output_labels, labels, average='weighted'))

        ### Printing logs
        print "test loss mean ", test_loss_mean[-1]
        print "precision_test ", precision_test[-1]
        print "recall_test ", recall_test[-1]
        print "avg_precision_test ", avg_precision_test[-1]
        print "avg_recall_test ", avg_precision_test[-1]
        print "f1_scores_test ", f1_scores_test[-1]

        ### Plotting
        epochm = epoch
        plot_visdom(epochm, test_loss, win='test_loss')
        plot_visdom(epochm, test_loss_mean, win='test_loss_mean')
        plot_visdom(epochm, precision_test, win='precision_test')
        plot_visdom(epochm, recall_test, win='recall_test')
        plot_visdom(epochm, avg_precision_test, win='avg_precision_test')
        plot_visdom(epochm, avg_recall_test, win='avg_recall_test')
        plot_visdom(epochm, f1_scores_test, win='f1_scores_test')

        ### Save the environment
        vis.save(envs=[basename + modelname])

        ### Checking if best
        # prec1 = test_loss_mean[-1]
        prec1 = f1_scores_test[-1]
        is_best = prec1 > best_prec1
        best_prec1 = max(prec1, best_prec1)
        ### Saving weights
        if is_best or epoch % 10 == 0 or epoch == epochs - 1:
            save_checkpoint(
                {
                    'epoch': epoch + 1,
                    'arch': modelname,
                    'state_dict': net.state_dict(),
                    'best_prec1': best_prec1,
                    'optimizer': optimizer.state_dict(),
                }, is_best)
Пример #13
0
def get_model(args):
    network = args.network

    if network == 'vgg11':
        model = vgg.vgg11(num_classes=args.class_num)
    elif network == 'vgg13':
        model = vgg.vgg13(num_classes=args.class_num)
    elif network == 'vgg16':
        model = vgg.vgg16(num_classes=args.class_num)
    elif network == 'vgg19':
        model = vgg.vgg19(num_classes=args.class_num)
    elif network == 'vgg11_bn':
        model = vgg.vgg11_bn(num_classes=args.class_num)
    elif network == 'vgg13_bn':
        model = vgg.vgg13_bn(num_classes=args.class_num)
    elif network == 'vgg16_bn':
        model = vgg.vgg16_bn(num_classes=args.class_num)
    elif network == 'vgg19_bn':
        model = vgg.vgg19_bn(num_classes=args.class_num)
    elif network == 'resnet18':
        model = models.resnet18(num_classes=args.class_num)
        model.conv1 = torch.nn.Conv2d(in_channels=1,
                                      out_channels=model.conv1.out_channels,
                                      kernel_size=model.conv1.kernel_size,
                                      stride=model.conv1.stride,
                                      padding=model.conv1.padding,
                                      bias=model.conv1.bias)
    elif network == 'resnet34':
        model = models.resnet34(num_classes=args.class_num)
        model.conv1 = torch.nn.Conv2d(in_channels=1,
                                      out_channels=model.conv1.out_channels,
                                      kernel_size=model.conv1.kernel_size,
                                      stride=model.conv1.stride,
                                      padding=model.conv1.padding,
                                      bias=model.conv1.bias)
    elif network == 'resnet50':
        model = models.resnet50(num_classes=args.class_num)
        model.conv1 = torch.nn.Conv2d(in_channels=1,
                                      out_channels=model.conv1.out_channels,
                                      kernel_size=model.conv1.kernel_size,
                                      stride=model.conv1.stride,
                                      padding=model.conv1.padding,
                                      bias=model.conv1.bias)
    elif network == 'resnet101':
        model = models.resnet101(num_classes=args.class_num)
        model.conv1 = torch.nn.Conv2d(in_channels=1,
                                      out_channels=model.conv1.out_channels,
                                      kernel_size=model.conv1.kernel_size,
                                      stride=model.conv1.stride,
                                      padding=model.conv1.padding,
                                      bias=model.conv1.bias)
    elif network == 'resnet152':
        model = models.resnet152(num_classes=args.class_num)
        model.conv1 = torch.nn.Conv2d(in_channels=1,
                                      out_channels=model.conv1.out_channels,
                                      kernel_size=model.conv1.kernel_size,
                                      stride=model.conv1.stride,
                                      padding=model.conv1.padding,
                                      bias=model.conv1.bias)
    elif network == 'densenet121':
        model = densenet.densenet121(num_classes=args.class_num)
    elif network == 'densenet169':
        model = densenet.densenet169(num_classes=args.class_num)
    elif network == 'densenet161':
        model = densenet.densenet161(num_classes=args.class_num)
    elif network == 'densenet201':
        model = densenet.densenet201(num_classes=args.class_num)

    return model
Пример #14
0
import densenet

MatrixNet = densenet.densenet201()
		
Пример #15
0
def generate_model(opt):
    assert opt.mode in ['score', 'feature']
    if opt.mode == 'score':
        last_fc = True
    elif opt.mode == 'feature':
        last_fc = False

    assert opt.model_name in [
        'resnet', 'preresnet', 'wideresnet', 'resnext', 'densenet'
    ]

    if opt.model_name == 'resnet':
        assert opt.model_depth in [10, 18, 34, 50, 101, 152, 200]

        if opt.model_depth == 10:
            model = resnet.resnet10(num_classes=opt.n_classes,
                                    shortcut_type=opt.resnet_shortcut,
                                    sample_size=opt.sample_size,
                                    sample_duration=opt.sample_duration,
                                    last_fc=last_fc)
        elif opt.model_depth == 18:
            model = resnet.resnet18(num_classes=opt.n_classes,
                                    shortcut_type=opt.resnet_shortcut,
                                    sample_size=opt.sample_size,
                                    sample_duration=opt.sample_duration,
                                    last_fc=last_fc)
        elif opt.model_depth == 34:
            model = resnet.resnet34(num_classes=opt.n_classes,
                                    shortcut_type=opt.resnet_shortcut,
                                    sample_size=opt.sample_size,
                                    sample_duration=opt.sample_duration,
                                    last_fc=last_fc)
        elif opt.model_depth == 50:
            model = resnet.resnet50(num_classes=opt.n_classes,
                                    shortcut_type=opt.resnet_shortcut,
                                    sample_size=opt.sample_size,
                                    sample_duration=opt.sample_duration,
                                    last_fc=last_fc)
        elif opt.model_depth == 101:
            model = resnet.resnet101(num_classes=opt.n_classes,
                                     shortcut_type=opt.resnet_shortcut,
                                     sample_size=opt.sample_size,
                                     sample_duration=opt.sample_duration,
                                     last_fc=last_fc)
        elif opt.model_depth == 152:
            model = resnet.resnet152(num_classes=opt.n_classes,
                                     shortcut_type=opt.resnet_shortcut,
                                     sample_size=opt.sample_size,
                                     sample_duration=opt.sample_duration,
                                     last_fc=last_fc)
        elif opt.model_depth == 200:
            model = resnet.resnet200(num_classes=opt.n_classes,
                                     shortcut_type=opt.resnet_shortcut,
                                     sample_size=opt.sample_size,
                                     sample_duration=opt.sample_duration,
                                     last_fc=last_fc)
    elif opt.model_name == 'wideresnet':
        assert opt.model_depth in [50]

        if opt.model_depth == 50:
            model = wide_resnet.resnet50(num_classes=opt.n_classes,
                                         shortcut_type=opt.resnet_shortcut,
                                         k=opt.wide_resnet_k,
                                         sample_size=opt.sample_size,
                                         sample_duration=opt.sample_duration,
                                         last_fc=last_fc)
    elif opt.model_name == 'resnext':
        assert opt.model_depth in [50, 101, 152]

        if opt.model_depth == 50:
            model = resnext.resnet50(num_classes=opt.n_classes,
                                     shortcut_type=opt.resnet_shortcut,
                                     cardinality=opt.resnext_cardinality,
                                     sample_size=opt.sample_size,
                                     sample_duration=opt.sample_duration,
                                     last_fc=last_fc)
        elif opt.model_depth == 101:
            model = resnext.resnet101(num_classes=opt.n_classes,
                                      shortcut_type=opt.resnet_shortcut,
                                      cardinality=opt.resnext_cardinality,
                                      sample_size=opt.sample_size,
                                      sample_duration=opt.sample_duration,
                                      last_fc=last_fc)
        elif opt.model_depth == 152:
            model = resnext.resnet152(num_classes=opt.n_classes,
                                      shortcut_type=opt.resnet_shortcut,
                                      cardinality=opt.resnext_cardinality,
                                      sample_size=opt.sample_size,
                                      sample_duration=opt.sample_duration,
                                      last_fc=last_fc)
    elif opt.model_name == 'preresnet':
        assert opt.model_depth in [18, 34, 50, 101, 152, 200]

        if opt.model_depth == 18:
            model = pre_act_resnet.resnet18(
                num_classes=opt.n_classes,
                shortcut_type=opt.resnet_shortcut,
                sample_size=opt.sample_size,
                sample_duration=opt.sample_duration,
                last_fc=last_fc)
        elif opt.model_depth == 34:
            model = pre_act_resnet.resnet34(
                num_classes=opt.n_classes,
                shortcut_type=opt.resnet_shortcut,
                sample_size=opt.sample_size,
                sample_duration=opt.sample_duration,
                last_fc=last_fc)
        elif opt.model_depth == 50:
            model = pre_act_resnet.resnet50(
                num_classes=opt.n_classes,
                shortcut_type=opt.resnet_shortcut,
                sample_size=opt.sample_size,
                sample_duration=opt.sample_duration,
                last_fc=last_fc)
        elif opt.model_depth == 101:
            model = pre_act_resnet.resnet101(
                num_classes=opt.n_classes,
                shortcut_type=opt.resnet_shortcut,
                sample_size=opt.sample_size,
                sample_duration=opt.sample_duration,
                last_fc=last_fc)
        elif opt.model_depth == 152:
            model = pre_act_resnet.resnet152(
                num_classes=opt.n_classes,
                shortcut_type=opt.resnet_shortcut,
                sample_size=opt.sample_size,
                sample_duration=opt.sample_duration,
                last_fc=last_fc)
        elif opt.model_depth == 200:
            model = pre_act_resnet.resnet200(
                num_classes=opt.n_classes,
                shortcut_type=opt.resnet_shortcut,
                sample_size=opt.sample_size,
                sample_duration=opt.sample_duration,
                last_fc=last_fc)
    elif opt.model_name == 'densenet':
        assert opt.model_depth in [121, 169, 201, 264]

        if opt.model_depth == 121:
            model = densenet.densenet121(num_classes=opt.n_classes,
                                         sample_size=opt.sample_size,
                                         sample_duration=opt.sample_duration,
                                         last_fc=last_fc)
        elif opt.model_depth == 169:
            model = densenet.densenet169(num_classes=opt.n_classes,
                                         sample_size=opt.sample_size,
                                         sample_duration=opt.sample_duration,
                                         last_fc=last_fc)
        elif opt.model_depth == 201:
            model = densenet.densenet201(num_classes=opt.n_classes,
                                         sample_size=opt.sample_size,
                                         sample_duration=opt.sample_duration,
                                         last_fc=last_fc)
        elif opt.model_depth == 264:
            model = densenet.densenet264(num_classes=opt.n_classes,
                                         sample_size=opt.sample_size,
                                         sample_duration=opt.sample_duration,
                                         last_fc=last_fc)

    if not opt.no_cuda:
        model = model.cuda()
        model = nn.DataParallel(model, device_ids=None)

    return model
Пример #16
0
from dataset import *

### Dataset configs ###
num_classes = 24

use_cuda = torch.cuda.is_available()

### trained model configs ###
modelname = "3d_model"
trained_path = 'Weights/mc-cls/model_best.pth.tar'
batch_size = 256


if __name__ == '__main__':

	net = densenet.densenet201(sample_size=64, sample_duration=30, num_classes=num_classes)
	trained_weights = torch.load(trained_path)
	net.load_state_dict(trained_weights['state_dict'])

	test_dataset = MatrixDataset(base_dir='../data/', num_classes=num_classes, mode='test')
	test_loader = DataLoader(test_dataset, batch_size=batch_size)

	output_scores = []

	if use_cuda:
		net.cuda()
	net.eval()

	for batch,(vid, vidname) in enumerate(test_loader):

		print "Processing batch {}/{}".format(batch,len(test_loader))
Пример #17
0
    #patchModel.load_state_dict(best_patchModel_wts)
    extClassifier.load_state_dict(best_classifier_wts)
    model_serial = str(datetime.now().timestamp())
    # torch.save(model.state_dict(),
    #            os.path.join(r'C:\Users\wzuo\Developer\ML for APT\models', model_serial + '.model'))
    # torch.save(patchModel.state_dict(),
    #            os.path.join(r'C:\Users\wzuo\Developer\ML for APT\models', model_serial + '.patchModel'))
    torch.save(extClassifier.state_dict(),
               os.path.join(model_path, model_serial + '.clsmodel'))
    with open(os.path.join(model_path, model_serial + '.json'), 'w') as fp:
        json.dump(param_dict, fp)

    return extClassifier


model_global = MD.densenet201(pretrained=True)
model_local = MD.densenet169(pretrained=True)

param_dict['model_global'] = 'densenet201'
param_dict['model_local'] = 'densenet169'

# todo change architecture from here
#patch_model = MD.densenet121(pretrained=True)
#patch_model = MD.SimpleNet()
#param_dict['patch_base'] = 'densenet121'

for param in model_global.parameters():
    param.requires_grad = False

for param in model_local.parameters():
    param.requires_grad = False
def get_model(class_weights=None):

    model = densenet201(pretrained=True, drop_rate=0.25, final_drop_rate=0.25)
    # model_size: penultimate_layer_output_dim,
    # 201: 1920, 169: 1664, 121: 1024

    # make all params untrainable
    for p in model.parameters():
        p.requires_grad = False

    # reset the last fc layer
    model.classifier = nn.Linear(1920, 256)
    normal(model.classifier.weight, 0.0, 0.001)
    constant(model.classifier.bias, 0.0)

    # make some other params trainable
    trainable_params = []
    trainable_params += [
        n for n, p in model.named_parameters() if 'norm5' in n
    ]
    trainable_params += [
        n for n, p in model.named_parameters() if 'denseblock4' in n
    ]
    for n, p in model.named_parameters():
        if n in trainable_params:
            p.requires_grad = True

    for m in model.features.denseblock4.modules():
        if isinstance(m, nn.ReLU):
            m.inplace = False

    # create different parameter groups
    classifier_weights = [model.classifier.weight]
    classifier_biases = [model.classifier.bias]
    features_weights = [
        p for n, p in model.named_parameters()
        if n in trainable_params and 'conv' in n
    ]
    features_bn_weights = [
        p for n, p in model.named_parameters()
        if n in trainable_params and 'norm' in n and 'weight' in n
    ]
    features_bn_biases = [
        p for n, p in model.named_parameters()
        if n in trainable_params and 'bias' in n
    ]

    # you can set different learning rates
    classifier_lr = 1e-2
    features_lr = 1e-2
    # but they are not actually used (because lr_scheduler is used)

    params = [{
        'params': classifier_weights,
        'lr': classifier_lr,
        'weight_decay': 1e-4
    }, {
        'params': classifier_biases,
        'lr': classifier_lr
    }, {
        'params': features_weights,
        'lr': features_lr,
        'weight_decay': 1e-4
    }, {
        'params': features_bn_weights,
        'lr': features_lr
    }, {
        'params': features_bn_biases,
        'lr': features_lr
    }]
    optimizer = optim.SGD(params, momentum=0.9, nesterov=True)

    # loss function
    criterion = nn.CrossEntropyLoss(weight=class_weights).cuda()
    # move the model to gpu
    model = model.cuda()
    return model, criterion, optimizer