Невозможно запустить атаку Карлини и Вагнера с помощью foolbox в модели тензорного потока

0

Вопрос

Я использую последнюю версию foolbox (3.3.1), и мой код просто загружает CNN RESNET-50, добавляет несколько слоев для переданного учебного приложения и загружает веса следующим образом.

from numpy.core.records import array
import tensorflow as tf
from keras.applications.resnet50 import ResNet50, preprocess_input
from tensorflow.keras.layers import Dense, Dropout, Flatten
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input
import cv2
import os
import numpy as np
import foolbox as FB
from sklearn.metrics import accuracy_score
from scipy.spatial.distance import cityblock
from sklearn.metrics import plot_confusion_matrix
from sklearn.metrics import confusion_matrix
from PIL import Image
import foolbox as FB
import math
from foolbox.criteria import Misclassification

#load model
num_classes = 12

#Load model and prepare it for testing
print("Step 1: Load model and weights")
baseModel = ResNet50(weights=None, include_top=False, input_tensor=Input(shape=(224, 224, 3)))
headModel = baseModel.output
headModel = Flatten(name="flatten")(headModel)
headModel = Dense(512, activation="relu")(headModel)
headModel = Dropout(0.5)(headModel)
headModel = Dense(num_classes, activation="softmax")(headModel)
model = Model(inputs=baseModel.input, outputs=headModel)
model.load_weights("RESNET-50/weights/train1-test1.h5")

print("Step 2: prepare testing data")
#features is a set of (1200,10,224,224,3) images
features=np.load("features.npy")
labels=np.load("labels.npy")

Теперь я хотел бы атаковать его с помощью атаки foolbox 3.3.1 Карлини и Вагнера, вот как я загружаю модель для foolbox

#Lets test the foolbox model
bounds = (0, 1)
fmodel = fb.TensorFlowModel(model, bounds=bounds)

Мой набор данных разделен на 10 изображений на документ, я буду атаковать эти 10 изображений, используя размер пакета 10 для foolbox, используя атаку Карлини и Вагнера

#for each i, I have 10 images
for i in range(0, features.shape[0]):

    print("document "+str(i))

    #Receive current values
    #This is a batch of (10,224,224,3) images
    features_to_test=features[i,:]
    #Get their labels
    labels_to_test=labels[i,:]

    ######################ATTACK IN THE NORMALIZED DOMAIN###########################  
    #lets do the attack
    #We use an interval of epsilons

    epsilons = np.linspace(0.01, 1, num=2)
    attack = fb.attacks.L2CarliniWagnerAttack(fmodel)
    adversarials = attack(features_to_test, labels_to_test, criterion=Misclassification(labels=labels_to_test), epsilons=epsilons)

Однако всякий раз, когда я запускаю код, мне возвращается ошибка

Traceback (most recent call last):
File "test_carlini_wagner.py", line 161, in <module>
adversarials = attack(features_to_test, labels_to_test, 
criterion=Misclassification(labels=labels_to_test), epsilons=epsilons)
File "/usr/local/lib/python3.8/dist-packages/foolbox/attacks/base.py", line 410, in 
__call__
xp = self.run(model, x, criterion, early_stop=early_stop, **kwargs)
File "/usr/local/lib/python3.8/dist-packages/foolbox/attacks/carlini_wagner.py", line 100, in run
bounds = model.bounds
AttributeError: 'tensorflow.python.framework.ops.EagerTensor' object has no attribute 
'bounds'

В чем должна быть ошибка? я неправильно загружаю свою модель? должен ли я добавить новые параметры для вызванной атаки? как уже говорилось ранее, я нахожусь в foolbox 3.3.1.

1

Лучший ответ

1

Я думаю, что вы, возможно, перепутали параметры L2CarliniWagnerAttack. Вот упрощенный рабочий пример с фиктивными данными:

import tensorflow as tf
import numpy as np

from tensorflow.keras.applications.resnet50 import ResNet50, preprocess_input
from tensorflow.keras.layers import Dense, Dropout, Flatten
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input
from sklearn.metrics import accuracy_score
from scipy.spatial.distance import cityblock
from sklearn.metrics import plot_confusion_matrix
from sklearn.metrics import confusion_matrix
from foolbox import TensorFlowModel
from foolbox.criteria import Misclassification
from foolbox.attacks import L2CarliniWagnerAttack

num_classes = 12

print("Step 1: Load model and weights")
baseModel = ResNet50(weights=None, include_top=False, input_tensor=Input(shape=(224, 224, 3)))
headModel = baseModel.output
headModel = Flatten(name="flatten")(headModel)
headModel = Dense(512, activation="relu")(headModel)
headModel = Dropout(0.5)(headModel)
headModel = Dense(num_classes, activation="softmax")(headModel)
model = Model(inputs=baseModel.input, outputs=headModel)

bounds = (0, 1)
fmodel = TensorFlowModel(model, bounds=bounds)
images, labels = tf.random.normal((64, 10, 224, 224, 3)), tf.random.uniform((64, 10,), maxval=13, dtype=tf.int32)

for i in range(0, images.shape[0]):

    print("document "+str(i))
    features_to_test=images[i,:]
    labels_to_test=labels[i,:]

    epsilons = np.linspace(0.01, 1, num=2)
    attack = L2CarliniWagnerAttack()
    adversarials = attack(fmodel, features_to_test, criterion=Misclassification(labels_to_test), epsilons=epsilons)
Step 1: Load model and weights
document 0
document 1
document 2
document 3
document 4
document 5
document 6
...
2021-11-23 12:13:46

Спасибо за ваш ответ, это работает! один вопрос: почему для этого метода требуются эпсилоны? похоже, подход в его реализациях не делает этого по умолчанию. Еще раз спасибо.
mad

Да, хороший вопрос.. документы кажутся довольно запутанными.
AloneTogether

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................