文章目录

  • 前言
  • 基于优化的对抗样本
  • FGSM
    • 1.首先导入相关包和参数设置:
    • 2.加载数据
    • 3.定义网络模型
    • 4.定义攻击函数
    • 5.开始攻击
    • 6.可视化测试

前言

让我们来看一下,怎么从深度学习的基本过程到对抗样本的生成?回顾一下深度学习训练的过程,通过计算预测值与实际值之间的损失函数,通过梯度下降,反向传播,更新了参数,不断减小损失函数的值,过程如下图所示:

那对抗样本的生成也可以参考这样的过程。不同的是,对抗样本的生成过程中网络参数不变(一般是训练好的分类器),通过反向传播不断地更新调整对抗样本,也是不断的减小损失函数。关于loss函数这篇有讲到:来自人类的恶意:对抗攻击

基于优化的对抗样本

基于优化方法的对抗样本生成与深度学习训练过程类似,核心代码如下:
optimizer = torch.optim.Adam([img])(优化的对象是img)
代码参考自:AI安全之对抗样本

# 攻击的模型是alexnet
model = models.alexnet(pretrained=True).to(device).eval()
# 先预测出这张img的标签,需要先取他的数据再转移到cpu再转成numpy
label = np.argmax(model(img).data.cpu().numpy())
print("label={}".format(label))
# 图像数据梯度可以获取
img.requires_grad = True# 设置为不保存梯度值 自然也无法修改
for param in model.parameters():param.requires_grad = False# 注意这里,和一般的深度学习训练不一样
optimizer = torch.optim.Adam([img],lr=0.01)
loss_func = torch.nn.CrossEntropyLoss()epochs = 100
target = 288 # 定向攻击的标签
target = Variable(torch.Tensor([float(target)]).to(device).long())
for epoch in range(epochs):# 梯度清零optimizer.zero_grad()# forward + backwardoutput = model(img)loss = loss_func(output, target)label = np.argmax(output.data.cpu().numpy())print("epoch={} loss={} label={}".format(epoch, loss, label))# 如果定向攻击成功if label == target:breakloss.backward()optimizer.step()

FGSM

之前是用优化的方法,现在考虑的是用梯度来生成对抗样本——Fast Gradient Sign Method(FGSM)
论文链接:Explaining andHarnessing Adversarial Examples
论文笔记链接:click here

代码参考于pytorch官网:fgsm_tutoriall

1.首先导入相关包和参数设置:

预训练模型下载:lenet_mnist_model.pth
也可以通过训练文件重新训练模型:example-mnist

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
# 定义扰动值列表
epsilons = [0, .05, .1, .15, .2, .25, .3]
# 预训练模型路径(训练好的模型文件的存储路径)
pretrained_model = "checkpoint/lenet_mnist_model.pth"
device = torch.device("cuda" if  torch.cuda.is_available() else "cpu")

2.加载数据

采用MNIST测试集数据,batch_size=1

test_loader = torch.utils.data.DataLoader(datasets.MNIST('./datasets', train=False, download=True, transform=transforms.ToTensor()),batch_size=1,shuffle=True)

3.定义网络模型

# 定义LeNet模型
class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = nn.Conv2d(1, 10, kernel_size=5)self.conv2 = nn.Conv2d(10, 20, kernel_size=5)self.conv2_drop = nn.Dropout2d()self.fc1 = nn.Linear(320, 50)self.fc2 = nn.Linear(50, 10)def forward(self, x):x = F.relu(F.max_pool2d(self.conv1(x), 2))x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))x = x.view(-1, 320)x = F.relu(self.fc1(x))x = F.dropout(x, training=self.training)x = self.fc2(x)return F.log_softmax(x, dim=1)# 初始化网络
model = Net().to(device)# 加载已经预训练的模型
model.load_state_dict(torch.load(pretrained_model, map_location='cpu'))# 在评估模式下设置模型(Dropout层不被考虑)
model.eval()

4.定义攻击函数

FGSM论文中的公式:
perturbed_image=image+epsilon∗sign(data_grad)=x+ϵ∗sign(∇x​J(θ,x,y))perturbed\_image=image+epsilon∗sign(data\_grad)=x+ϵ∗sign(∇_ x​J(θ,x,y))perturbed_image=image+epsilon∗sign(data_grad)=x+ϵ∗sign(∇x​​J(θ,x,y))

