Exemplo n.º 1
0
def main():
    args = parser.parse_args()

    if not os.path.isdir('CMDs'):
        os.mkdir('CMDs')
    with open('CMDs/setup_dpn.cmd', 'a') as f:
        f.write(' '.join(sys.argv) + '\n')
        f.write('--------------------------------\n')

    if os.path.isdir(args.destination_path) and not args.override_directory:
        raise EnvironmentError(
            'Destination directory exists. To override the directory run with '
            'the --override_directory flag.')
    else:
        os.makedirs(args.destination_path)

    # Link and and create directories
    os.chdir(args.destination_path)
    os.mkdir('model')

    model = ModelFactory.create_model(args.arch,
                                      num_classes=args.num_classes,
                                      small_inputs=args.small_inputs,
                                      dropout_rate=args.drop_rate,
                                      pretrained=False,
                                      n_channels=args.n_channels)

    ModelFactory.checkpoint_model(path='model/model.tar',
                                  model=model,
                                  arch=args.arch,
                                  n_channels=args.n_channels,
                                  num_classes=args.num_classes,
                                  dropout_rate=args.drop_rate,
                                  small_inputs=args.small_inputs,
                                  n_in=args.n_in)
Exemplo n.º 2
0
def main():
    args = parser.parse_args()

    if not os.path.isdir('CMDs'):
        os.mkdir('CMDs')
    with open('CMDs/setup_dpn.cmd', 'a') as f:
        f.write(' '.join(sys.argv) + '\n')
        f.write('--------------------------------\n')

    ensemble_dir = Path(args.destination_path)

    if os.path.isdir(ensemble_dir):
        if args.override_directory:
            shutil.rmtree(ensemble_dir)
        else:
            raise EnvironmentError(
                'Destination directory exists. To override the directory run with '
                'the --override_directory flag.')

    os.makedirs(ensemble_dir)

    for i in range(args.num_models):
        model_dir = ensemble_dir / f'model{i}'
        os.mkdir(model_dir)

        set_random_seeds(i)
        model = ModelFactory.create_model(args.arch,
                                          num_classes=args.num_classes,
                                          small_inputs=args.small_inputs,
                                          pretrained=False)

        ModelFactory.checkpoint_model(path=model_dir / 'model.tar',
                                      model=model,
                                      arch=args.arch,
                                      n_channels=args.n_channels,
                                      num_classes=args.num_classes,
                                      small_inputs=args.small_inputs,
                                      n_in=args.n_in)
Exemplo n.º 3
0
def main():
    args = parser.parse_args()
    if not os.path.isdir('CMDs'):
        os.mkdir('CMDs')
    with open('CMDs/eval_ID.cmd', 'a') as f:
        f.write(' '.join(sys.argv) + '\n')
        f.write('--------------------------------\n')
    if os.path.isdir(args.output_path) and not args.overwrite:
        print(f'Directory {args.output_path} exists. Exiting...')
        sys.exit()
    elif os.path.isdir(args.output_path) and args.overwrite:
        os.remove(args.output_path + '/*')
    else:
        os.makedirs(args.output_path)

    # Check that we are using a sensible GPU
    device = select_gpu(args.gpu)

    # Load up the model
    model_dir = Path(args.model_dir)
    ckpt = torch.load(model_dir / 'model/model.tar', map_location=device)
    model = ModelFactory.model_from_checkpoint(ckpt)
    model.to(device)
    model.eval()

    # Load the in-domain evaluation data
    if args.train:
        dataset = DATASET_DICT[args.dataset](
            root=args.data_path,
            transform=construct_transforms(
                n_in=ckpt['n_in'],
                mean=DATASET_DICT[args.dataset].mean,
                std=DATASET_DICT[args.dataset].std,
                mode='train'),
            target_transform=None,
            download=True,
            split='train')
    else:
        dataset = DATASET_DICT[args.dataset](
            root=args.data_path,
            transform=construct_transforms(
                n_in=ckpt['n_in'],
                mean=DATASET_DICT[args.dataset].mean,
                std=DATASET_DICT[args.dataset].std,
                mode='eval'),
            target_transform=None,
            download=True,
            split='test')

    # Evaluate the model
    logits, labels = eval_logits_on_dataset(model=model,
                                            dataset=dataset,
                                            batch_size=args.batch_size,
                                            device=device)
    labels, probs, logits = labels.numpy(), F.softmax(
        logits, dim=1).numpy(), logits.numpy()

    # Save model outputs
    np.savetxt(os.path.join(args.output_path, 'labels.txt'), labels)
    np.savetxt(os.path.join(args.output_path, 'probs.txt'), probs)
    np.savetxt(os.path.join(args.output_path, 'logits.txt'), logits)

    # Get dictionary of uncertainties.
    uncertainties = dirichlet_prior_network_uncertainty(logits)
    # Save uncertainties
    for key in uncertainties.keys():
        np.savetxt(os.path.join(args.output_path, key + '.txt'),
                   uncertainties[key])

    if args.ood:
        sys.exit()

    nll = -np.mean(
        np.log(probs[np.arange(probs.shape[0]),
                     np.squeeze(labels)] + 1e-10))

    accuracy = np.mean(
        np.asarray(labels == np.argmax(probs, axis=1), dtype=np.float32))
    with open(os.path.join(args.output_path, 'results.txt'), 'a') as f:
        f.write(
            f'Classification Error: {np.round(100 * (1.0 - accuracy), 1)} \n')
        f.write(f'NLL: {np.round(nll, 3)} \n')

    # TODO: Have different results files? Or maybedifferent folders
    # Assess Misclassification Detection
    eval_misc_detect(labels,
                     probs,
                     uncertainties,
                     save_path=args.output_path,
                     misc_positive=True)

    # Assess Calibration
    classification_calibration(labels=labels,
                               probs=probs,
                               save_path=args.output_path)

    # Assess Rejection Performance
    eval_rejection_ratio_class(labels=labels,
                               probs=probs,
                               uncertainties=uncertainties,
                               save_path=args.output_path)
