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