9.5.3 在cleverhans中进行对抗训练
对抗训练的过程就是用生成的对抗样本和原始训练数据重新训练模型的过程,我们继续使用上例中生成的modelbasiccnn和对抗样本。为了与之前训练的模型区别开来,我们重新实例化modelbasiccnn和fgsm算法实例。
model2 = modelbasiccnn('model2', nb_classes, nb_filters)
fgsm2 = fastgradientmethod(model2, sess=sess)
def attack(x):
return fgsm2.generate(x, **fgsm_params)
loss2 = crossentropy(model2, smoothing=label_smoothing, attack=attack)
preds2 = model2.get_logits(x)
生成对抗样本并重新训练模型。
adv_x2 = attack(x)
train(sess, loss2, x_train, y_train, evaluate=evaluate2,
args=train_params, rng=rng, var_list=model2.get_params())
其中evaluate2函数用于对抗训练时打印中间结果。
def evaluate2():
# 计算对抗训练的模型在原始数据上的准确度
do_eval(preds2, x_test, y_test, 'adv_train_clean_eval', false)
# 计算对抗训练的模型在对抗样本上的准确度
do_eval(preds2_adv, x_test, y_test, 'adv_train_adv_eval', true)
经过对抗训练,可以成功识别对抗样本中的93.55%。
test accuracy on legitimate examples: 0.9899
test accuracy on adversarial examples: 0.9355