Exemplo n.º 4
0
def main():
    args = parser.parse_args()
    if not os.path.isdir('CMDs'):
        os.mkdir('CMDs')
    with open('CMDs/step_train_distillation.cmd', 'a') as f:
        f.write(' '.join(sys.argv) + '\n')
        f.write('--------------------------------\n')

    model_dir = Path(args.model_dir)

    # Check that we are training on a sensible GPU
    assert max(args.gpu) <= torch.cuda.device_count() - 1

    device = select_gpu(args.gpu)
    # Load up the model
    ckpt = torch.load(model_dir / 'model/model.tar', map_location=device)
    model = ModelFactory.model_from_checkpoint(ckpt)
    if len(args.gpu) > 1 and torch.cuda.device_count() > 1:
        model = torch.nn.DataParallel(model, device_ids=args.gpu)
        print('Using Multi-GPU training.')
    model.to(device)

    # Load the in-domain training and validation data
    train_dataset_class = DATASET_DICT[args.dataset]
    train_dataset_parameters = {
        'root':
        args.data_path,
        'transform':
        construct_transforms(n_in=ckpt['n_in'],
                             mode='train',
                             mean=DATASET_DICT[args.dataset].mean,
                             std=DATASET_DICT[args.dataset].std,
                             augment=args.augment,
                             rotation=args.rotate,
                             jitter=args.jitter),
        'target_transform':
        None,
        'download':
        True,
        'split':
        'train'
    }
    train_dataset = EnsembleDataset(
        dataset=train_dataset_class,
        dataset_parameters=train_dataset_parameters,
        ensemble_path=args.ensemble_path,
        model_dirs=args.model,
        n_models=args.n_models,
        folder='train')

    val_dataset_class = DATASET_DICT[args.dataset]
    val_dataset_parameters = {
        'root':
        args.data_path,
        'transform':
        construct_transforms(n_in=ckpt['n_in'],
                             mean=DATASET_DICT[args.dataset].mean,
                             std=DATASET_DICT[args.dataset].std,
                             mode='eval'),
        'target_transform':
        None,
        'download':
        True,
        'split':
        'val'
    }
    val_dataset = EnsembleDataset(dataset=val_dataset_class,
                                  dataset_parameters=val_dataset_parameters,
                                  ensemble_path=args.ensemble_path,
                                  model_dirs=args.model,
                                  n_models=args.n_models,
                                  folder='eval')

    if args.ood:
        assert args.ood_folder is not None
        ood_dataset_class = DATASET_DICT[args.ood_dataset]
        ood_dataset_parameters = {
            'root':
            args.data_path,
            'transform':
            construct_transforms(n_in=ckpt['n_in'],
                                 mean=DATASET_DICT[args.dataset].mean,
                                 std=DATASET_DICT[args.dataset].std,
                                 mode='train'),
            'target_transform':
            None,
            'download':
            True,
            'split':
            'train'
        }
        ood_dataset = EnsembleDataset(
            dataset=ood_dataset_class,
            dataset_parameters=ood_dataset_parameters,
            ensemble_path=args.ensemble_path,
            model_dirs=args.model,
            n_models=args.n_models,
            folder=args.ood_folder)

        train_dataset = data.ConcatDataset([train_dataset, ood_dataset])

    # Set up training and test criteria
    test_criterion = torch.nn.CrossEntropyLoss()
    if args.endd:
        train_criterion = DirichletEnDDLoss()
    elif args.endd_entemp:
        train_criterion = DirichletEnDDEnTempLoss()
    elif args.endd_dirtemp:
        train_criterion = DirichletEnDDDirTempLoss()
    elif args.endd_revtemp:
        train_criterion = DirichletEnDDRevLoss()
    else:
        train_criterion = EnDLoss()

    # Select optimizer and optimizer params
    optimizer, optimizer_params = choose_optimizer(args.optimizer, args.lr,
                                                   args.weight_decay)

    # Setup model trainer and train model
    trainer = TrainerDistillation(model=model,
                                  criterion=train_criterion,
                                  test_criterion=test_criterion,
                                  train_dataset=train_dataset,
                                  test_dataset=val_dataset,
                                  optimizer=optimizer,
                                  device=device,
                                  checkpoint_path=model_dir / 'model',
                                  scheduler=optim.lr_scheduler.MultiStepLR,
                                  temp_scheduler=LRTempScheduler,
                                  optimizer_params=optimizer_params,
                                  scheduler_params={
                                      'milestones': args.lrc,
                                      'gamma': args.lr_decay
                                  },
                                  temp_scheduler_params={
                                      'init_temp': args.temperature,
                                      'min_temp': args.min_temperature,
                                      'decay_epoch': args.tdecay_epoch,
                                      'decay_length': args.tdecay_length
                                  },
                                  batch_size=args.batch_size,
                                  clip_norm=args.clip_norm)
    if args.resume:
        trainer.load_checkpoint(model_dir / 'model/checkpoint.tar',
                                True,
                                True,
                                map_location=device)
    trainer.train(args.n_epochs, resume=args.resume)

    # Save final model
    if len(args.gpu) > 1 and torch.cuda.device_count() > 1:
        model = model.module
    ModelFactory.checkpoint_model(path=model_dir / 'model/model.tar',
                                  model=model,
                                  arch=ckpt['arch'],
                                  n_channels=ckpt['n_channels'],
                                  num_classes=ckpt['num_classes'],
                                  small_inputs=ckpt['small_inputs'],
                                  n_in=ckpt['n_in'])