def fgsm_attack(image, epsilon, data_grad):""":param image: 需要攻击的图像:param epsilon: 扰动值的范围:param data_grad: 图像的梯度:return: 扰动后的图像"""# 收集数据梯度的元素符号sign_data_grad = data_grad.sign()# 通过调整输入图像的每个像素来创建扰动图像perturbed_image = image + epsilon*sign_data_grad# 添加剪切以维持[0,1]范围perturbed_image = torch.clamp(perturbed_image, 0, 1)# 返回被扰动的图像return perturbed_image

5.开始攻击

def test( model, device, test_loader, epsilon ):# 精度计数器correct = 0adv_examples = []# 循环遍历测试集中的所有示例for data, target in test_loader:# 把数据和标签发送到设备data, target = data.to(device), target.to(device)# 设置张量的requires_grad属性,这对于攻击很关键data.requires_grad = True# 通过模型前向传递数据output = model(data)init_pred = output.max(1, keepdim=True)[1] # get the index of the max log-probability# 如果初始预测是错误的,不打断攻击,继续if init_pred.item() != target.item():continue# 计算损失loss = F.nll_loss(output, target)# 将所有现有的渐变归零model.zero_grad()# 计算后向传递模型的梯度loss.backward()# 收集datagraddata_grad = data.grad.data# 唤醒FGSM进行攻击perturbed_data = fgsm_attack(data, epsilon, data_grad)# 重新分类受扰乱的图像output = model(perturbed_data)# 检查是否成功final_pred = output.max(1, keepdim=True)[1] # get the index of the max log-probabilityif final_pred.item() == target.item():correct += 1# 保存0 epsilon示例的特例if (epsilon == 0) and (len(adv_examples) < 5):adv_ex = perturbed_data.squeeze().detach().cpu().numpy()adv_examples.append( (init_pred.item(), final_pred.item(), adv_ex) )else:# 稍后保存一些用于可视化的示例if len(adv_examples) < 5:adv_ex = perturbed_data.squeeze().detach().cpu().numpy()adv_examples.append( (init_pred.item(), final_pred.item(), adv_ex) )# 计算这个epsilon的最终准确度final_acc = correct/float(len(test_loader))print("Epsilon: {}\tTest Accuracy = {} / {} = {}".format(epsilon, correct, len(test_loader), final_acc))# 返回准确性和对抗性示例return final_acc, adv_examples

输出:

6.可视化测试

# 对每个epsilon运行测试
for eps in epsilons:acc, ex = test(model, device, test_loader, eps)accuracies.append(acc)examples.append(ex)plt.figure(figsize=(5,5))
plt.plot(epsilons, accuracies, "*-")
plt.yticks(np.arange(0, 1.1, step=0.1))
plt.xticks(np.arange(0, .35, step=0.05))
plt.title("Accuracy vs Epsilon")
plt.xlabel("Epsilon")
plt.ylabel("Accuracy")
plt.show()# 在每个epsilon上绘制几个对抗样本的例子
cnt = 0
plt.figure(figsize=(8,10))
for i in range(len(epsilons)):for j in range(len(examples[i])):cnt += 1plt.subplot(len(epsilons),len(examples[0]),cnt)plt.xticks([], [])plt.yticks([], [])if j == 0:plt.ylabel("Eps: {}".format(epsilons[i]), fontsize=14)orig,adv,ex = examples[i][j]plt.title("{} -> {}".format(orig, adv))plt.imshow(ex, cmap="gray")
plt.tight_layout()
plt.show()

