9.5.3 在Cleverhans中進行對抗訓練
9.5.3在Cleverhans中進行對抗訓練
對抗訓練的過程就是用生成的對抗樣本和原始訓練數據重新訓練模型的過程,我們繼續使用上例中生成的ModelBasicCNN和對抗樣本。為了與之前訓練的模型區別開來,我們重新實例化ModelBasicCNN和FGSM算法實例。
model2=ModelBasicCNN('model2',nb_classes,nb_filters)
fgsm2=FastGradientMethod(model2,sess=sess)
defattack(x):
returnfgsm2.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函數用於對抗訓練時打印中間結果。
defevaluate2():
#計算對抗訓練的模型在原始數據上的準確度
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%。
Testaccuracyonlegitimateexamples:0.9899
Testaccuracyonadversarialexamples:0.9355