Exemplo n.º 5
0
def main():
    args = parser.parse_args()
    if not os.path.isdir('CMDs'):
        os.mkdir('CMDs')
    with open('CMDs/ood_detect.cmd', 'a') as f:
        f.write(' '.join(sys.argv) + '\n')
        f.write('--------------------------------\n')
    if os.path.isdir(args.output_path) and not args.overwrite:
        print(f'Directory {args.output_path} exists. Exiting...')
        sys.exit()
    elif os.path.isdir(args.output_path) and args.overwrite:
        os.remove(args.output_path + '/*')
    else:
        os.makedirs(args.output_path)

    # Check that we are using a sensible GPU device
    device = select_gpu(args.gpu)

    model_dir = Path(args.model_dir)
    # Load up the model
    ckpt = torch.load(model_dir, map_location=device)
    model = ModelFactory.model_from_checkpoint(ckpt)

    model.to(device)
    model.eval()

    # Load the in-domain evaluation data
    id_dataset = DATASET_DICT[args.id_dataset](
        root=args.data_path,
        transform=construct_transforms(n_in=ckpt['n_in'],
                                       mean=DATASET_DICT[args.id_dataset].mean,
                                       std=DATASET_DICT[args.id_dataset].std,
                                       mode='eval'),
        target_transform=None,
        download=True,
        split='test')

    # Evaluate the model
    id_logits, id_labels = eval_logits_on_dataset(model=model,
                                                  dataset=id_dataset,
                                                  batch_size=args.batch_size,
                                                  device=device)

    id_labels, id_probs, id_logits = id_labels.numpy(), F.softmax(
        id_logits, dim=1).numpy(), id_logits.numpy()

    accuracy = np.mean(np.squeeze(id_labels) == np.argmax(id_probs, axis=-1))
    ece, mce = classification_calibration(id_labels, id_probs)
    brier = brier_score(id_labels, id_probs)
    uncertainty, resolution, reliability = brier_decomposition(
        id_labels, id_probs)
    with open(os.path.join(args.output_path, 'results.txt'), 'a') as f:
        f.write(f"Accuracy: {accuracy * 100:.02f}\n")
        f.write(f"ECE: {ece * 100:.02f}\n")
        f.write(f"MCE: {mce * 100:.02f}\n")
        f.write(f"Brier: {brier * 100:.02f}\n")
        f.write(f"Brier UNC: {uncertainty * 100:.02f}\n")
        f.write(f"Brier RES: {resolution * 100:.02f}\n")
        f.write(f"Brier REL: {reliability * 100:.02f}\n")

    id_uncertainties = dirichlet_prior_network_uncertainty(id_logits)

    for ood_dataset in args.ood_dataset:
        save_dir = os.path.join(args.output_path, ood_dataset)
        os.mkdir(save_dir)

        with open(os.path.join(args.output_path, 'results.txt'), 'a') as f:
            f.write(f"\n\n{ood_dataset}\n")

        split = ood_dataset.split("_", maxsplit=1)
        if len(split) == 2 and split[1] == "unscaled":
            unscaled_ds = True
            ood_dataset_name = split[0]
        else:
            unscaled_ds = False
            ood_dataset_name = ood_dataset

        ood_dataset = DATASET_DICT[ood_dataset_name](
            root=args.data_path,
            transform=construct_transforms(
                n_in=ckpt['n_in'],
                mean=DATASET_DICT[args.id_dataset].mean,
                std=DATASET_DICT[args.id_dataset].std,
                mode='eval',
                unscaled=unscaled_ds),
            target_transform=None,
            download=True,
            split='test')
        print(
            f"ID dataset length: {len(id_dataset)}, OOD dataset length: {len(ood_dataset)}"
        )

        ood_logits, ood_labels = eval_logits_on_dataset(
            model=model,
            dataset=ood_dataset,
            batch_size=args.batch_size,
            device=device)

        ood_labels, ood_probs, ood_logits = ood_labels.numpy(), F.softmax(
            ood_logits, dim=1).numpy(), ood_logits.numpy()

        ood_uncertainties = dirichlet_prior_network_uncertainty(ood_logits)

        # Compute Labels
        in_domain = np.zeros_like(id_labels)
        out_domain = np.ones((ood_labels.shape[0], ))
        domain_labels = np.concatenate((in_domain, out_domain), axis=0)

        eval_ood_detect(domain_labels=domain_labels,
                        in_uncertainties=id_uncertainties,
                        out_uncertainties=ood_uncertainties,
                        save_path=save_dir)
