def test_7_scikitlearn(self):
        from sklearn.linear_model import LogisticRegression
        from sklearn.svm import SVC, LinearSVC

        from art.estimators.classification.scikitlearn import SklearnClassifier

        scikitlearn_test_cases = [
            LogisticRegression(solver="lbfgs", multi_class="auto"),
            SVC(gamma="auto"),
            LinearSVC(),
        ]

        x_test_original = self.x_test_iris.copy()

        for model in scikitlearn_test_cases:
            classifier = SklearnClassifier(model=model, clip_values=(0, 1))
            classifier.fit(x=self.x_test_iris, y=self.y_test_iris)

            # Test untargeted attack
            attack = ProjectedGradientDescent(classifier, eps=1.0, eps_step=0.1, max_iter=5, verbose=False)
            x_test_adv = attack.generate(self.x_test_iris)
            self.assertFalse((self.x_test_iris == x_test_adv).all())
            self.assertTrue((x_test_adv <= 1).all())
            self.assertTrue((x_test_adv >= 0).all())

            preds_adv = np.argmax(classifier.predict(x_test_adv), axis=1)
            self.assertFalse((np.argmax(self.y_test_iris, axis=1) == preds_adv).all())
            acc = np.sum(preds_adv == np.argmax(self.y_test_iris, axis=1)) / self.y_test_iris.shape[0]
            logger.info(
                "Accuracy of " + classifier.__class__.__name__ + " on Iris with PGD adversarial examples: " "%.2f%%",
                (acc * 100),
            )

            # Test targeted attack
            targets = random_targets(self.y_test_iris, nb_classes=3)
            attack = ProjectedGradientDescent(
                classifier, targeted=True, eps=1.0, eps_step=0.1, max_iter=5, verbose=False
            )
            x_test_adv = attack.generate(self.x_test_iris, **{"y": targets})
            self.assertFalse((self.x_test_iris == x_test_adv).all())
            self.assertTrue((x_test_adv <= 1).all())
            self.assertTrue((x_test_adv >= 0).all())

            preds_adv = np.argmax(classifier.predict(x_test_adv), axis=1)
            self.assertTrue((np.argmax(targets, axis=1) == preds_adv).any())
            acc = np.sum(preds_adv == np.argmax(targets, axis=1)) / self.y_test_iris.shape[0]
            logger.info(
                "Success rate of " + classifier.__class__.__name__ + " on targeted PGD on Iris: %.2f%%", (acc * 100)
            )

            # Check that x_test has not been modified by attack and classifier
            self.assertAlmostEqual(float(np.max(np.abs(x_test_original - self.x_test_iris))), 0.0, delta=0.00001)
    def test_GradientBoosting(self):
        model = GradientBoostingClassifier(n_estimators=4, max_depth=6)
        model.fit(self.x_train, np.argmax(self.y_train, axis=1))

        classifier = SklearnClassifier(model=model)

        rt = RobustnessVerificationTreeModelsCliqueMethod(
            classifier=classifier)
        average_bound, verified_error = rt.verify(x=self.x_test,
                                                  y=self.y_test,
                                                  eps_init=0.3,
                                                  nb_search_steps=10,
                                                  max_clique=2,
                                                  max_level=2)

        self.assertAlmostEqual(average_bound,
                               0.008982421874999,
                               delta=0.00000001)
        self.assertEqual(verified_error, 1.0)
 def test_scikitlearn(self):
     clf = DecisionTreeClassifier()
     x_original = self.X.copy()
     clf.fit(self.X, self.y)
     clf_art = SklearnClassifier(clf)
     attack = DecisionTreeAttack(clf_art, verbose=False)
     adv = attack.generate(self.X[:25])
     # all crafting should succeed
     self.assertTrue(
         np.sum(clf.predict(adv) == clf.predict(self.X[:25])) == 0)
     targets = np.array([
         1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8,
         8, 8, 9
     ])
     adv = attack.generate(self.X[:25], targets)
     # all targeted crafting should succeed as well
     self.assertTrue(np.sum(clf.predict(adv) == targets) == 25.0)
     # Check that X has not been modified by attack and classifier
     self.assertAlmostEqual(float(np.max(np.abs(x_original - self.X))),
                            0.0,
                            delta=0.00001)
