9.3.2 在ART中使用FGSM算法
9.3.2 在art中使用fgsm算法
下面我们以mnist为例介绍如何在art中使用fgsm算法,代码路径为:
https://github.com/duoergun0729/adversarial_examples/blob/master/code/9-art-mnist-fgsm.ipynb
首先加载需要使用的python库,使用的深度学习框架为keras+tensorflow。art中对各种深度学习框架的封装在art.classifiers中,对攻击算法的封装在art.attacks中。
import sys
from os.path import abspath
import keras.backend as k
from keras.models import sequential
from keras.layers import dense, flatten, conv2d, maxpooling2d, dropout
import numpy as np
from art.attacks.fast_gradient import fastgradientmethod
from art.classifiers import kerasclassifier
from art.utils import load_dataset
加载mnist数据集,训练集为x_train,测试集为x_test。
# 加载mnist数据集
(x_train, y_train), (x_test, y_test), min_, max_ = load_dataset(str('mnist'))
构造一个简单的双层cnn模型,第一层卷积核大小为3,信道数为32,第二层卷积核大小为3,信道数为64,经过2x2大小的最大值池化后,丢弃25%的数据,连接一个核数为128的全连接,再丢弃50%的数据,输出到核数为10的全连接层。
k.set_learning_phase(1)
model = sequential()
model.add(conv2d(32, kernel_size=(3, 3), activation='relu',
input_shape=x_train.shape[1:]))
model.add(conv2d(64, (3, 3), activation='relu'))
model.add(maxpooling2d(pool_size=(2, 2)))
model.add(dropout(0.25))
model.add(flatten())
model.add(dense(128, activation='relu'))
model.add(dropout(0.5))
model.add(dense(10, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam',
metrics=['accuracy'])
使用adam优化器,损失函数为交叉熵,经过5轮训练后在测试集上准确率达到了98.37%。
classifier = kerasclassifier((min_, max_), model=model)
classifier.fit(x_train, y_train, nb_epochs=5, batch_size=128)
preds = np.argmax(classifier.predict(x_test), axis=1)
acc = np.sum(preds == np.argmax(y_test, axis=1)) / y_test.shape[0]
print("ntest accuracy: %.2f%%" % (acc * 100))
test accuracy: 98.37%
构造fgsm攻击算法实例,使用无定向攻击,在测试集上构造攻击样本,攻击参数eps设置为0.3,并使用原有模型进行预测。
# 用fgsm构造对抗样本
epsilon = .3 # maximum perturbation
adv_crafter = fastgradientmethod(classifier)
x_test_adv = adv_crafter.generate(x=x_test, eps=epsilon)
# 计算对抗样本的分类结果
preds = np.argmax(classifier.predict(x_test_adv), axis=1)
acc = np.sum(preds == np.argmax(y_test, axis=1)) / y_test.shape[0]
print("ntest accuracy on adversarial sample: %.2f%%" % (acc * 100))
预测结果表明,原有模型只能正确识别对抗样本中的29.53%,攻击成功率为70.47%。
test accuracy on adversarial sample: 29.53%
直观的认识,攻击扰动越大,原有模型正确识别的比例应该越低,攻击成功率应该越高。下面通过实验来验证我们的想法。我们从大到小列举常见的eps取值,然后分别计算原有模型的识别率。
eps_range = [0.01, 0.02, 0.03, 0.04, 0.05, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6,
0.7, 0.8, 0.9]
nb_correct_original = []
for eps in eps_range:
x_test_adv = adv_crafter.generate(x_test, eps=eps)
x_test_adv_pred = np.argmax(classifier.predict(x_test_adv), axis=1)
nb_correct_original += [np.sum(x_test_adv_pred == np.argmax(y_test,
axis=1))/y_test.shape[0]]
最后我们可视化识别率和eps之间的关系,其中横坐标为eps的值,纵坐标为识别率。如图9-7所示,识别率会随eps的增长而下降,并且当eps小于0.4时,识别率会随eps的增长迅速下降,当eps大于0.4后,识别率的下降十分平缓。
%matplotlib inline
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot(np.array(eps_range), np.array(nb_correct_original), 'b--',
label='original classifier')
legend = ax.legend(loc='upper center', shadow=true, fontsize='large')
legend.get_frame().set_facecolor('#ffffff')
plt.xlabel('attack strength (eps)')
plt.ylabel('correct predictions')
plt.show()
图9-7 fgsm算法中识别率与eps的关系图
下面我们以mnist为例介绍如何在art中使用fgsm算法,代码路径为:
https://github.com/duoergun0729/adversarial_examples/blob/master/code/9-art-mnist-fgsm.ipynb
首先加载需要使用的python库,使用的深度学习框架为keras+tensorflow。art中对各种深度学习框架的封装在art.classifiers中,对攻击算法的封装在art.attacks中。
import sys
from os.path import abspath
import keras.backend as k
from keras.models import sequential
from keras.layers import dense, flatten, conv2d, maxpooling2d, dropout
import numpy as np
from art.attacks.fast_gradient import fastgradientmethod
from art.classifiers import kerasclassifier
from art.utils import load_dataset
加载mnist数据集,训练集为x_train,测试集为x_test。
# 加载mnist数据集
(x_train, y_train), (x_test, y_test), min_, max_ = load_dataset(str('mnist'))
构造一个简单的双层cnn模型,第一层卷积核大小为3,信道数为32,第二层卷积核大小为3,信道数为64,经过2x2大小的最大值池化后,丢弃25%的数据,连接一个核数为128的全连接,再丢弃50%的数据,输出到核数为10的全连接层。
k.set_learning_phase(1)
model = sequential()
model.add(conv2d(32, kernel_size=(3, 3), activation='relu',
input_shape=x_train.shape[1:]))
model.add(conv2d(64, (3, 3), activation='relu'))
model.add(maxpooling2d(pool_size=(2, 2)))
model.add(dropout(0.25))
model.add(flatten())
model.add(dense(128, activation='relu'))
model.add(dropout(0.5))
model.add(dense(10, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam',
metrics=['accuracy'])
使用adam优化器,损失函数为交叉熵,经过5轮训练后在测试集上准确率达到了98.37%。
classifier = kerasclassifier((min_, max_), model=model)
classifier.fit(x_train, y_train, nb_epochs=5, batch_size=128)
preds = np.argmax(classifier.predict(x_test), axis=1)
acc = np.sum(preds == np.argmax(y_test, axis=1)) / y_test.shape[0]
print("ntest accuracy: %.2f%%" % (acc * 100))
test accuracy: 98.37%
构造fgsm攻击算法实例,使用无定向攻击,在测试集上构造攻击样本,攻击参数eps设置为0.3,并使用原有模型进行预测。
# 用fgsm构造对抗样本
epsilon = .3 # maximum perturbation
adv_crafter = fastgradientmethod(classifier)
x_test_adv = adv_crafter.generate(x=x_test, eps=epsilon)
# 计算对抗样本的分类结果
preds = np.argmax(classifier.predict(x_test_adv), axis=1)
acc = np.sum(preds == np.argmax(y_test, axis=1)) / y_test.shape[0]
print("ntest accuracy on adversarial sample: %.2f%%" % (acc * 100))
预测结果表明,原有模型只能正确识别对抗样本中的29.53%,攻击成功率为70.47%。
test accuracy on adversarial sample: 29.53%
直观的认识,攻击扰动越大,原有模型正确识别的比例应该越低,攻击成功率应该越高。下面通过实验来验证我们的想法。我们从大到小列举常见的eps取值,然后分别计算原有模型的识别率。
eps_range = [0.01, 0.02, 0.03, 0.04, 0.05, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6,
0.7, 0.8, 0.9]
nb_correct_original = []
for eps in eps_range:
x_test_adv = adv_crafter.generate(x_test, eps=eps)
x_test_adv_pred = np.argmax(classifier.predict(x_test_adv), axis=1)
nb_correct_original += [np.sum(x_test_adv_pred == np.argmax(y_test,
axis=1))/y_test.shape[0]]
最后我们可视化识别率和eps之间的关系,其中横坐标为eps的值,纵坐标为识别率。如图9-7所示,识别率会随eps的增长而下降,并且当eps小于0.4时,识别率会随eps的增长迅速下降,当eps大于0.4后,识别率的下降十分平缓。
%matplotlib inline
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot(np.array(eps_range), np.array(nb_correct_original), 'b--',
label='original classifier')
legend = ax.legend(loc='upper center', shadow=true, fontsize='large')
legend.get_frame().set_facecolor('#ffffff')
plt.xlabel('attack strength (eps)')
plt.ylabel('correct predictions')
plt.show()
图9-7 fgsm算法中识别率与eps的关系图