什么是cleverhans库?
cleverhans是一个机器学习模型攻防库,里面有很多的攻防技术实现。安装只需pip install cleverhans 这句口令,随后便能调用库里的函数。
FGSM代码——可以直接运行
1、使用了Alexnet模型,然后只放了一张图片,这部分代码主要对图片进行初始化,方便使用
from __future__ import print_function
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
import numpy as np
import matplotlib.pyplot as plt
from torchvision import models
import cv2
from torch.autograd import Variable
#获取计算设备 默认是CPU
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
#图像加载以及预处理
image_path="data/goldfish.jpg"
orig = cv2.imread(image_path)[..., ::-1]
orig = cv2.resize(orig, (224, 224))
img = orig.copy().astype(np.float32)
mean = [0.485, 0.456, 0.406]
std = [0.229, 0.224, 0.225]
img /= 255.0
img = (img - mean) / std
img = img.transpose(2, 0, 1)
img=np.expand_dims(img, axis=0)
img = Variable(torch.from_numpy(img).to(device).float())
print(img.shape)
#使用预测模式 主要影响droupout和BN层的行为,用的是Alexnet模型,现成的
model = models.alexnet(pretrained=True).to(device).eval()
#取真实标签
label=np.argmax(model(img).data.cpu().numpy())#这里为什么要加cup()?因为np无法直接转为cuda使用,要先转cpu
print("label={}".format(label))
epoch = 1#训练轮次
target = 31#原始图片的标签
target = Variable(torch.Tensor([float(target)]).to(device).long())#转换数据类型
print(target)
2、使用cleverhans实现FGSN攻击,关键代码段是
adver_example = fast_gradient_method(model, img.data, 0.01, np.inf)#(模型,图片数据,扰动值,范数:np.inf、0或1)范数的作用占时不知道 adver_target = torch.max(model(adver_example),1)[1]#取出概率最大的那个标签
#导入cleverhans中的FGSM函数
from cleverhans.torch.attacks.fast_gradient_method import fast_gradient_method
def FGSM(model):
for i in range(epoch):
adver_example = fast_gradient_method(model, img.data, 0.01, np.inf)
adver_target = torch.max(model(adver_example),1)[1]
if adver_target != target:
print("FGSM attack 成功")
print("epoch={} adver_target={}".format(epoch,adver_target))
return adver_example,adver_target,'FGSM attack'
FGSM(model)
运行结果如下,原来标签为31,之后模型识别为114
参考链接
https://github.com/cleverhans-lab/cleverhans/tree/master/examples