Ejemplo n.º 4
0
    def test_6_scikitlearn(self):
        from sklearn.linear_model import LogisticRegression
        from sklearn.svm import SVC, LinearSVC
        from sklearn.tree import DecisionTreeClassifier, ExtraTreeClassifier
        from sklearn.ensemble import AdaBoostClassifier, BaggingClassifier, ExtraTreesClassifier
        from sklearn.ensemble import GradientBoostingClassifier, RandomForestClassifier

        from art.estimators.classification.scikitlearn import SklearnClassifier

        scikitlearn_test_cases = [
            DecisionTreeClassifier(),
            ExtraTreeClassifier(),
            AdaBoostClassifier(),
            BaggingClassifier(),
            ExtraTreesClassifier(n_estimators=10),
            GradientBoostingClassifier(n_estimators=10),
            RandomForestClassifier(n_estimators=10),
            LogisticRegression(solver="lbfgs", multi_class="auto"),
            SVC(gamma="auto"),
            LinearSVC(),
        ]

        x_test_original = self.x_test_iris.copy()

        for model in scikitlearn_test_cases:
            classifier = SklearnClassifier(model=model, clip_values=(0, 1))
            classifier.fit(x=self.x_test_iris, y=self.y_test_iris)

            # Norm=2
            attack = HopSkipJump(classifier,
                                 targeted=False,
                                 max_iter=20,
                                 max_eval=100,
                                 init_eval=10)
            x_test_adv = attack.generate(self.x_test_iris)
            self.assertFalse((self.x_test_iris == x_test_adv).all())
            self.assertTrue((x_test_adv <= 1).all())
            self.assertTrue((x_test_adv >= 0).all())

            preds_adv = np.argmax(classifier.predict(x_test_adv), axis=1)
            self.assertFalse((np.argmax(self.y_test_iris,
                                        axis=1) == preds_adv).all())
            acc = np.sum(preds_adv == np.argmax(
                self.y_test_iris, axis=1)) / self.y_test_iris.shape[0]
            logger.info(
                "Accuracy of " + classifier.__class__.__name__ +
                " on Iris with HopSkipJump adversarial "
                "examples: %.2f%%",
                (acc * 100),
            )

            # Norm=np.inf
            attack = HopSkipJump(classifier,
                                 targeted=False,
                                 max_iter=20,
                                 max_eval=100,
                                 init_eval=10,
                                 norm=np.Inf)
            x_test_adv = attack.generate(self.x_test_iris)
            self.assertFalse((self.x_test_iris == x_test_adv).all())
            self.assertTrue((x_test_adv <= 1).all())
            self.assertTrue((x_test_adv >= 0).all())

            preds_adv = np.argmax(classifier.predict(x_test_adv), axis=1)
            self.assertFalse((np.argmax(self.y_test_iris,
                                        axis=1) == preds_adv).all())
            acc = np.sum(preds_adv == np.argmax(
                self.y_test_iris, axis=1)) / self.y_test_iris.shape[0]
            logger.info(
                "Accuracy of " + classifier.__class__.__name__ +
                " on Iris with HopSkipJump adversarial "
                "examples: %.2f%%",
                (acc * 100),
            )

            # Check that x_test has not been modified by attack and classifier
            self.assertAlmostEqual(float(
                np.max(np.abs(x_test_original - self.x_test_iris))),
                                   0.0,
                                   delta=0.00001)
