【AI安全】对抗样本之FGSM的代码实现(TensorFlow2)
文章目录
- 1. 简介
- 2. 使用TensorFlow2实现FGSM
- 2.1 导包
- 2.2 数据准备
- 2.3搭建MLP模型并训练
- 2.4 实现Fast Gradient Sign Method
- 2.5 定义绘图函数
- 2.6 在测试集上添加扰动查看效果
- 2.7 查看准确率变化
1. 简介
FGSM(Fast Gradient Sign Method)由Ian J. Goodfellow等人于2015年提出,论文地址【https://arxiv.org/abs/1412.6572】,是最早也是最受欢迎的欺骗神经网络的攻击之一。
对抗样本是创建的专门输入,目的是使神经网络分类器混淆,从而导致对给定输入错误地分类。
如图所示,攻击者对原始熊猫图像添加了小的扰动,导致了模型将这张图像标记为长臂猿。
FGSM利用神经网络的梯度来创建一个对抗样本。对于输入的图像,该方法使用损失相对于输入图像的梯度来创建一个新的图像,使损失最大化。
adv_x=x+ϵ∗sign(∇xJ(θ,x,y))adv\_x = x + \epsilon * sign(\nabla_xJ(\theta,x,y)) adv_x=x+ϵ∗sign(∇xJ(θ,x,y))
- adv_x:生成的对抗样本图片
- x:原始图片
- y:原始图片的真实标签
- ϵ\epsilonϵ:可以理解为学习率,用来控制添加扰动的大小
- θ\thetaθ:模型参数
- J:损失
2. 使用TensorFlow2实现FGSM
数据集为MNIST手写数字,使用FGSM对手写数字图片进行修改,实现对神经网络分类模型的攻击。
2.1 导包
import tensorflow as tf # 2.3
import matplotlib.pyplot as plt
import numpy as np
import tensorflow.keras.datasets.mnist as mnist
2.2 数据准备
# 数据导入,获取训练集和测试集
(train_image, train_labels), (test_image, test_labels) = tf.keras.datasets.mnist.load_data()
# train_image.shape,train_labels.shape为(60000, 28, 28), (60000,)train_image = (train_image - 127.5)/127.5 # 把0-255的数据范围变为-1到1之间
test_image = (test_image - 127.5)/127.5 # 把0-255的数据范围变为-1到1之间# 增加通道维度
train_image = tf.expand_dims(train_image, -1)
test_image = tf.expand_dims(test_image, -1)
# TensorShape([60000, 28, 28, 1]), (60000,)# 类型转换
train_image = tf.cast(train_image, tf.float32)
test_image = tf.cast(test_image, tf.float32)
train_labels = tf.cast(train_labels, tf.int64)
test_labels = tf.cast(test_labels, tf.int64)# 创建Dataset
dataset = tf.data.Dataset.from_tensor_slices((train_image, train_labels)).shuffle(60000).batch(256)
test_dataset = tf.data.Dataset.from_tensor_slices((test_image, test_labels)).batch(256)
2.3搭建MLP模型并训练
# 模型搭建
model = tf.keras.Sequential([tf.keras.layers.Flatten(input_shape=(28, 28, 1)), tf.keras.layers.Dense(128, activation='relu'),tf.keras.layers.Dense(64, activation='relu'),tf.keras.layers.Dense(10,activation='softmax')
])
optimizer = tf.keras.optimizers.Adam()
loss_func = tf.keras.losses.SparseCategoricalCrossentropy()
model.compile(optimizer=optimizer,loss=loss_func,metrics=['acc'])
history = model.fit(dataset,validation_data=test_dataset,epochs=10) # 返回字典类型的数据 其中记录了准确率和损失的信息
测试集上的准确率可达到97.6%
2.4 实现Fast Gradient Sign Method
loss_object = tf.keras.losses.SparseCategoricalCrossentropy()
def create_adversarial_pattern(input_image, input_label):with tf.GradientTape() as tape:tape.watch(input_image)prediction = model(input_image)loss = loss_object(input_label, prediction)gradient = tape.gradient(loss, input_image)# 对梯度使用sign函数,创建扰动signed_grad = tf.sign(gradient)return signed_grad
测试上述函数,查看扰动:
# test_image:测试集图片(1万张)
# test_labels:测试集标签
perturbations = create_adversarial_pattern(test_image, test_labels)
# 查看第一个扰动
plt.imshow(perturbations[0] * 0.5 + 0.5); # [-1, 1] -> [0,1]
2.5 定义绘图函数
用于查看原图片模型预测的结果和扰动之后的结果对比
# image:原始图片集合
# label:原始图片模型预测的标签
# adv_label:添加扰动后模型预测的标签
# num:每次绘图的数量
def display_images(image, label,adv_label,num=10):fig = plt.figure(figsize=(2*num,3)) # figsize:指定figure的宽和高,单位为英寸for i in range(num): # pre_image的shape的第一个维度就是个数,这里是numplt.subplot(1,num,i+1) # 几行几列的 第i+1个图片(从1开始)plt.imshow((image[i,:,:,:] + 1)/2) # 加1除2: 将生成的-1~1的图片弄到0-1之间,plt.title('{} -> {}'.format(label[i],adv_label[i]))plt.axis('off') # 不要坐标plt.show()
2.6 在测试集上添加扰动查看效果
# 在不同的epsilons进行测试
epsilons = [0,0.05,0.10,0.15,0.20,0.25,0.30]
adv_acc_list = []
for i, eps in enumerate(epsilons):print("epsilons = {}:".format(eps))# 获取原始图片的预测结果test_image = tf.clip_by_value(test_image, -1, 1)predict_label = model.predict(test_image)predict_label = np.array([np.argmax(i) for i in predict_label])# 生成对抗样本,并获取预测结果adv_image = test_image + eps*perturbationsadv_image = tf.clip_by_value(adv_image, -1, 1)adv_predict_label = model.predict(adv_image)adv_predict_label = np.array([np.argmax(i) for i in adv_predict_label])# 在对抗样本集合中评估模型score = model.evaluate(adv_image,test_labels,verbose=0)adv_acc_list.append(score[1])# 绘图display_images(adv_image,predict_label,adv_predict_label)
2.7 查看准确率变化
plt.title("The Accuracy of Adversarial Samples")
plt.xlabel("epsilons")
plt.ylabel("acc")
plt.plot(epsilons,adv_acc_list)
GitHub地址:FGSM_TensorFlow2_mnist
参考资料:
https://tensorflow.google.cn/tutorials/generative/adversarial_fgsm?hl=zh-cn
【AI安全】对抗样本之FGSM的代码实现(TensorFlow2)相关推荐
- 对抗样本生成算法复现代码解析:FGSM和DeepFool
参考链接: https://www.jianshu.com/p/72c072551e10 论文地址: FGSM:地址 DeepFool:地址 导入包 import numpy as np import ...
- 【AI安全之对抗样本】入门知识
文章目录 00 前言 01 深度学习脆弱性 1.1 偷取模型 1.2 数据投毒 02 对抗样本(adversarial examples) 2.1 对抗样本定义 2.2 对抗样本原理 2.3 针对图像 ...
- 对抗样本之MIM原理coding
目录 1 引言 2 MIM原理 3 coding 3.1 训练模型 3.2 MIM对抗样本生成 3.3 可视化展示 附录 1 引言 MIM,即基于动量的基本迭代法.在BIM上加了动量的操作.不会BIM ...
- OpenAI详细解析:攻击者是如何使用「对抗样本」攻击机器学习的
原文来源:OpenAI 作者: Ian Goodfellow.Nicolas Papernot.Sandy Huang.Yan Duan.Pieter Abbeel.Jack Clark. 「雷克世界 ...
- FGSM生成对抗样本(MNIST数据集)Pytorch代码实现与实验分析
文章目录 1 实验目标 2 实验流程 2.1 搭建LeNet训练,测试准确度 2.2 fgsm生成对抗样本 2.3 探究不同epsilon值对分类准确度的影响 3 实验结果 4 完整代码 1 实验目标 ...
- [当人工智能遇上安全] 1.人工智能真的安全吗?浙大团队外滩大会分享AI对抗样本技术
您或许知道,作者后续分享网络安全的文章会越来越少.但如果您想学习人工智能和安全结合的应用,您就有福利了,作者将重新打造一个<当人工智能遇上安全>系列博客,详细介绍人工智能与安全相关的论文. ...
- [论文阅读] (04) 人工智能真的安全吗?浙大团队外滩大会分享AI对抗样本技术
外滩大会 AI安全-智能时代的攻守道 Deep Learning Security: From the NLP Perspective 浙江大学 <秀璋带你读论文>系列主要是督促自己阅读优 ...
- 新书推荐 |《AI安全之对抗样本入门》
新书推荐 <AI安全之对抗样本入门> 点击上图了解及购买 AI安全三部曲作者兜哥又一力作,对抗样本的入门知识,AI安全必备. 内容简介 本书系统介绍对抗样本的基本原理,从相关的背景知识开始 ...
- 一个符号引发的讨论,对抗攻击算法FGSM的纯粹版:FGNS,附代码
关注公众号,发现CV技术之美 ▊ 1 引言 是基于梯度迭代攻击中生成对抗样本的开创性工作.我第一次接触相关工作的时候,给我困惑最多的就是论文中为什么要给梯度加上这个符号函数,因为这会导致生成的对抗扰动 ...
- PyTorch FGSM Attack 对抗样本生成
要阅读 带有插图的文章版本 请前往 http://studyai.com/pytorch-1.4/beginner/fgsm_tutorial.html 如果你正在阅读这篇文章,希望你能体会到一些机器 ...
最新文章
- win32 wmi编程获取系统信息
- 计算机科学概论ppt免费,计算机科学概论(第9版)Lecture_slide07.ppt
- C# Marshal类基本概念和入门示例程序
- appcan 微信支付
- SON Web Token设计单点登录系统
- corssover linux运行无效,使用 CrossOver 在 Linux运行 Windows 软件(金测OK)
- 邮箱附件、QQ、微信等社交工具大文件传输解决方案
- VMware网络连接模式—桥接、NAT以及仅主机模式的详细介绍和区别
- 一个网卡设备配置两个不同网段的IP地址
- 微信小程序-制作购物车
- 简单的开源日志Log4D delphi 6---delphi xe 10全可用
- KUKA 机器人仿真软件OfficeLite
- 字符识别,口算题识别论文小梗概
- ps快捷图标在哪个文件夹_ps安装包在哪个文件夹
- UI设计师必备的五款界面设计工具
- hadoop集群搭建详述
- (详细易懂)一篇文章让你读懂到底什么是Ajax
- 日活、周活(周重活)、月活 统计
- jdk版本升级、技术选型
- 简单的图片轮播器(一):一个关于仿flash的图片轮换器