def evaluate(self):
        """
        Evaluate.
        """

        self.model.eval()
        clean_probabilities = common.test.test(self.model,
                                               self.testloader,
                                               cuda=self.args.cuda)

        attack, objective = self.get_attack()
        adversarial_perturbations, adversarial_probabilities, adversarial_errors = common.test.attack(
            self.model,
            self.adversarialloader,
            attack,
            objective,
            attempts=5,
            cuda=self.args.cuda)

        eval = common.eval.AdversarialEvaluation(clean_probabilities,
                                                 adversarial_probabilities,
                                                 self.testset.labels,
                                                 validation=0.9,
                                                 errors=adversarial_errors)
        log('test error in %%: %g' % (eval.test_error() * 100))
        log('test error @99%%tpr in %%: %g' %
            (eval.test_error_at_99tpr() * 100))
        log('robust test error in %%: %g' % (eval.robust_test_error() * 100))
        log('robust test error @99%%tpr in %%: %g' %
            (eval.robust_test_error_at_99tpr() * 100))
Пример #2
0
    def testReferenceAdversarialTraining(self):
        optimizer = torch.optim.SGD(self.model.parameters(),
                                    lr=0.1,
                                    momentum=0.9)
        scheduler = common.train.get_exponential_scheduler(
            optimizer, batches_per_epoch=len(self.trainset))
        writer = common.summary.SummaryDictWriter()
        augmentation = None

        epsilon = 0.3
        attack = attacks.BatchReferencePGD()
        attack.max_iterations = 10
        attack.epsilon = epsilon
        attack.base_lr = 0.1
        attack.norm = attacks.norms.LInfNorm()
        objective = attacks.objectives.UntargetedF0Objective()

        trainer = common.train.AdversarialTraining(self.model,
                                                   self.trainset,
                                                   self.testset,
                                                   optimizer,
                                                   scheduler,
                                                   attack,
                                                   objective,
                                                   fraction=1,
                                                   augmentation=augmentation,
                                                   writer=writer,
                                                   cuda=self.cuda)
        trainer.summary_gradients = False

        epochs = 10
        for e in range(epochs):
            trainer.step(e)

        probabilities = common.test.test(self.model,
                                         self.testset,
                                         cuda=self.cuda)
        eval = common.eval.CleanEvaluation(probabilities,
                                           self.testset.dataset.labels,
                                           validation=0)
        self.assertGreaterEqual(0.05, eval.test_error())

        adversarial_perturbations, adversarial_probabilities, _ = common.test.attack(
            self.model,
            self.adversarialset,
            attack,
            objective,
            attempts=1,
            writer=writer,
            cuda=self.cuda)
        eval = common.eval.AdversarialEvaluation(
            probabilities[:len(self.adversarialset.dataset)],
            adversarial_probabilities,
            self.adversarialset.dataset.labels,
            validation=0)
        self.assertGreaterEqual(0.2, eval.robust_test_error())
Пример #3
0
    def evaluate(self):
        """
        Evaluate.
        """
        # это не работает и это нормально. так и должно быть. для него надо отдельно код фиксить

        self.model.eval()
        clean_probabilities = common.test.test(self.model,
                                               self.testloader,
                                               cuda=True)

        total_adversarial_probabilities = None
        total_adversarial_errors = None

        for attack, objective, attempts in self.get_test_attacks():
            _, adversarial_probabilities, _ = common.test.attack(
                self.model,
                self.adversarialloader,
                attack,
                objective,
                attempts=attempts,
                cuda=True)

            relevant_adversarial_probabilities = numpy.copy(
                adversarial_probabilities)
            relevant_adversarial_probabilities[:,
                                               numpy.arange(
                                                   relevant_adversarial_probabilities
                                                   .shape[1]), self.testset.
                                               labels[:relevant_adversarial_probabilities
                                                      .shape[1]], ] = 0
            assert len(relevant_adversarial_probabilities.shape) == 3
            adversarial_errors = -numpy.max(relevant_adversarial_probabilities,
                                            axis=2)

            total_adversarial_probabilities = common.numpy.concatenate(
                total_adversarial_probabilities,
                adversarial_probabilities,
                axis=0)
            total_adversarial_errors = common.numpy.concatenate(
                total_adversarial_errors, adversarial_errors, axis=0)

        eval = common.eval.AdversarialEvaluation(
            clean_probabilities,
            total_adversarial_probabilities,
            self.testset.labels,
            validation=0.9,
            errors=total_adversarial_errors)
        log('test error in %%: %g' % (eval.test_error() * 100))
        log('test error @99%%tpr in %%: %g' %
            (eval.test_error_at_99tpr() * 100))
        log('robust test error in %%: %g' % (eval.robust_test_error() * 100))
        log('robust test error @99%%tpr in %%: %g' %
            (eval.robust_test_error_at_99tpr() * 100))
        log(f'success rate: {eval.success_rate()}')