Ejemplo n.º 5
0
    def test_7_scikitlearn(self):
        from sklearn.linear_model import LogisticRegression
        from sklearn.svm import SVC, LinearSVC

        from art.estimators.classification.scikitlearn import SklearnClassifier

        scikitlearn_test_cases = [
            LogisticRegression(solver="lbfgs", multi_class="auto"),
            SVC(gamma="auto"),
            LinearSVC(),
        ]

        x_test_original = self.x_test_iris.copy()

        for model in scikitlearn_test_cases:
            classifier = SklearnClassifier(model=model, clip_values=(0, 1))
            classifier.fit(x=self.x_test_iris, y=self.y_test_iris)

            # Test untargeted attack
            attack = ElasticNet(classifier,
                                targeted=False,
                                max_iter=2,
                                verbose=False)
            x_test_adv = attack.generate(self.x_test_iris)
            self.assertFalse((self.x_test_iris == x_test_adv).all())
            self.assertLessEqual(np.amax(x_test_adv), 1.0)
            self.assertGreaterEqual(np.amin(x_test_adv), 0.0)

            predictions_adv = np.argmax(classifier.predict(x_test_adv), axis=1)
            self.assertFalse((np.argmax(self.y_test_iris,
                                        axis=1) == predictions_adv).all())
            accuracy = 1.0 - np.sum(predictions_adv == np.argmax(
                self.y_test_iris, axis=1)) / self.y_test_iris.shape[0]
            logger.info(
                "EAD success rate  of " + classifier.__class__.__name__ +
                " on Iris: %.2f%%", (accuracy * 100))

            # Test targeted attack
            targets = random_targets(self.y_test_iris, nb_classes=3)
            attack = ElasticNet(classifier,
                                targeted=True,
                                max_iter=2,
                                verbose=False)
            x_test_adv = attack.generate(self.x_test_iris, **{"y": targets})
            self.assertFalse((self.x_test_iris == x_test_adv).all())
            self.assertLessEqual(np.amax(x_test_adv), 1.0)
            self.assertGreaterEqual(np.amin(x_test_adv), 0.0)

            predictions_adv = np.argmax(classifier.predict(x_test_adv), axis=1)
            self.assertTrue((np.argmax(targets,
                                       axis=1) == predictions_adv).any())
            accuracy = np.sum(predictions_adv == np.argmax(
                targets, axis=1)) / self.y_test_iris.shape[0]
            logger.info(
                "Targeted EAD success rate of " +
                classifier.__class__.__name__ + " on Iris: %.2f%%",
                (accuracy * 100))

            # Check that x_test has not been modified by attack and classifier
            self.assertAlmostEqual(float(
                np.max(np.abs(x_test_original - self.x_test_iris))),
                                   0.0,
                                   delta=0.00001)
    def setUpClass(cls):
        master_seed(seed=301)
        (x_train, y_train), (x_test, y_test), min_, max_ = load_mnist()
        y_train = np.argmax(y_train, axis=1)
        y_test = np.argmax(y_test, axis=1)
        zero_or_four = np.logical_or(y_train == 4, y_train == 0, y_train == 9)
        x_train = x_train[zero_or_four]
        y_train = y_train[zero_or_four]
        tr_labels = np.zeros((y_train.shape[0], 2))
        tr_labels[y_train == 0] = np.array([1, 0])
        tr_labels[y_train == 4] = np.array([0, 1])
        y_train = tr_labels

        zero_or_four = np.logical_or(y_test == 4, y_test == 0)
        x_test = x_test[zero_or_four]
        y_test = y_test[zero_or_four]
        te_labels = np.zeros((y_test.shape[0], 2))
        te_labels[y_test == 0] = np.array([1, 0])
        te_labels[y_test == 4] = np.array([0, 1])
        y_test = te_labels

        n_samples_train = x_train.shape[0]
        n_features_train = x_train.shape[1] * x_train.shape[2] * x_train.shape[3]
        n_samples_test = x_test.shape[0]
        n_features_test = x_test.shape[1] * x_test.shape[2] * x_test.shape[3]

        x_train = x_train.reshape(n_samples_train, n_features_train)
        x_test = x_test.reshape(n_samples_test, n_features_test)
        x_train = x_train[:NB_TRAIN]
        y_train = y_train[:NB_TRAIN]

        trusted_data = x_test[:NB_TRUSTED]
        trusted_labels = y_test[:NB_TRUSTED]
        x_test = x_test[NB_TRUSTED:]
        y_test = y_test[NB_TRUSTED:]
        valid_data = x_test[:NB_VALID]
        valid_labels = y_test[:NB_VALID]
        x_test = x_test[NB_VALID:]
        y_test = y_test[NB_VALID:]

        clean_prov = np.random.randint(NB_DEVICES - 1, size=x_train.shape[0])
        p_train = np.eye(NB_DEVICES)[clean_prov]

        no_defense = ScikitlearnSVC(model=SVC(kernel=kernel, gamma="auto"), clip_values=(min_, max_))
        no_defense.fit(x=x_train, y=y_train)
        poison_points = np.random.randint(no_defense._model.support_vectors_.shape[0], size=NB_POISON)
        all_poison_init = np.copy(no_defense._model.support_vectors_[poison_points])
        poison_labels = np.array([1, 1]) - no_defense.predict(all_poison_init)

        svm_attack = PoisoningAttackSVM(
            classifier=no_defense,
            x_train=x_train,
            y_train=y_train,
            step=0.1,
            eps=1.0,
            x_val=valid_data,
            y_val=valid_labels,
        )

        poisoned_data, _ = svm_attack.poison(all_poison_init, y=poison_labels)

        # Stack on poison to data and add provenance of bad actor
        all_data = np.vstack([x_train, poisoned_data])
        all_labels = np.vstack([y_train, poison_labels])
        poison_prov = np.zeros((NB_POISON, NB_DEVICES))
        poison_prov[:, NB_DEVICES - 1] = 1
        all_p = np.vstack([p_train, poison_prov])

        model = SVC(kernel=kernel, gamma="auto")
        cls.mnist = (
            (all_data, all_labels, all_p),
            (x_test, y_test),
            (trusted_data, trusted_labels),
            (valid_data, valid_labels),
            (min_, max_),
        )
        cls.classifier = SklearnClassifier(model=model, clip_values=(min_, max_))

        cls.classifier.fit(all_data, all_labels)
        cls.defence_trust = ProvenanceDefense(
            cls.classifier, all_data, all_labels, all_p, x_val=trusted_data, y_val=trusted_labels, eps=0.1,
        )
        cls.defence_no_trust = ProvenanceDefense(cls.classifier, all_data, all_labels, all_p, eps=0.1)
