华为开源自研AI框架昇思MindSpore应用实践:FGSM网络对抗攻击

news2025/1/16 17:06:29

目录

  • 一、环境准备
    • 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 lenet

network = lenet(num_classes=10, pretrained=False)

在这里插入图片描述
定义优化器与损失函数:


import mindspore.nn as nn

net_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 LossMonitor

model = 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 = network
        self._loss_fn = loss_fn

    def 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 = network

    def construct(self, inputs, labels):
        gout = self._grad_all(self._network)(inputs, labels)
        return gout[0]

在这里插入图片描述
然后根据公式(2)实现FGSM攻击:


import numpy as np

class FastGradientSignMethod:
    """实现FGSM攻击"""

    def __init__(self, network, eps=0.07, loss_fn=None):
        # 变量初始化
        self._network = network
        self._eps = eps
        with_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 gradient

    def generate(self, inputs, labels):
        # 实现FGSM
        inputs_tensor = ms.Tensor(inputs)
        labels_tensor = ms.Tensor(labels)
        gradient = self._gradient(inputs_tensor, labels_tensor)
        # 产生扰动
        perturbation = self._eps*gradient
        # 生成受到扰动的图片
        adv_x = inputs + perturbation
        return adv_x

    def batch_generate(self, inputs, labels, batch_size=32):
        # 对数据集进行处理
        arr_x = inputs
        arr_y = labels
        len_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 ops

fgsm = 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 inline

adv_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()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/155903.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

老板要求总部-分部异地组网,作为IT运维怎样才能避免踩坑?

最近在开年会,老板提出2023年要全面搭建30个分公司的广域网架构,总部和分公司网络实现统一管理。但是公司原有网络架构复杂,各分支又是不同运营商接入的现状,想要实现异地组网并不容易!然而,老板还不断提出…

好用的基于vue的组织架构图组件

都是基于vue的组织架构图,有支持vue2.x和vue3.x,可自行选择使用 一、vue-okr-tree(支持vue2) 文档地址:vue2-okr-tree 这个文档里面只有使用方法,不像vue3-tree-org里面有详细的介绍和安装引入教程 1.安装与引入 n…

第一章 spring框架概述

1.Spring框架概述*Spring是轻量级的开源的JavaEE框架*可以解决企业应用开发的复杂性*有两个核心的部分:IOC、AOPIOC:控制反转,把创建对象的过程交给Spring进行管理AOP:面向切面,不修改源代码的情况下进行功能的增加*Sp…

ThreadLocal与nheritableThreadLocal的区别及使用

ThreadLocal 多线程环境中,共享变量的并发修改常常导致线程同步问题,ThreadLocal可以存储线程私有的本地变量,从而使线程之间的变量相互隔离 因为ThreadLocal在线程执行的上下文可以传递变量的特性,所以可以很好的解决变量值传递…

PostgreSQL11 | pgsql建表、改表与删表

上一篇文章 PostgreSQL11 | pgadmin4基本使用http://t.csdn.cn/PKpde已经讲解了最简单的pgadmin的数据库创建、外键等可视化的操作,以及对应的pgsql语句 这一篇文章将讲解基础的pgsql语句 建表、改表与删表 目录 建表、改表与删表 创建数据表 单字段主键 多…

12.0、VMware-Linux部署springboot项目(图文超详细教程)

12.0、VMware-Linux部署springboot项目(图文超详细教程) 第一步:启动 Linux 进入 root 用户,打开终端 输入以下命令 -> 查看 Linux 中是否已经装有 jdk ; java -version 1.如果有,需要先将原来的 jdk …

ESP-IDF:使用multimap和vector容器给新员工随机分配部门并按照部门打印

例程&#xff1a; /* 创建5个员工&#xff0c;给5个员工随机分配部门&#xff0c;然后按照部门打印员工*/ #include #include #include #include <time.h> #define SALEDEPARTMENT 1 #define RDDEPARTMENT 2 #define MEDEPARTMENT 3 class worker { public: string …

10分钟做好 Bootstrap Blazor 的表格组件导出 Excel/Word/Html/Pdf

上篇: Bootstrap Blazor 实战 通用导入导出服务(Table组件) 1.新建工程 新建工程b14table dotnet new blazorserver -o b14table将项目添加到解决方案中&#xff1a; dotnet sln add b14table/b14table.csproj使用 nuget.org 进行 BootstrapBlazor 组件安装, FreeSql sqlite…

在线阅读网站|基于Springboot+Vue开发实现小说阅读网站

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

探索SpringMVC-HandlerAdapter之RequestMappingHandlerAdapter

