9.2.2 在AdvBox中使用FGSM算法

9.2.2 在AdvBox中使用FGSM算法

9.2.2在AdvBox中使用FGSM算法

下面我們以MNIST為例介紹如何在AdvBox中使用FGSM算法,代碼路徑為:

https://github.com/duoergun0729/adversarial_examples/blob/master/code/9-advbox-mnist-fgsm.ipynb

首先運行mnist_model_pytorch.py生成識別MNIST的CNN/MLP模型。

cdAdvBox/tutorials

pythonmnist_model_pytorch.py

經過10輪訓練,在測試集上的準確率達到了99.00%。

epoch=10accuracy=99.00%

然後加載需要使用的Python庫,使用的深度學習框架為PyTorch。AdvBox中對各種深度學習框架的封裝在advbox.models中,對攻擊算法的封裝在advbox.attacks中。通過sys.path.append把AdvBox的源碼添加到Python的系統路徑中。

importsys

#添加系統路徑

sys.path.append("../AdvBox/")

importtorch

importtorchvision

fromtorchvisionimportdatasets,transforms

fromtorch.autogradimportVariable

importtorch.utils.data.dataloaderasData

fromadvbox.adversaryimportAdversary

fromadvbox.attacks.gradient_methodimportFGSM

fromadvbox.models.pytorchimportPytorchModel

fromtutorials.mnist_model_pytorchimportNet

定義全局變量,分別為測試集的大小以及預訓練的PyTorch模型的路徑。

TOTAL_NUM=10000

pretrained_model="../AdvBox/tutorials/mnist-pytorch/net.pth"

獲取測試數據集,在PyTorch中默認完成了MNIST歸一化。

#使用MNIST測試數據集,隨機挑選TOTAL_NUM個測試數據

test_loader=torch.utils.data.DataLoader(

datasets.MNIST('../AdvBox/tutorials/mnist-pytorch/data',train=False,

download=True,transform=transforms.Compose([

transforms.ToTensor(),

])),

batch_size=1,shuffle=True)

獲取當前的計算設備,當GPU可用時返回GPU,反之返回CPU。加載預訓練模型,並把模型設置為預測模式,因為Dropout和BN層在預測模式和訓練模式時功能不一樣,需要手工設置為預測模式。

device=torch.device("cuda"iftorch.cuda.is_available()else"cpu")

#網絡初始化

model=Net().to(device)

#加載預訓練模型

model.load_state_dict(torch.load(pretrained_model,map_location='cpu'))

#針對Dropout層,設置為預測模式

model.eval()

實例化AdvBox對象,在本例中選擇PytorchModel即可。實例化FGSM對象,並設置攻擊參數。其中channel_axis指的是通道字段在圖像數據中的位置,PyTorch中MNIST數據的形狀為[None,1,28,28],損失函數loss_func使用常見的交叉熵函數。

loss_func=torch.nn.CrossEntropyLoss()

#AdvBox示例

m=PytorchModel(

model,loss_func,(0,1),

channel_axis=1)

#實例化FGSM

attack=FGSM(m)

#設置攻擊步長為0.1

attack_config={"epsilons":0.1}

遍歷測試數據集,進行無定向FGSM攻擊。

#使用測試數據生成對抗樣本

total_count=0

fooling_count=0

fori,datainenumerate(test_loader):

inputs,labels=data

inputs,labels=inputs.numpy(),labels.numpy()

total_count+=1

adversary=Adversary(inputs,labels[0])

#FGSMnon-targetedattack

adversary=attack(adversary,**attack_config)

經過10000次攻擊,攻擊成功個數為10000,攻擊成功率為100%。

attacksuccess,original_label=9,adversarial_label=4,count=10000

[TEST_DATASET]:fooling_count=10000,total_count=10000,fooling_rate=1.000000

fgsmattackdone

上一章書籍頁下一章

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

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

9.2.2 在AdvBox中使用FGSM算法

%