示例#1
0
 def _train_adv(self, inputs, targets):
     self._update_params_train()
     self.optimizer.zero_grad()
     self.model.perturb_modules.zero_grad()
     inputs_adv = pgd(self, inputs, targets, self._adv_params, mode='train')
     outputs = self.model(inputs_adv)
     loss = self.criterion(outputs, targets)
     loss.backward()
     self._update_theta()
     self.optimizer.step()
     return outputs, loss
示例#2
0
 def setup(self, lp, eps=None):
     adv_inputs = attacks.pgd(
         self.model,
         self.normalizer,
         self.inputs,
         self.labels,
         self.dataset,
         lp,
         eps,
     )
     self.add_input_to_compute(adv_inputs)
示例#3
0
    parser.add_argument('--svhn', action='store_true')
    parser.add_argument('--har', action='store_true')
    parser.add_argument('--fashion', action='store_true')

    args = parser.parse_args()

    if args.mnist:
        train_loader, test_loader = pblm.mnist_loaders(args.batch_size)
        model = pblm.mnist_model().cuda()
        # model.load_state_dict(torch.load('icml/mnist_epochs_100_baseline_model.pth'))
        model.load_state_dict(torch.load('../models/mnist.pth'))
    elif args.svhn:
        train_loader, test_loader = pblm.svhn_loaders(args.batch_size)
        model = pblm.svhn_model().cuda()
        model.load_state_dict(
            torch.load('svhn_new/svhn_epsilon_0_01_schedule_0_001'))
    elif args.har:
        pass
    elif args.fashion:
        pass
    else:
        raise ValueError("Need to specify which problem.")
    for p in model.parameters():
        p.requires_grad = False

    epsilon = 0.1
    num_classes = model[-1].out_features

    pgd(test_loader, model, epsilon, args.niters)
    svgd(test_loader, model, epsilon, args.niters)
    parser.add_argument('--mnist', action='store_true')
    parser.add_argument('--svhn', action='store_true')
    parser.add_argument('--har', action='store_true')
    parser.add_argument('--fashion', action='store_true')

    args = parser.parse_args()

    if args.mnist:
        train_loader, test_loader = pblm.mnist_loaders(args.batch_size)
        model = pblm.mnist_model().cuda()
        # model.load_state_dict(torch.load('icml/mnist_epochs_100_baseline_model.pth'))
        model.load_state_dict(torch.load('../models/mnist.pth'))
    elif args.svhn:
        train_loader, test_loader = pblm.svhn_loaders(args.batch_size)
        model = pblm.svhn_model().cuda()
        model.load_state_dict(torch.load('../models/svhn.pth'))
    elif args.har:
        pass
    elif args.fashion:
        pass
    else:
        raise ValueError("Need to specify which problem.")
    for p in model.parameters():
        p.requires_grad = False

    num_classes = model[-1].out_features

    dgf(test_loader, model, args.epsilon, args.niters, args.alpha)
    pgd(test_loader, model, args.epsilon, args.niters, args.alpha)
    svgd(test_loader, model, args.epsilon, args.niters, args.alpha)
示例#5
0
def eval_adv_test(model, device, test_loader, attack, attack_params,
                  results_dir):
    """
    evaluate model by white-box attack
    """
    model.eval()
    count = 0
    if attack == 'pgd':
        restarts_matrices = []
        for run in range(attack_params['num_restarts']):
            current_matrix_rows = []
            count = 0
            batch_num = 0
            natural_accuracy = 0
            for data, target, unsup in test_loader:
                batch_num = batch_num + 1
                if batch_num > args.num_eval_batches:
                    break
                data, target = data.to(device), target.to(device)
                count = count + len(target)
                X, y = Variable(data, requires_grad=True), Variable(target)
                # matrix_robust has batch_size*num_iterations dimensions
                indices_natural, matrix_robust = pgd(
                    model,
                    X,
                    y,
                    epsilon=attack_params['epsilon'],
                    num_steps=attack_params['num_steps'],
                    step_size=attack_params['step_size'],
                    pretrain=args.pretrain,
                    random_start=attack_params['random_start'])
                natural_accuracy = natural_accuracy + sum(indices_natural)
                current_matrix_rows.append(matrix_robust)
            logging.info('Completed restart: %g' % run)
            current_matrix = np.concatenate(current_matrix_rows, axis=0)
            logging.info("Shape of current_matrix %s" %
                         str(current_matrix.shape))
            restarts_matrices.append(current_matrix)

            final_matrix = np.asarray(restarts_matrices)
            if run == 0:
                final_success = np.ones([count, 1])
            final_success = np.multiply(
                final_success,
                np.reshape(current_matrix[:, attack_params['num_steps'] - 1],
                           [-1, 1]))
            logging.info('%d' % np.sum(final_success))
            # logging.info('%d' % (np.sum(final_success))/count)
            logging.info("Shape of final matrix: %s" % str(final_matrix.shape))
            # logging.info("Final accuracy %g:" % np.sum(final_success)/count)
            stats = {
                'attack': 'pgd',
                'count': count,
                'epsilon': attack_params['epsilon'],
                'num_steps': attack_params['num_steps'],
                'step_size': attack_params['step_size'],
                'natural_accuracy': float(natural_accuracy.item() / count),
                'final_matrix': final_matrix.tolist(),
                'robust_accuracy': float(np.sum(final_success) / count),
                'restart_num': run
            }

            json_stats = {
                'attack': 'pgd',
                'natural_accuracy': float(natural_accuracy.item() / count),
                'robust_accuracy': float(np.sum(final_success) / count)
            }
            with open(os.path.join(results_dir, 'stats.json'), 'w') as outfile:
                json.dump(json_stats, outfile)

            np.save(os.path.join(results_dir, 'stats' + str(run) + '.npy'),
                    stats)
            np.save(os.path.join(results_dir, 'stats.npy'), stats)
    elif attack == 'cw':
        all_linf_distances = []
        count = 0
        for data, target, unsup in test_loader:
            logging.info('Batch: %g', count)
            count = count + 1
            if count > args.num_eval_batches:
                break
            data, target = data.to(device), target.to(device)
            X, y = Variable(data, requires_grad=True), Variable(target)
            batch_linf_distances = cw(
                model,
                X,
                y,
                binary_search_steps=attack_params['binary_search_steps'],
                max_iterations=attack_params['max_iterations'],
                learning_rate=attack_params['learning_rate'],
                initial_const=attack_params['initial_const'],
                tau_decrease_factor=attack_params['tau_decrease_factor'])
            all_linf_distances.append(batch_linf_distances)
            np.savetxt(os.path.join(results_dir, 'CW_dist'),
                       all_linf_distances)
        np.savetxt(os.path.join(results_dir, 'CW_dist'), all_linf_distances)
    else:
        raise ValueError("Attack not supported")