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模型。
cd advbox/tutorials
python mnist_model_pytorch.py
经过10轮训练,在测试集上的准确率达到了99.00%。
epoch=10 accuracy=99.00%
然后加载需要使用的python库,使用的深度学习框架为pytorch。advbox中对各种深度学习框架的封装在advbox.models中,对攻击算法的封装在advbox.attacks中。通过sys.path.append把advbox的源码添加到python的系统路径中。
import sys
#添加系统路径
sys.path.append("../advbox/")
import torch
import torchvision
from torchvision import datasets, transforms
from torch.autograd import variable
import torch.utils.data.dataloader as data
from advbox.adversary import adversary
from advbox.attacks.gradient_method import fgsm
from advbox.models.pytorch import pytorchmodel
from tutorials.mnist_model_pytorch import net
定义全局变量,分别为测试集的大小以及预训练的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" if torch.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
for i, data in enumerate(test_loader):
inputs, labels = data
inputs, labels=inputs.numpy(),labels.numpy()
total_count += 1
adversary = adversary(inputs, labels[0])
# fgsm non-targeted attack
adversary = attack(adversary, **attack_config)
经过10 000次攻击,攻击成功个数为10 000,攻击成功率为100%。
attack success, original_label=9, adversarial_label=4, count=10000
[test_dataset]: fooling_count=10000, total_count=10000, fooling_rate=1.000000
fgsm attack done
下面我们以mnist为例介绍如何在advbox中使用fgsm算法,代码路径为:
https://github.com/duoergun0729/adversarial_examples/blob/master/code/ 9-advbox-mnist-fgsm.ipynb
首先运行mnist_model_pytorch.py生成识别mnist的cnn/mlp模型。
cd advbox/tutorials
python mnist_model_pytorch.py
经过10轮训练,在测试集上的准确率达到了99.00%。
epoch=10 accuracy=99.00%
然后加载需要使用的python库,使用的深度学习框架为pytorch。advbox中对各种深度学习框架的封装在advbox.models中,对攻击算法的封装在advbox.attacks中。通过sys.path.append把advbox的源码添加到python的系统路径中。
import sys
#添加系统路径
sys.path.append("../advbox/")
import torch
import torchvision
from torchvision import datasets, transforms
from torch.autograd import variable
import torch.utils.data.dataloader as data
from advbox.adversary import adversary
from advbox.attacks.gradient_method import fgsm
from advbox.models.pytorch import pytorchmodel
from tutorials.mnist_model_pytorch import net
定义全局变量,分别为测试集的大小以及预训练的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" if torch.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
for i, data in enumerate(test_loader):
inputs, labels = data
inputs, labels=inputs.numpy(),labels.numpy()
total_count += 1
adversary = adversary(inputs, labels[0])
# fgsm non-targeted attack
adversary = attack(adversary, **attack_config)
经过10 000次攻击,攻击成功个数为10 000,攻击成功率为100%。
attack success, original_label=9, adversarial_label=4, count=10000
[test_dataset]: fooling_count=10000, total_count=10000, fooling_rate=1.000000
fgsm attack done