def main():
    args = parser.parse_args()
    if not os.path.isdir('CMDs'):
        os.mkdir('CMDs')
    with open('CMDs/construct_adversarial_dataset.cmd', 'a') as f:
        f.write(' '.join(sys.argv) + '\n')
        f.write('--------------------------------\n')
    if os.path.isdir(args.output_path) and not args.overwrite:
        print(f'Directory {args.output_path} exists. Exiting...')
        sys.exit()
    elif os.path.isdir(args.output_path) and args.overwrite:
        os.remove(args.output_path + '/*')
    else:
        os.makedirs(args.output_path)

    # Check that we are using a sensible GPU
    device = select_gpu(args.gpu)

    # Load up the model
    model_dir = Path(args.model_dir)
    ckpt = torch.load(model_dir / 'model/model.tar', map_location=device)
    model = ModelFactory.model_from_checkpoint(ckpt)
    model.to(device)
    model.eval()

    # Load the in-domain evaluation data
    if args.train:
        dataset = DATASET_DICT[args.dataset](
            root=args.data_path,
            transform=construct_transforms(
                n_in=ckpt['n_in'],
                mean=DATASET_DICT[args.dataset].mean,
                std=DATASET_DICT[args.dataset].std,
                num_channels=args.n_channels,
                mode='train'),
            target_transform=None,
            download=True,
            split='train')
    else:
        dataset = DATASET_DICT[args.dataset](
            root=args.data_path,
            transform=construct_transforms(
                n_in=ckpt['n_in'],
                mean=DATASET_DICT[args.dataset].mean,
                std=DATASET_DICT[args.dataset].std,
                num_channels=args.n_channels,
                mode='eval'),
            target_transform=None,
            download=True,
            split='test')

    # dataset = DataSpliter.reduceSize(dataset, 16)

    mean = np.array(DATASET_DICT[args.dataset].mean).reshape((3, 1, 1))
    std = np.array(DATASET_DICT[args.dataset].std).reshape((3, 1, 1))

    # dataset = torch.utils.data.Subset(dataset, image_indices)
    print("dataset length:", len(dataset))

    org_dataset_folder = os.path.join(args.output_path, "org-images")
    os.makedirs(org_dataset_folder)
    persist_dataset(dataset, mean, std, args.n_channels, org_dataset_folder)

    # perform original evaluation on the model using unperturbed images
    logits, labels = eval_logits_on_dataset(model,
                                            dataset=dataset,
                                            device=device,
                                            batch_size=args.batch_size)
    labels = labels.numpy()
    # determine correct classifications without attack (original non perturbed images)
    org_preds = np.argmax(F.softmax(logits, dim=1).numpy(), axis=1)
    correct_classifications = np.asarray(org_preds == labels, dtype=np.int32)
    correct_classified_indices = np.argwhere(correct_classifications == 1)

    # perform attacks on the same dataset, using different epsilon values.
    adv_success_rates = []
    for epsilon in args.epsilon:
        attack_folder = os.path.join(args.output_path, f"e{epsilon}-attack")
        out_path = os.path.join(attack_folder, "adv-images")
        os.makedirs(out_path)
        adv_success = perform_epsilon_attack(model,
                                             epsilon,
                                             dataset,
                                             correct_classified_indices,
                                             args.batch_size,
                                             device,
                                             args.n_channels,
                                             attack_folder,
                                             mean,
                                             std,
                                             args.attack_type,
                                             norm=args.norm,
                                             step_size=args.step_size,
                                             max_steps=args.max_steps)
        adv_success_rates.append(adv_success / len(correct_classified_indices))

    # plot the epsilon, adversarial success rate graph (line plot)
    plt.figure(figsize=(5, 5))
    plt.plot(args.epsilon, adv_success_rates, "*-")
    plt.yticks(np.arange(0, 1.1, step=0.1))
    plt.xticks(np.arange(np.min(args.epsilon), np.max(args.epsilon), step=0.1))
    plt.title("Adversarial Success Rate vs Epsilon")
    plt.xlabel("Epsilon")
    plt.ylabel("Adversarial Success Rate")
    plt.savefig(os.path.join(args.output_path, "epsilon-curve.png"))