【对抗攻击代码实战】对抗样本的生成——FGSM相关推荐

  1. RNN LSTM GRU 代码实战 ---- 简单的文本生成任务

    RNN LSTM GRU 代码实战 ---- 简单的文本生成任务 import torch if torch.cuda.is_available():# Tell PyTorch to use the ...

  2. 一文尽览!文本对抗攻击基础、前沿及相关资源

    // 导读 深度学习的安全性问题已经逐渐被学术界.工业界所认识到并且重视,就文本领域而言,垃圾邮件检测.有害文本检测.恶意软件查杀等实用系统已经大规模部署了深度学习模型,安全性对于这些系统尤为重要. ...

  3. 文本对抗攻击入坑宝典

    文 | 阿毅 编 | 小轶 如果是咱家公众号的忠实粉丝就一定还记得之前咱家一篇关于NLP Privacy的文章,不出意外的话,你们是不是现在依然还担心自己的隐私被输入法窃取而瑟瑟发抖.所以,我们又来了 ...

  4. 《对抗攻击与防御分类方法综述》阅读笔记20220401

    <对抗攻击与防御分类方法综述> A Review of Adversarial Attack and Defense for Classification Methods DOI:10.1 ...

  5. 有关对抗攻击的论文整理

    对抗攻击 对抗攻击的概念 对抗攻击原理 对抗攻击方法 基于目标模型损失函数 基于目标模型网络结构 基于目标模型预测分数 基于目标模型预测决策 无需 训练替代模型 对抗攻击防御 对抗攻击实例 部分引用, ...

  6. AI新方向:对抗攻击

    https://www.toutiao.com/a6624300476227650051/ 2018-11-16 11:49:03 在调查近几年 AI 领域的过程中,我发现近几年对抗攻击的概念逐渐出现 ...

  7. L0对抗攻击JSMA的算法盘点

    ©PaperWeekly 原创 · 作者|孙裕道 学校|北京邮电大学博士生 研究方向|GAN图像生成.情绪对抗样本生成 引言 JSMA 是非常著名的对抗攻击,它第首次在对抗攻击中引入了 的度量方式, ...

  8. 黑盒攻击很难?元学习提高黑盒对抗攻击成功率

    关注公众号,发现CV技术之美 本文分享论文『Boosting Black-Box Adversarial Attacks with Meta Learning』,元学习提高黑盒对抗攻击. 详细信息如下 ...

  9. 轻易致盲分类器!普渡大学提出光学对抗攻击算法:OPAD,想法奇特,性能有效!...

    关注公众号,发现CV技术之美 今日分享一篇AI对抗攻击领域论文『Optical Adversarial Attack』,由普渡大学学者提出:OPAD,是对人为刻意制造的光照分布对目标分类器进行攻击的研 ...

  10. 论智能问答中的对抗攻击及防御策略

    大数据产业创新服务媒体 --聚焦数据 · 改变商业 编者按 深度学习模型应用广泛,但其自身有一定的"脆弱性",即模型输入的微小改动,在不影响人判断的情况下,可能使模型的输出出错,这 ...

最新文章

  1. 支持向量机(SVM)
  2. windows下安装ubuntu 12.04---利用ubuntu的iso包中的wubi.exe工具安装
  3. php二叉树 排列,PHP 如何实现用户二叉树排序需求
  4. Spirng MVC +Velocity 表单绑定命令对象
  5. 2022年全球及中国智慧消防栓行业与十四五投资建议与竞争策略研究报告
  6. python 插值_Python求解插值、拟合和微分方程问题
  7. hdfs深入:10、hdfs的javaAPI操作
  8. 中国程序员如何去 Facebook 工作?
  9. 第 9 章 代码审查制度
  10. springcloud工作笔记105---springboot2.x实现优雅的关闭服务
  11. angular表单验证
  12. 【前端】js代码模拟用户键盘鼠标输入
  13. java教程张孝祥_张孝祥Java教程 笔记 1
  14. JavaWeb面试题 有用
  15. PHP基于gettexts实现多语言i18n利用PoEdit
  16. 模块化机房建设指导书_模块化机房建设方案
  17. HTML5 2D平台游戏开发#8指令技
  18. 计算机一级考试ppt知识点,计算机一级考试考点:PPT演示文稿
  19. CSS中绝对定位导致页面混乱的原因以及解决办法
  20. 基于Android的学生信息管理大作业

热门文章

  1. 自动化测试验证码代码常用的四种方式
  2. 怎么将两个html合并一个文件,如何将两页pdf合成一页?(如何将两个pdf文件合并成一个)...
  3. 阿里巴巴常用的12个后端开发工具
  4. 第2章-系统控制原理 -> 李雅普诺夫稳定性分析
  5. 壁面函数matlab,Y+的查看及FLUENT壁面函数的选择
  6. Kettle下载和安装
  7. 线性调频信号(LFM)时域与频域分析
  8. 用python生成一段关于文字的二维码(关于刷网课的)
  9. JAVA实现杨辉三角的三种方式
  10. 几款win10下的小工具:截图、录屏、置顶窗口