前言 在RequestMappingHandlerAdapter的第一篇文章《探索SpringMVC-HandlerAdapter之RequestMappingHandlerAdapter-参数解析》我们从方法调用的角度提出了三个问题。前面两篇分别回答了方法入参、返回值处理这两个问题。而第三个问题则是由异常处理器负责的&#xff0c;不属于…

栈的讲解及实现(图解+代码/C语言)

今天为大家分享的是栈的模拟实现&#xff0c;本文主要讲解如何以数组的形式模拟实现&#xff0c;同时给出链表模拟实现栈的代码。 目录 图解栈的结构数组模拟栈的分步实现 创建并初始化入栈检测栈是否为空出栈获取栈顶元素获取栈内有效元素个数销毁栈 链表模拟实现栈 模拟思…

学习笔记:统计建模方法的比较分析

前言本文介绍了隐马尔可夫模型 (HMM)、最大熵马尔可夫模型 (MEMM) 和条件随机场 (CRF) 的比较分析。 HMM、MEMM 和 CRF 是三种流行的统计建模方法&#xff0c;通常应用于模式识别和机器学习问题。 让我们更详细地探讨每种方法。一、隐马尔可夫模型 (HMM)“隐藏”一词象征着只有…

node ~ zip压缩 文件加密

我们知道zip压缩,文件加密都是基于http的,下面我用用node实现着几个功能 zip压缩/解压 let zlib require(zlib); // 核心 let path require(path); let fs require(fs);// 压缩流 将1.txt压缩成1.txt.gz function gzip(source){ //source文件目录let gzip zlib.createGzi…

[Android]View的事件分发机制(源码解析)

目录 1.分发对象-MotionEvent 2.如何传递事件 1.传递流程 2.事件分发的源码解析 3.主要方法&#xff1a; 4.事件传递中listener 5.滑动冲突如何用事件分发处理 1.分发对象-MotionEvent 事件类型有&#xff1a; 1.ACTION_DOWN-----手指刚接触屏幕 2.ACTION_MOVE------手…

ASIC和FPGA,选择哪种设计比较好?

很多人都觉得同样都是写Verilog的&#xff0c;ASIC和FPGA其实并没有什么区别&#xff0c;其实并不是这样。那么ASIC和FPGA&#xff0c;选择哪种设计比较好&#xff1f;接下来IC修真院就来为大家细细分析。 ASIC (Application Specific Integrated Circuit)&#xff0c;即专用集…

盘点:2022年勒索金额超百万美元的攻击事件

1、哥斯达黎加政府 勒索赎金&#xff1a;2000万美元 这是2022年最受关注的攻击事件&#xff0c;因为这是一个国家首次宣布进入“国家紧急状态”以应对勒索软件攻击。调查显示&#xff0c;从4月中旬到5月初&#xff0c;27个政府机构成为第一波攻击活动的目标。国家财政部数TB数…

生物化学 SY001盘尼西林

盘尼西林的发现与作用原理 发现历史略 青霉素 青霉素Penicillinβ&#xff0d;内酰胺类抗生素&#xff08;β&#xff0d;lactams&#xff09;青霉素类抗生素水溶性好&#xff0c;血消除半衰期大多不超过2小时音译盘尼西林抑制胞壁粘肽合成酶&#xff0c;从而使细菌胞壁缺损…

MOS管的<控制电路>与<防反接电路>

为了方便记忆&#xff0c;我不管D与S&#xff0c;只说MOS管中的二极管方向。 另外G是控制端 这是一篇只管结果的文章&#xff0c;大家只要记住就行。 懂原理vs记结果 懂原理以分析一切现象&#xff0c;但每次使用都要分析一次&#xff1b; 记结果方便使用&#xff0c;但出现问题…

1.1.1-了解什么是计算机

文章目录1 什么是计算机2 计算机硬件3 计算机软件3.1 应用软件3.2 系统软件3.3 主流的电脑操作系统有哪些4 Linux系统4.1 Linux系统介绍4.1 Linux系统版本5 计算机语言5.1 机器语言5.2 汇编语言5.3 人机交互6 计算机操作命令-DOS命令1 什么是计算机 计算机全称&#xff1a;电子…

Java基础学习笔记(十二)—— 数据结构

数据结构1 栈2 队列3 数组4 链表5 二叉树5.1 二叉树5.2 二叉查找树5.3 平衡二叉树5.4 红黑树6 哈希表数据结构是计算机存储、组织数据的方式。是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下&#xff0c;精心选择的数据结构可以带来更高的运行或者存储效率。…