Exemplo n.º 7
0
def main():
    args = parser.parse_args()
    if not os.path.isdir('CMDs'):
        os.mkdir('CMDs')
    with open('CMDs/step_train_dpn.cmd', 'a') as f:
        f.write(' '.join(sys.argv) + '\n')
        f.write('--------------------------------\n')

    model_dir = Path(args.model_dir)
    checkpoint_path = args.checkpoint_path
    if checkpoint_path is None:
        checkpoint_path = model_dir / 'model'
    # Check that we are training on a sensible GPU
    assert max(args.gpu) <= torch.cuda.device_count() - 1

    device = select_gpu(args.gpu)
    # Load up the model
    ckpt = torch.load(model_dir / 'model/model.tar', map_location=device)
    model = ModelFactory.model_from_checkpoint(ckpt)
    if len(args.gpu) > 1 and torch.cuda.device_count() > 1:
        model = torch.nn.DataParallel(model, device_ids=args.gpu)
        print('Using Multi-GPU training.')
    model.to(device)

    if args.normalize:
        mean = DATASET_DICT[args.id_dataset].mean
        std = DATASET_DICT[args.id_dataset].std
    else:
        mean = (0.5, 0.5, 0.5)
        std = (0.5, 0.5, 0.5)

    # Load the in-domain training and validation data
    train_dataset = DATASET_DICT[args.id_dataset](root=args.data_path,
                                                  transform=construct_transforms(
                                                      n_in=ckpt['n_in'],
                                                      mode='train',
                                                      mean=mean,
                                                      std=std,
                                                      augment=args.augment,
                                                      rotation=args.rotate,
                                                      jitter=args.jitter),
                                                  target_transform=None,
                                                  download=True,
                                                  split='train')

    val_dataset = DATASET_DICT[args.id_dataset](root=args.data_path,
                                                transform=construct_transforms(
                                                    n_in=ckpt['n_in'],
                                                    mean=mean,
                                                    std=std,
                                                    mode='eval',
                                                    rotation=args.rotate,
                                                    jitter=args.jitter),
                                                target_transform=None,
                                                download=True,
                                                split='val')

    # Load the out-of-domain training dataset
    ood_dataset = DATASET_DICT[args.ood_dataset](root=args.data_path,
                                                 transform=construct_transforms(
                                                     n_in=ckpt['n_in'],
                                                     mean=mean,
                                                     std=std,
                                                     mode='ood'),
                                                 target_transform=None,
                                                 download=True,
                                                 split='train')
    ood_val_dataset = DATASET_DICT[args.ood_dataset](root=args.data_path,
                                                     transform=construct_transforms(
                                                         n_in=ckpt['n_in'],
                                                         mean=mean,
                                                         std=std,
                                                         mode='eval'),
                                                     target_transform=None,
                                                     download=True,
                                                     split='val')

    # Combine ID and OOD training datasets into a single dataset for
    # training (necessary for DataParallel training)
    assert len(val_dataset) == len(ood_val_dataset)

    # Even out dataset lengths.
    id_ratio = 1.0
    if len(train_dataset) < len(ood_dataset):
        id_ratio = np.ceil(float(len(ood_dataset)) / float(len(train_dataset)))
        assert id_ratio.is_integer()
        dataset_list = [train_dataset, ] * (int(id_ratio))
        train_dataset = data.ConcatDataset(dataset_list)

    if len(train_dataset) > len(ood_dataset):
        ratio = np.ceil(float(len(train_dataset)) / float(len(ood_dataset)))
        assert ratio.is_integer()
        dataset_list = [ood_dataset, ] * int(ratio)
        ood_dataset = data.ConcatDataset(dataset_list)

        if len(ood_dataset) > len(train_dataset):
            ood_dataset = data.Subset(ood_dataset, np.arange(0, len(train_dataset)))

    assert len(train_dataset) == len(ood_dataset)
    print(f"Validation dataset length: {len(val_dataset)}")
    print(f"Train dataset length: {len(train_dataset)}")

    # Set up training and test criteria
    id_criterion = DirichletKLLoss(target_concentration=args.target_concentration,
                                   concentration=args.concentration,
                                   reverse=args.reverse_KL)

    ood_criterion = DirichletKLLoss(target_concentration=0.0,
                                    concentration=args.concentration,
                                    reverse=args.reverse_KL)

    criterion = PriorNetMixedLoss([id_criterion, ood_criterion], mixing_params=[1.0, args.gamma])

    # Select optimizer and optimizer params
    optimizer, optimizer_params = choose_optimizer(args.optimizer,
                                                   args.lr,
                                                   args.weight_decay)

    # Setup model trainer and train model
    lrc = [int(lrc / id_ratio) for lrc in args.lrc]
    trainer = TrainerWithOOD(model=model,
                             criterion=criterion,
                             id_criterion=id_criterion,
                             ood_criterion=ood_criterion,
                             test_criterion=criterion,
                             ood_dataset=ood_dataset,
                             test_ood_dataset=ood_val_dataset,
                             train_dataset=train_dataset,
                             test_dataset=val_dataset,
                             optimizer=optimizer,
                             device=device,
                             checkpoint_path=checkpoint_path,
                             scheduler=optim.lr_scheduler.MultiStepLR,
                             optimizer_params=optimizer_params,
                             scheduler_params={'milestones': lrc, 'gamma': args.lr_decay},
                             batch_size=args.batch_size,
                             clip_norm=args.clip_norm)
    if args.resume:
        try:
            trainer.load_checkpoint(True, True, map_location=device)
        except:
            print('No checkpoint found, training from empty model.')
            pass
    trainer.train(int(args.n_epochs / id_ratio), resume=args.resume)

    # Save final model
    if len(args.gpu) > 1 and torch.cuda.device_count() > 1:
        model = model.module
    ModelFactory.checkpoint_model(path=model_dir / 'model/model.tar',
                                  model=model,
                                  arch=ckpt['arch'],
                                  dropout_rate=ckpt['dropout_rate'],
                                  n_channels=ckpt['n_channels'],
                                  num_classes=ckpt['num_classes'],
                                  small_inputs=ckpt['small_inputs'],
                                  n_in=ckpt['n_in'])