Ejemplo n.º 7
0
 def test_type(self):
     self.assertIsInstance(
         self.classifier, type(SklearnClassifier(model=self.sklearn_model)))
     with self.assertRaises(TypeError):
         ScikitlearnExtraTreeClassifier(model="sklearn_model")
Ejemplo n.º 8
0
 def test_type(self):
     self.assertIsInstance(
         self.classifier, type(SklearnClassifier(model=self.sklearn_model)))
     with self.assertRaises(TypeError):
         ScikitlearnLogisticRegression(model="sklearn_model")
Ejemplo n.º 9
0
 def test_type(self):
     self.assertIsInstance(
         self.classifier, type(SklearnClassifier(model=self.sklearn_model)))
     with self.assertRaises(TypeError):
         ScikitlearnGradientBoostingClassifier(model="sklearn_model")
 def test_type(self):
     self.assertIsInstance(self.classifier, type(SklearnClassifier(model=self.sklearn_model)))
    def test_SVC_kernels(self):
        """
        First test with the TensorFlowClassifier.
        :return:
        """
        # Get MNIST
        (x_train, y_train), (x_test, y_test), min_, max_ = self.iris
        x_test_original = x_test.copy()

        # Build Scikitlearn Classifier
        clip_values = (min_, max_)
        for kernel in ["linear", "poly", "rbf"]:
            clean = SklearnClassifier(model=SVC(kernel=kernel, gamma="auto"),
                                      clip_values=clip_values)
            clean.fit(x_train, y_train)
            poison = SklearnClassifier(model=SVC(kernel=kernel, gamma="auto"),
                                       clip_values=clip_values)
            poison.fit(x_train, y_train)
            attack = PoisoningAttackSVM(poison, 0.01, 1.0, x_train, y_train,
                                        x_test, y_test, 100)
            attack_y = np.array([1, 1]) - y_train[0]
            attack_point, _ = attack.poison(np.array([x_train[0]]),
                                            y=np.array([attack_y]))
            poison.fit(
                x=np.vstack([x_train, attack_point]),
                y=np.vstack([
                    y_train,
                    np.array([1, 1]) - np.copy(y_train[0].reshape((1, 2)))
                ]),
            )

            acc = np.average(np.all(clean.predict(x_test) == y_test,
                                    axis=1)) * 100
            poison_acc = np.average(
                np.all(poison.predict(x_test) == y_test, axis=1)) * 100
            logger.info("Clean Accuracy {}%".format(acc))
            logger.info("Poison Accuracy {}%".format(poison_acc))
            self.assertGreaterEqual(acc, poison_acc)

            # Check that x_test has not been modified by attack and classifier
            self.assertAlmostEqual(float(
                np.max(np.abs(x_test_original - x_test))),
                                   0.0,
                                   delta=0.00001)
    def test_linearSVC(self):
        """
        Test using a attack on LinearSVC
        """
        (x_train, y_train), (x_test, y_test), min_, max_ = self.iris
        x_test_original = x_test.copy()

        # Build Scikitlearn Classifier
        clip_values = (min_, max_)
        clean = SklearnClassifier(model=LinearSVC(), clip_values=clip_values)
        clean.fit(x_train, y_train)
        poison = SklearnClassifier(model=LinearSVC(), clip_values=clip_values)
        poison.fit(x_train, y_train)
        attack = PoisoningAttackSVM(poison, 0.01, 1.0, x_train, y_train,
                                    x_test, y_test, 100)
        attack_y = np.array([1, 1]) - y_train[0]
        attack_point, _ = attack.poison(np.array([x_train[0]]),
                                        y=np.array([attack_y]))
        poison.fit(x=np.vstack([x_train, attack_point]),
                   y=np.vstack([y_train,
                                np.copy(y_train[0].reshape((1, 2)))]))

        acc = np.average(np.all(clean.predict(x_test) == y_test, axis=1)) * 100
        poison_acc = np.average(
            np.all(poison.predict(x_test) == y_test, axis=1)) * 100
        logger.info("Clean Accuracy {}%".format(acc))
        logger.info("Poison Accuracy {}%".format(poison_acc))
        self.assertGreaterEqual(acc, poison_acc)

        # Check that x_test has not been modified by attack and classifier
        self.assertAlmostEqual(float(np.max(np.abs(x_test_original - x_test))),
                               0.0,
                               delta=0.00001)