Пример #4
0
    def evaluate(self):
        """
        Evaluate.
        """

        self.model.eval()
        clean_probabilities = common.test.test(self.model,
                                               self.testloader,
                                               cuda=self.args.cuda)

        total_adversarial_probabilities = None
        total_adversarial_errors = None

        for attack, objective, attempts in self.get_test_attacks():
            _, adversarial_probabilities, _ = common.test.attack(
                self.model,
                self.adversarialloader,
                attack,
                objective,
                attempts=attempts,
                cuda=self.args.cuda)

            relevant_adversarial_probabilities = numpy.copy(
                adversarial_probabilities)
            relevant_adversarial_probabilities[:,
                                               numpy.arange(
                                                   relevant_adversarial_probabilities
                                                   .shape[1]), self.testset.
                                               labels[:relevant_adversarial_probabilities
                                                      .shape[1]], ] = 0
            assert len(relevant_adversarial_probabilities.shape) == 3
            adversarial_errors = -numpy.max(relevant_adversarial_probabilities,
                                            axis=2)

            total_adversarial_probabilities = common.numpy.concatenate(
                total_adversarial_probabilities,
                adversarial_probabilities,
                axis=0)
            total_adversarial_errors = common.numpy.concatenate(
                total_adversarial_errors, adversarial_errors, axis=0)

        eval = common.eval.AdversarialEvaluation(
            clean_probabilities,
            total_adversarial_probabilities,
            self.testset.labels,
            validation=0.9,
            errors=total_adversarial_errors)
        log('test error in %%: %g' % (eval.test_error() * 100))
        log('test error @99%%tpr in %%: %g' %
            (eval.test_error_at_99tpr() * 100))
        log('robust test error in %%: %g' % (eval.robust_test_error() * 100))
        log('robust test error @99%%tpr in %%: %g' %
            (eval.robust_test_error_at_99tpr() * 100))
Пример #5
0
attack.initialization = attacks.initializations.LInfUniformNormInitialization(epsilon)
attack.projection = attacks.projections.SequentialProjections([
    attacks.projections.LInfProjection(epsilon),
    attacks.projections.BoxProjection()
])
attack.norm = attacks.norms.LInfNorm()
objective = attacks.objectives.UntargetedF0Objective()

model.eval()

# Obtain predicted probabilities on clean examples.
# Note that the full test set is used.
clean_probabilities = common.test.test(model, testloader, cuda=cuda)
# Run attack, will also provide the corresponding predicted probabilities.
# Note that only 1000 examples are attacked.
_, adversarial_probabilities, adversarial_errors = common.test.attack(model, adversarialloader, attack,
                                                     objective, attempts=5, cuda=cuda)
print(clean_probabilities.shape) # 10000 x 10
print(adversarial_probabilities.shape) # 5 x 100 x 10

# Use validation=0.1 such that 10% of the clean probabilities are
# used to determine the confidence threshold.
eval = common.eval.AdversarialEvaluation(clean_probabilities, adversarial_probabilities,
                                         testset.labels, validation=0.1, errors=adversarial_errors)
print('test error in %%: %g' % eval.test_error())
print('robust test error in %%: %g' % eval.robust_test_error())

print('confidence threshold @99%%TPR: %g' % eval.confidence_at_99tpr())
print('test error @99%%TPR in %%: %g' % eval.test_error_at_99tpr())
print('false positive rate @99%%TPR in %%: %g' % eval.fpr_at_99tpr())
print('robust test error @99%%TPR in %%: %g' % eval.robust_test_error_at_99tpr())
l0_attack.initialization = attacks.initializations.L1UniformNormInitialization(
    l0_epsilon)
l0_attack.projection = attacks.projections.SequentialProjections([
    attacks.projections.L0Projection(l0_epsilon),
    attacks.projections.BoxProjection()
])
l0_attack.norm = attacks.norms.L0Norm()

objective = attacks.objectives.UntargetedF0Objective()
labels = ['linf', 'l2', 'l1', 'l0']
epsilons = [linf_epsilon, l2_epsilon, l1_epsilon, l0_epsilon]
attacks = [linf_attack, l2_attack, l1_attack, l0_attack]

model.eval()
clean_probabilities = common.test.test(model, testloader, cuda=cuda)

for a in range(len(attacks)):
    _, adversarial_probabilities, _ = common.test.attack(model,
                                                         adversarialloader,
                                                         linf_attack,
                                                         objective,
                                                         attempts=1,
                                                         cuda=cuda)
    eval = common.eval.AdversarialEvaluation(clean_probabilities,
                                             adversarial_probabilities,
                                             testset.labels,
                                             validation=0.1)
    print('[%s, epsilon=%g] robust test error in %%: %g' %
          (labels[a], epsilons[a], (100 * eval.robust_test_error())))
    print('[%s, epsilon=%g] robust test error @99%%TPR in %%: %g' %
          (labels[a], epsilons[a], (100 * eval.robust_test_error_at_99tpr())))