Exemplo n.º 8
0
def main():
    args = parser.parse_args()
    if not os.path.isdir('CMDs'):
        os.mkdir('CMDs')
    with open('CMDs/ood_detect.cmd', 'a') as f:
        f.write(' '.join(sys.argv) + '\n')
        f.write('--------------------------------\n')
    if os.path.isdir(args.output_path) and not args.overwrite:
        print(f'Directory {args.output_path} exists. Exiting...')
        sys.exit()
    elif os.path.isdir(args.output_path) and args.overwrite:
        os.remove(args.output_path + '/*')
    else:
        os.makedirs(args.output_path)

    # Check that we are using a sensible GPU device
    device = select_gpu(args.gpu)

    model_dir = Path(args.model_dir)
    # Load up the model
    ckpt = torch.load(model_dir / 'model/model.tar', map_location=device)
    model = ModelFactory.model_from_checkpoint(ckpt)

    model.to(device)
    model.eval()

    # Load the in-domain evaluation data
    id_dataset = DATASET_DICT[args.id_dataset](
        root=args.data_path,
        transform=construct_transforms(n_in=ckpt['n_in'],
                                       mean=DATASET_DICT[args.id_dataset].mean,
                                       std=DATASET_DICT[args.id_dataset].std,
                                       num_channels=args.n_channels,
                                       mode='eval'),
        target_transform=None,
        download=True,
        split='test')

    # id_dataset = DataSpliter.reduceSize(id_dataset, 10)

    ood_dataset = DATASET_DICT[args.ood_dataset](
        root=args.data_path,
        transform=construct_transforms(n_in=ckpt['n_in'],
                                       mean=DATASET_DICT[args.id_dataset].mean,
                                       std=DATASET_DICT[args.id_dataset].std,
                                       num_channels=args.n_channels,
                                       mode='eval'),
        target_transform=None,
        download=True,
        split='test')
    # ood_dataset = DataSpliter.reduceSize(ood_dataset, 10)
    print(
        f"ID dataset length: {len(id_dataset)}, OOD dataset length: {len(ood_dataset)}"
    )

    # Evaluate the model
    if args.use_attack_id_dataset:
        id_logits, id_labels, _ = construct_adversarial_dataset(
            model=model,
            dataset=id_dataset,
            epsilon=0.5,
            batch_size=args.batch_size,
            device=device,
            attack_type='FGSM',
            step_size=0.4,
            norm='inf',
            max_steps=10)
    else:
        id_logits, id_labels = eval_logits_on_dataset(
            model=model,
            dataset=id_dataset,
            batch_size=args.batch_size,
            device=device)

    ood_logits, ood_labels = eval_logits_on_dataset(model=model,
                                                    dataset=ood_dataset,
                                                    batch_size=args.batch_size,
                                                    device=device)

    id_labels, id_probs, id_logits = id_labels.numpy(), F.softmax(
        id_logits, dim=1).numpy(), id_logits.numpy()
    ood_labels, ood_probs, ood_logits = ood_labels.numpy(), F.softmax(
        ood_logits, dim=1).numpy(), ood_logits.numpy()

    # Save model outputs
    np.savetxt(os.path.join(args.output_path, 'id_labels.txt'), id_labels)
    np.savetxt(os.path.join(args.output_path, 'id_probs.txt'), id_probs)
    np.savetxt(os.path.join(args.output_path, 'id_logits.txt'), id_logits)

    np.savetxt(os.path.join(args.output_path, 'ood_labels.txt'), ood_labels)
    np.savetxt(os.path.join(args.output_path, 'ood_probs.txt'), ood_probs)
    np.savetxt(os.path.join(args.output_path, 'ood_logits.txt'), ood_logits)

    # Get dictionary of uncertainties.
    id_uncertainties = dirichlet_prior_network_uncertainty(id_logits)
    ood_uncertainties = dirichlet_prior_network_uncertainty(ood_logits)
    # Save uncertainties
    for key in id_uncertainties.keys():
        np.savetxt(os.path.join(args.output_path, key + '_id.txt'),
                   id_uncertainties[key])
        np.savetxt(os.path.join(args.output_path, key + '_ood.txt'),
                   ood_uncertainties[key])

    # Compute Labels
    # For OOD detection task, we have a binary classification problem at hand, where label=0 indicates in-domain sample and
    # label=1 indicates ood sample.
    in_domain = np.zeros_like(id_labels)
    out_domain = np.ones_like(ood_labels)
    domain_labels = np.concatenate((in_domain, out_domain), axis=0)

    eval_ood_detect(domain_labels=domain_labels,
                    in_uncertainties=id_uncertainties,
                    out_uncertainties=ood_uncertainties,
                    save_path=args.output_path)
