У меня небольшой код дерева решений, и я верю, что я конвертирую все в int, и я проверил свои данные поезда / теста с помощью isnan, max и т. Д.
Я действительно понятия не имею, почему он дает такую ошибку.
Итак, я пытаюсь передать набор данных Mnist из дерева решений, а затем я буду атаковать, используя класс.
Вот код:
from AttackUtils import Attack
from AttackUtils import calc_output_weighted_weights, targeted_gradient, non_targeted_gradient, non_targeted_sign_gradient
(X_train_woae, y_train_woae), (X_test_woae, y_test_woae) = mnist.load_data()
X_train_woae = X_train_woae.reshape((len(X_train_woae), np.prod(X_train_woae.shape[1:])))
X_test_woae = X_test_woae.reshape((len(X_test_woae), np.prod(X_test_woae.shape[1:])))
from sklearn import tree
#model_woae = LogisticRegression(multi_class='multinomial', solver='lbfgs', fit_intercept=False)
model_woae = tree.DecisionTreeClassifier(class_weight='balanced')
model_woae.fit(X_train_woae, y_train_woae)
#model_woae.coef_ = model_woae.feature_importances_
coef_int = np.round(model_woae.tree_.compute_feature_importances(normalize=False) * X_train_woae.size).astype(int)
attack_woae = Attack(model_woae)
attack_woae.prepare(X_train_woae, y_train_woae, X_test_woae, y_test_woae)
weights_woae = attack_woae.weights
num_classes_woae = len(np.unique(y_train_woae))
attack_woae.create_one_hot_targets(y_test_woae)
attack_woae.attack_to_max_epsilon(non_targeted_gradient, 50)
non_targeted_scores_woae = attack_woae.scores
Таким образом, класс атаки выполняет возмущение и нецелевую градиентную атаку. А вот класс атаки:
import numpy as np
from sklearn.metrics import accuracy_score
def calc_output_weighted_weights(output, w):
for c in range(len(output)):
if c == 0:
weighted_weights = output[c] * w[c]
else:
weighted_weights += output[c] * w[c]
return weighted_weights
def targeted_gradient(foolingtarget, output, w):
ww = calc_output_weighted_weights(output, w)
for k in range(len(output)):
if k == 0:
gradient = foolingtarget[k] * (w[k]-ww)
else:
gradient += foolingtarget[k] * (w[k]-ww)
return gradient
def non_targeted_gradient(target, output, w):
ww = calc_output_weighted_weights(output, w)
for k in range(len(target)):
if k == 0:
gradient = (1-target[k]) * (w[k]-ww)
else:
gradient += (1-target[k]) * (w[k]-ww)
return gradient
def non_targeted_sign_gradient(target, output, w):
gradient = non_targeted_gradient(target, output, w)
return np.sign(gradient)
class Attack:
def __init__(self, model):
self.fooling_targets = None
self.model = model
def prepare(self, X_train, y_train, X_test, y_test):
self.images = X_test
self.true_targets = y_test
self.num_samples = X_test.shape[0]
self.train(X_train, y_train)
print("Model training finished.")
self.test(X_test, y_test)
print("Model testing finished. Initial accuracy score: " + str(self.initial_score))
def set_fooling_targets(self, fooling_targets):
self.fooling_targets = fooling_targets
def train(self, X_train, y_train):
self.model.fit(X_train, y_train)
self.weights = self.model.coef_
self.num_classes = self.weights.shape[0]
def test(self, X_test, y_test):
self.preds = self.model.predict(X_test)
self.preds_proba = self.model.predict_proba(X_test)
self.initial_score = accuracy_score(y_test, self.preds)
def create_one_hot_targets(self, targets):
self.one_hot_targets = np.zeros(self.preds_proba.shape)
for n in range(targets.shape[0]):
self.one_hot_targets[n, targets[n]] = 1
def attack(self, attackmethod, epsilon):
perturbed_images, highest_epsilon = self.perturb_images(epsilon, attackmethod)
perturbed_preds = self.model.predict(perturbed_images)
score = accuracy_score(self.true_targets, perturbed_preds)
return perturbed_images, perturbed_preds, score, highest_epsilon
def perturb_images(self, epsilon, gradient_method):
perturbed = np.zeros(self.images.shape)
max_perturbations = []
for n in range(self.images.shape[0]):
perturbation = self.get_perturbation(epsilon, gradient_method, self.one_hot_targets[n], self.preds_proba[n])
perturbed[n] = self.images[n] + perturbation
max_perturbations.append(np.max(perturbation))
highest_epsilon = np.max(np.array(max_perturbations))
return perturbed, highest_epsilon
def get_perturbation(self, epsilon, gradient_method, target, pred_proba):
gradient = gradient_method(target, pred_proba, self.weights)
inf_norm = np.max(gradient)
perturbation = epsilon / inf_norm * gradient
return perturbation
def attack_to_max_epsilon(self, attackmethod, max_epsilon):
self.max_epsilon = max_epsilon
self.scores = []
self.epsilons = []
self.perturbed_images_per_epsilon = []
self.perturbed_outputs_per_epsilon = []
for epsilon in range(0, self.max_epsilon):
perturbed_images, perturbed_preds, score, highest_epsilon = self.attack(attackmethod, epsilon)
self.epsilons.append(highest_epsilon)
self.scores.append(score)
self.perturbed_images_per_epsilon.append(perturbed_images)
self.perturbed_outputs_per_epsilon.append(perturbed_preds)
И это обратная связь, которую он дает:
ValueError
Traceback (последний последний вызов) в
4 num_classes_woae = len (np.unique (y_train_woae))
5 attack_woae.create_one_hot_targets (y_test_woae)
----> 6 attack_woae.attack_to_max_epsilon (non_targeted_gradient, 50)
7 non_targeted_scores_woae = attack_woae.scores
~ \ MULTIATTACK \ AttackUtils.py в
attack_to_max_epsilon (self, метод атаки, max_epsilon)
106 self.perturbed_outputs_per_epsilon = []
107 для эпсилона в диапазоне (0, self.max_epsilon):
-> 108 perturbed_images, perturbed_preds, счет, наивысший_epsilon = self.attack (метод атаки, эпсилон)
109 self.epsilons.append (самый высокий_epsilon)
110 self.scores.append (оценка)
~ \ MULTIATTACK \ AttackUtils.py в атаке (самостоятельно,
метод атаки, эпсилон)
79 атака защиты (self, метод атаки, эпсилон):
80 perturbed_images, самый высокий_epsilon = self.perturb_images (эпсилон, метод атаки)
---> 81 perturbed_preds = self.model.predict (perturbed_images)
82 балла = точность_отчёта (self.true_targets, perturbed_preds)
83 возврата perturbed_images, perturbed_preds, оценка, наивысший_отчет
... \ AppData \ Local \ Программы \ питон \ python35 \ Lib \ сайт-пакеты \ sklearn \ дерево \ tree.py
в прогнозе (self, X, check_input)
413 "" "
414 check_is_fited (self, 'tree_')
-> 415 X = self._validate_X_predict (X, check_input)
416 проба = self.tree_.predict (X)
417 n_samples = X.shape [0]
... \ AppData \ Local \ Программы \ питон \ python35 \ Lib \ сайт-пакеты \ sklearn \ дерево \ tree.py
в _validate_X_predict (self, X, check_input)
374 "" "Проверяйте X всякий раз, когда кто-то пытается предсказать, применить, предсказание_proba" ""
375 если check_input:
-> 376 X = check_array (X, dtype = DTYPE, accept_sparse = "csr")
377 если issparse (X) и (X.indices.dtype! = Np.intc или
378 X.indptr.dtype! = Np.intc):
... \ AppData \ Local \ Программы \ питон \ python35 \ Lib \ сайт-пакеты \ sklearn \ Utils \ validation.py
в check_array (массив, accept_sparse, accept_large_sparse, dtype,
заказ, копирование, force_all_finite, sure_2d, allow_nd,
sure_min_samples, sure_min_features, warn_on_dtype, оценщик)
566 if force_all_finite:
567 _assert_all_finite (массив,
-> 568 allow_nan = force_all_finite == 'allow-nan')
569
570 shape_repr = _shape_repr (array.shape)
... \ AppData \ Local \ Программы \ питон \ python35 \ Lib \ сайт-пакеты \ sklearn \ Utils \ validation.py
в _assert_all_finite (X, allow_nan)
54 not allow_nan и np.isfinite (X) .all ()):
55 type_err = 'бесконечность', если allow_nan остальное 'NaN, бесконечность'
---> 56 повысить ValueError (msg_err.format (type_err, X.dtype))
57
58
ValueError: вход содержит NaN, бесконечность или значение, слишком большое для
DTYPE ( 'float32').
EDIT:
Я добавил числа коэффициентов как 0, и теперь он выдает ту же ошибку чуть ниже линии, в attack.attack_to_max_epsilon(non_targeted_gradient, epsilon_number)