cleverhans库——FGSM代码实战

这篇博客介绍了如何利用CleverHans库进行快速梯度符号法(FGSM)攻击。首先,它展示了如何加载和预处理一张图片,并使用预训练的Alexnet模型进行预测。接着,通过调用CleverHans库的`fast_gradient_method`函数,对图片进行FGSM攻击,导致模型预测结果改变。博客最后展示了攻击成功的例子。
摘要由CSDN通过智能技术生成

什么是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

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值