Exemplo n.º 9
0
def main():
    args = parser.parse_args()
    if not os.path.isdir('CMDs'):
        os.mkdir('CMDs')
    with open('CMDs/step_train_dnn.cmd', 'a') as f:
        f.write(' '.join(sys.argv) + '\n')
        f.write('--------------------------------\n')

    model_dir = Path(args.model_dir)
    checkpoint_path = args.checkpoint_path
    if checkpoint_path is None:
        checkpoint_path = model_dir / 'model'
    # Load up the model

    assert max(args.gpu) <= torch.cuda.device_count() - 1

    device = select_gpu(args.gpu)
    # Load up the model
    ckpt = torch.load(model_dir / 'model/model.tar', map_location=device)
    model = ModelFactory.model_from_checkpoint(ckpt)
    if len(args.gpu) > 1 and torch.cuda.device_count() > 1:
        model = torch.nn.DataParallel(model, device_ids=args.gpu)
        print('Using Multi-GPU training.')
    model.to(device)

    if args.normalize:
        mean = DATASET_DICT[args.dataset].mean
        std = DATASET_DICT[args.dataset].std
    else:
        mean = (0.5, 0.5, 0.5)
        std = (0.5, 0.5, 0.5)

    # Load the in-domain training and validation data
    train_dataset = DATASET_DICT[args.dataset](root=args.data_path,
                                               transform=construct_transforms(
                                                   n_in=ckpt['n_in'],
                                                   mode='train',
                                                   mean=mean,
                                                   std=std,
                                                   augment=args.augment,
                                                   rotation=args.rotate,
                                                   jitter=args.jitter),
                                               target_transform=None,
                                               download=True,
                                               split='train')

    val_dataset = DATASET_DICT[args.dataset](root=args.data_path,
                                             transform=construct_transforms(
                                                 n_in=ckpt['n_in'],
                                                 mean=mean,
                                                 std=std,
                                                 mode='eval'),
                                             target_transform=None,
                                             download=True,
                                             split='val')

    # Check that we are training on a sensible GPU

    # Set up training and test criteria
    criterion = torch.nn.CrossEntropyLoss()

    # Select optimizer and optimizer params
    optimizer, optimizer_params = choose_optimizer(args.optimizer, args.lr,
                                                   args.weight_decay)

    # Setup model trainer and train model
    trainer = Trainer(model=model,
                      criterion=criterion,
                      test_criterion=criterion,
                      train_dataset=train_dataset,
                      test_dataset=val_dataset,
                      optimizer=optimizer,
                      device=device,
                      checkpoint_path=checkpoint_path,
                      scheduler=optim.lr_scheduler.MultiStepLR,
                      optimizer_params=optimizer_params,
                      scheduler_params={
                          'milestones': args.lrc,
                          'gamma': args.lr_decay
                      },
                      batch_size=args.batch_size,
                      clip_norm=args.clip_norm)
    if args.resume:
        try:
            trainer.load_checkpoint(True, True, map_location=device)
        except:
            print('No checkpoint found, training from empty model.')
            pass
    trainer.train(args.n_epochs, resume=args.resume)

    # Save final model
    if len(args.gpu) > 1 and torch.cuda.device_count() > 1:
        model = model.module
    ModelFactory.checkpoint_model(path=model_dir / 'model/model.tar',
                                  model=model,
                                  arch=ckpt['arch'],
                                  dropout_rate=ckpt['dropout_rate'],
                                  n_channels=ckpt['n_channels'],
                                  num_classes=ckpt['num_classes'],
                                  small_inputs=ckpt['small_inputs'],
                                  n_in=ckpt['n_in'])
