9.3.2 在ART中使用FGSM算法

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中。

importsys

fromos.pathimportabspath

importkeras.backendask

fromkeras.modelsimportSequential

fromkeras.layersimportDense,Flatten,Conv2D,MaxPooling2D,Dropout

importnumpyasnp

fromart.attacks.fast_gradientimportFastGradientMethod

fromart.classifiersimportKerasClassifier

fromart.utilsimportload_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,經過2×2大小的最大值池化后,丟棄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("nTestaccuracy:%.2f%%"%(acc*100))

Testaccuracy:98.37%

構造FGSM攻擊算法實例,使用無定向攻擊,在測試集上構造攻擊樣本,攻擊參數eps設置為0.3,並使用原有模型進行預測。

#用FGSM構造對抗樣本

epsilon=.3#Maximumperturbation

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("nTestaccuracyonadversarialsample:%.2f%%"%(acc*100))

預測結果表明,原有模型只能正確識別對抗樣本中的29.53%,攻擊成功率為70.47%。

Testaccuracyonadversarialsample: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=[]

forepsineps_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后,識別率的下降十分平緩。

%matplotlibinline

importmatplotlib.pyplotasplt

fig,ax=plt.subplots()

ax.plot(np.array(eps_range),np.array(nb_correct_original),'b--',

label='Originalclassifier')

legend=ax.legend(loc='uppercenter',shadow=True,fontsize='large')

legend.get_frame().set_facecolor('#FFFFFF')

plt.xlabel('Attackstrength(eps)')

plt.ylabel('Correctpredictions')

plt.show()

圖9-7FGSM算法中識別率與eps的關係圖

上一章書籍頁下一章

智能系統與技術叢書·AI安全之對抗樣本入門

···
加入書架
上一章
首頁 其他 智能系統與技術叢書·AI安全之對抗樣本入門
上一章下一章

9.3.2 在ART中使用FGSM算法

%