华为开源自研AI框架昇思MindSpore应用实践:FGSM网络对抗攻击
目录
- 一、环境准备
- 1.进入ModelArts官网
- 2.使用CodeLab体验Notebook实例
- 二、对抗样本定义
- 三、攻击方法
- 快速梯度符号攻击(FGSM)
- 四、数据处理
- 五、训练LeNet网络
- 六、实现FGSM
- 七、运行攻击
近年来随着数据、计算能力、理论的不断发展演进,深度学习在图像、文本、语音、自动驾驶等众多领域都得到了广泛应用。与此同时,人们也越来越关注各类模型在使用过程中的安全问题,因为AI模型很容易受到外界有意无意的攻击而产生错误的结果。
在本案例中,我们将以梯度符号攻击(Fast Gradient Sign Method,FGSM)为例,演示此类攻击是如何误导模型的。
如果你对MindSpore感兴趣,可以关注昇思MindSpore社区
一、环境准备
1.进入ModelArts官网
云平台帮助用户快速创建和部署模型,管理全周期AI工作流,选择下面的云平台以开始使用昇思MindSpore,可以在昇思教程中进入ModelArts官网
选择下方CodeLab立即体验
等待环境搭建完成
2.使用CodeLab体验Notebook实例
下载NoteBook样例代码,.ipynb
为样例代码
选择ModelArts Upload Files上传.ipynb
文件
选择Kernel环境
在右侧切换规格为GPU架构
切换成功显示如下
进入昇思MindSpore官网,点击上方的安装
获取安装命令
回到Notebook中,在第一块代码前加入三块命令
pip install --upgrade pip
conda install mindspore-gpu=1.9.0 cudatoolkit=10.1 -c mindspore -c conda-forge
pip install mindvision
依次运行即可
二、对抗样本定义
Szegedy在2013年最早提出对抗样本的概念:
在原始样本处加入人类无法察觉的微小扰动,使得深度模型性能下降,这种样本即对抗样本。如下图所示,本来预测为“panda”的图像在添加噪声之后,模型就将其预测为“gibbon”,右边的样本就是一个对抗样本:
图片来自Explaining and Harnessing Adversarial Examples。
三、攻击方法
对模型的攻击方法在宏观层面可以从如下两个方面进行分类:
1.攻击者掌握的信息多少:
- 白盒攻击:攻击者具有对模型的全部知识和访问权限,包括模型结构、权重、输入、输出,在产生对抗性攻击数据的过程中能够与模型系统有所交互。由于模型的信息完全被攻击者掌握,攻击者可以针对被攻击模型的特性设计特定的攻击算法。
- 黑盒攻击:与白盒攻击相反,攻击者仅具有关于模型的有限知识。攻击者对模型的结构权重一无所知,仅了解部分输入输出。
2.攻击者的目的:
- 有目标的攻击:攻击者将模型结果误导为特定分类。
- 无目标的攻击:攻击者只想产生错误结果,而不在乎新结果是什么。
本案例中用到的梯度符号攻击FGSM是一种白盒攻击方法,既可以是有目标也可以是无目标攻击。
更多的模型安全功能可参考MindArmour,现已支持FGSM、LLC、Substitute
Attack等多种对抗样本生成方法,并提供对抗样本鲁棒性模块、Fuzz Testing模块、隐私保护与评估模块,帮助用户增强模型安全性。
快速梯度符号攻击(FGSM)
分类网络的训练会定义一个损失函数,用于衡量模型输出值与样本真实标签的距离,通过反向传播计算模型梯度,梯度下降更新网络参数,减小损失值,提升模型精度。
FGSM(Fast Gradient Sign
Method)是一种简单高效的对抗样本生成方法。不同于正常分类网络的训练过程,FGSM通过计算loss对于输入的梯度为
∇xJ(θ,x,y),梯度表征了loss对于输入变化的敏感性。然后在原始输入加上上述梯度,使得loss增大,导致模型对于改造后的输入样本分类效果变差,从而达到攻击效果。
对抗样本的另一要求是生成样本与原始样本的差异要尽可能的小,使用sign函数可以使得修改图片时尽可能的均匀。
产生的对抗扰动用公式可以表示为:
公式 | 序号 |
---|---|
η=εsign(∇xJ(θ)) | (1) |
对抗样本可公式化为:
公式 | 序号 |
---|---|
x′=x+εsign(∇xJ(θ,x,y)) | (2) |
- x:正确分类为“Pandas”的原始输入图像。
- y:是x的输出。
- θ:模型参数。
- ε:攻击系数。
- J(θ,x,y):训练网络的损失。
- ∇xJ(θ):反向传播梯度。
四、数据处理
本案例将使用MNIST训练一个精度达标的LeNet网络,然后运行上文中所提到的FGSM攻击方法,达到欺骗网络模型,让模型实现错误分类的效果。
以下示例代码将数据集下载并解压到指定位置。
from mindvision.dataset import Mnist# 下载并处理MNIST数据集
download_train = Mnist(path="./mnist", split="train", shuffle=True, download=True)
download_eval = Mnist(path="./mnist", split="test", download=True)dataset_train = download_train.run()
dataset_eval = download_eval.run()
下载的数据集文件的目录结构如下:
./mnist
├── test
│ ├── t10k-images-idx3-ubyte
│ └── t10k-labels-idx1-ubyte
└── train├── train-images-idx3-ubyte└── train-labels-idx1-ubyte
五、训练LeNet网络
实验中使用LeNet作为演示模型完成图像分类,这里先定义网络并使用MNIST数据集进行训练。
定义LeNet网络:
from mindvision.classification.models import lenetnetwork = lenet(num_classes=10, pretrained=False)
定义优化器与损失函数:
import mindspore.nn as nnnet_loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction='mean')
net_opt = nn.Momentum(network.trainable_params(), learning_rate=0.01, momentum=0.9)
定义网络参数:
import mindspore as ms
config_ck = ms.CheckpointConfig(save_checkpoint_steps=1875, keep_checkpoint_max=10)
ckpoint = ms.ModelCheckpoint(prefix="checkpoint_lenet", config=config_ck)
训练LeNet网络:
from mindvision.engine.callback import LossMonitormodel = ms.Model(network, loss_fn=net_loss, optimizer=net_opt, metrics={'accuracy'})
model.train(5, dataset_train, callbacks=[ckpoint, LossMonitor(0.01, 1875)])
测试此时的网络,可以观察到LeNet已经达到比较高的精度:
acc = model.eval(dataset_eval)
print("{}".format(acc))
六、实现FGSM
在得到精准的LeNet网络之后,下面将会采用FSGM攻击方法,在图像中加载噪声后重新进行测试。
先通过损失函数求取反向梯度:
class WithLossCell(nn.Cell):"""包装网络与损失函数"""def __init__(self, network, loss_fn):super(WithLossCell, self).__init__()self._network = networkself._loss_fn = loss_fndef construct(self, data, label):out = self._network(data)return self._loss_fn(out, label)class GradWrapWithLoss(nn.Cell):"""通过loss求反向梯度"""def __init__(self, network):super(GradWrapWithLoss, self).__init__()self._grad_all = ops.composite.GradOperation(get_all=True, sens_param=False)self._network = networkdef construct(self, inputs, labels):gout = self._grad_all(self._network)(inputs, labels)return gout[0]
然后根据公式(2)实现FGSM攻击:
import numpy as npclass FastGradientSignMethod:"""实现FGSM攻击"""def __init__(self, network, eps=0.07, loss_fn=None):# 变量初始化self._network = networkself._eps = epswith_loss_cell = WithLossCell(self._network, loss_fn)self._grad_all = GradWrapWithLoss(with_loss_cell)self._grad_all.set_train()def _gradient(self, inputs, labels):# 求取梯度out_grad = self._grad_all(inputs, labels)gradient = out_grad.asnumpy()gradient = np.sign(gradient)return gradientdef generate(self, inputs, labels):# 实现FGSMinputs_tensor = ms.Tensor(inputs)labels_tensor = ms.Tensor(labels)gradient = self._gradient(inputs_tensor, labels_tensor)# 产生扰动perturbation = self._eps*gradient# 生成受到扰动的图片adv_x = inputs + perturbationreturn adv_xdef batch_generate(self, inputs, labels, batch_size=32):# 对数据集进行处理arr_x = inputsarr_y = labelslen_x = len(inputs)batches = int(len_x / batch_size)res = []for i in range(batches):x_batch = arr_x[i*batch_size: (i + 1)*batch_size]y_batch = arr_y[i*batch_size: (i + 1)*batch_size]adv_x = self.generate(x_batch, y_batch)res.append(adv_x)adv_x = np.concatenate(res, axis=0)return adv_x
再次处理MINIST数据集中测试集的图片:
images = []
labels = []
test_images = []
test_labels = []
predict_labels = []ds_test = dataset_eval.create_dict_iterator(output_numpy=True)for data in ds_test:images = data['image'].astype(np.float32)labels = data['label']test_images.append(images)test_labels.append(labels)pred_labels = np.argmax(model.predict(ms.Tensor(images)).asnumpy(), axis=1)predict_labels.append(pred_labels)test_images = np.concatenate(test_images)
predict_labels = np.concatenate(predict_labels)
true_labels = np.concatenate(test_labels)
七、运行攻击
由FGSM攻击公式中可以看出,攻击系数ε越大,对梯度的改变就越大。当ε 为零时则攻击效果不体现。
公式 | 序号 |
---|---|
η=εsign(∇xJ(θ)) | (3) |
现在先观察当ε为零时的攻击效果:
import mindspore.ops as opsfgsm = FastGradientSignMethod(network, eps=0.0, loss_fn=net_loss)
advs = fgsm.batch_generate(test_images, true_labels, batch_size=32)adv_predicts = model.predict(ms.Tensor(advs)).asnumpy()
adv_predicts = np.argmax(adv_predicts, axis=1)
accuracy = np.mean(np.equal(adv_predicts, true_labels))
print(accuracy)
再将ε设定为0.5,尝试运行攻击:
fgsm = FastGradientSignMethod(network, eps=0.5, loss_fn=net_loss)
advs = fgsm.batch_generate(test_images, true_labels, batch_size=32)adv_predicts = model.predict(ms.Tensor(advs)).asnumpy()
adv_predicts = np.argmax(adv_predicts, axis=1)
accuracy = np.mean(np.equal(adv_predicts, true_labels))
print(accuracy)
从上面的打印结果可以看出,此时LeNet模型的精度大幅降低。
下面演示受攻击照片现在的实际形态,可以看出图片只是发生了很小的变化,然而在精度测试中却严重下降:
import matplotlib.pyplot as plt
%matplotlib inlineadv_examples = np.transpose(advs[:10], [0, 2, 3, 1])
ori_examples = np.transpose(test_images[:10], [0, 2, 3, 1])plt.figure(figsize=(10, 3), dpi=120)
for i in range(10):plt.subplot(3, 10, i+1)plt.axis("off")plt.imshow(np.squeeze(ori_examples[i]))plt.subplot(3, 10, i+11)plt.axis("off")plt.imshow(np.squeeze(adv_examples[i]))
plt.show()
华为开源自研AI框架昇思MindSpore应用实践:FGSM网络对抗攻击相关推荐
- 华为开源自研AI框架昇思MindSpore应用实践:DCGAN生成漫画头像
目录 一.原理说明 1.GAN基础原理 2.DCGAN原理 二.环境准备 1.进入ModelArts官网 2.使用CodeLab体验Notebook实例 三.数据准备与处理 1.数据处理 四.创建网络 ...
- 华为开源自研AI框架昇思MindSpore模型体验:ModelZoo中的CRNN
目录 一.环境准备 1.进入ModelArts官网 2.使用CodeLab体验Notebook实例 二.脚本说明 三.数据集 四.训练过程 五.评估过程 六.推理过程 CRNN描述 CRNN是一种基于 ...
- 华为开源自研AI框架昇思MindSpore应用案例:Colorization自动着色
目录 一.环境准备 1.进入ModelArts官网 2.使用ModelArts体验实例 二.数据处理 数据准备 训练集可视化 构建网络 损失函数 三.模型实现 算法流程 模型训练 模型推理 总结 自动 ...
- 华为开源自研AI框架昇思MindSpore应用案例:SSD目标检测
目录 一.环境准备 1.进入ModelArts官网 2.使用CodeLab体验Notebook实例 二.环境准备 三.数据准备与处理 数据采样 数据集创建 四.模型构建 五.损失函数 六.Metric ...
- 华为开源自研AI框架MindSpore!自动微分、并行加持,一次训练,可多场景部署...
乾明 发自 凹非寺 量子位 报道 | 公众号 QbitAI 华为的开源AI框架,来了! 刚刚,华为宣布正式开源自研深度学习框架MindSpore,代码已经上线. MindSpore是一款支持端边云全 ...
- 华为AI框架昇思MindSpore三周年开发者生日会
- 华为AI计算框架昇思MindSpore零基础快速入门 (上)
一.基础介绍 门槛最低的深度学习引导 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/463019160MindSpore入门实践 - 知乎 (zhihu.c ...
- 论文速递 | 华为开源自研算法Disout | 中科院计算所GCN中文综述
点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作分享,不代表本公众号立场,侵权联系删除 转载于:机器之心 AI博士笔记系列推荐 周志华<机器学习>手 ...
- 最新案例 | 昇思MindSpore携手信大网御推出中原AI反诈骗创新解决方案,为全民反诈筑牢防火墙
近日,河南信大网御科技有限公司的中原人工智能反诈骗创新解决方案与华为Atlas 800训练服务器和全场景AI框架昇思MindSpore完成兼容性测试.该方案基于昇腾AI基础软硬件平台,能够在短时间内对 ...
最新文章
- 《自然》发布最新科研指数:中美差距缩小,中科院居全球机构首位
- Storage Options
- 微信小程序使用高德地图API获取准确定位地址描述
- 辽宁活跃ip段_有泰国女排影子!激情辽宁女排,打出快乐排球,输了比赛赢了球迷...
- 记一次线上Java程序导致服务器CPU占用率过高的问题排除过程
- Pocket PC/Smartphone软件安装包之制作DIY
- C#DateTime.ToString格式化时间字符串
- java 自定义登录态_java – 自定义HTTP状态代码
- 扫描控件Web在线Applet
- pyqt5 -——菜单和工具栏
- python 初级笔记
- wireless 大作业 linux,Wire/Wireless Network Configuration in Linux
- SQL Server数据库 - 安装教程
- 深入浅出Python机器学习3——K最近邻算法
- 微型计算机三部分基本组成,微型计算机的基本组成-电脑自学网
- C语言实现图片找茬,[创意心得]大家来找茬(C语言)
- webdriver爬虫#document问题
- Android Studio 插件-Android Styler 的使用
- windows10专业版 docker desktop 安装失败
- 新一代 OIer 的快速入门命令行教程