def main():
    args = parser.parse_args()
    if not os.path.isdir('CMDs'):
        os.mkdir('CMDs')
    with open('CMDs/construct_adversarial_attack.cmd', 'a') as f:
        f.write(' '.join(sys.argv) + '\n')
        f.write('--------------------------------\n')
    if os.path.isdir(args.output_path) and not args.overwrite:
        print(f'Directory {args.output_path} exists. Exiting...')
        sys.exit()
    elif os.path.isdir(args.output_path) and args.overwrite:
        os.remove(args.output_path + '/*')
    else:
        os.makedirs(args.output_path)
        os.makedirs(os.path.join(args.output_path, 'images'))

    # Check that we are using a sensible GPU
    device = select_gpu(args.gpu)

    # Load up the model
    model_dir = Path(args.model_dir)
    ckpt = torch.load(os.path.join(model_dir, 'model/model.tar'),
                      map_location=device)
    model = ModelFactory.model_from_checkpoint(ckpt)
    model.to(device)
    model.eval()

    # Wrap model with a Foolbox wrapper.
    mean = np.array([0.4914, 0.4823, 0.4465]).reshape((3, 1, 1))
    std = np.array([0.247, 0.243, 0.261]).reshape((3, 1, 1))

    fmodel = PyTorchModel(model,
                          bounds=(0, 1),
                          num_classes=ckpt['num_classes'],
                          preprocessing=(mean, std))

    # Load the evaluation data
    if args.train:
        dataset = DATASET_DICT[args.dataset](root=args.data_path,
                                             transform=construct_transforms(
                                                 n_in=ckpt['n_in'],
                                                 mode='train'),
                                             target_transform=None,
                                             download=True,
                                             split='train')
    else:
        dataset = DATASET_DICT[args.dataset](root=args.data_path,
                                             transform=construct_transforms(
                                                 n_in=ckpt['n_in'],
                                                 mode='eval'),
                                             target_transform=None,
                                             download=True,
                                             split='test')

    loader = DataLoader(dataset, batch_size=args.batch_size, num_workers=1)

    # Construct adversarial attack
    if args.attack == 'CWL2':
        if args.adaptive:
            attack = AdaptiveCarliniWagnerL2Attack(model=fmodel)
        else:
            attack = CarliniWagnerL2Attack(model=fmodel)
    elif args.attack == 'EAD':
        if args.adaptive:
            attack = AdaptiveEADAttack(model=fmodel)
        else:
            attack = EADAttack(model=fmodel)
    else:
        raise NotImplementedError

    adversarials = []
    for i, data in enumerate(loader):
        start = time.time()
        images, labels = data
        images = images.numpy()
        labels = labels.numpy()
        adversarials.extend(attack(inputs=images, labels=labels, unpack=False))
        print(
            f"Batch {i}/{len(loader)} took {np.round((time.time() - start) / 60.0, 1)} minutes."
        )

    adv_labels = np.stack(
        [adversarial.adversarial_class for adversarial in adversarials],
        axis=0)
    labels = np.stack(
        [adversarial.original_class for adversarial in adversarials], axis=0)
    distances = np.stack(
        [adversarial.distance for adversarial in adversarials], axis=0)
    logits = np.stack([adversarial.output for adversarial in adversarials],
                      axis=0)

    np.savetxt(os.path.join(args.output_path, 'labels.txt'),
               labels,
               dtype=np.int32)
    np.savetxt(os.path.join(args.output_path, 'adv_labels.txt'),
               adv_labels,
               dtype=np.int32)
    np.savetxt(os.path.join(args.output_path, 'logits.txt'),
               logits,
               dtype=np.float32)
    np.savetxt(os.path.join(args.output_path, 'distances.txt'),
               distances,
               dtype=np.float32)

    accuracy = np.mean(np.asarray(labels == adv_labels, dtype=np.float32))
    sr = np.mean(np.asarray(labels != adv_labels, dtype=np.float32))
    with open(os.path.join(args.output_path, 'results.txt'), 'a') as f:
        f.write(
            f'Classification Error: {np.round(100 * (1.0 - accuracy), 1)} \n')
        f.write(f'Success Rate: {np.round(100 * sr, 1)} \n')

    print("Saving images to folder...")
    adversarial_images = np.stack(
        [adversarial.perturbed for adversarial in adversarials], axis=0)
    for i, image in enumerate([
            np.asarray(255.0 * adversarial.perturbed, dtype=np.uint8)
            for adversarial in adversarials
    ]):
        print(np.max(adversarial_images), np.min(adversarial_images))
        Image.fromarray(image).save(
            os.path.join(args.output_path, f"images/{i}.png"))