文章目录

  • 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(∇x​J(θ,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)相关推荐

  1. 对抗样本生成算法复现代码解析:FGSM和DeepFool

    参考链接: https://www.jianshu.com/p/72c072551e10 论文地址: FGSM:地址 DeepFool:地址 导入包 import numpy as np import ...

  2. 【AI安全之对抗样本】入门知识

    文章目录 00 前言 01 深度学习脆弱性 1.1 偷取模型 1.2 数据投毒 02 对抗样本(adversarial examples) 2.1 对抗样本定义 2.2 对抗样本原理 2.3 针对图像 ...

  3. 对抗样本之MIM原理coding

    目录 1 引言 2 MIM原理 3 coding 3.1 训练模型 3.2 MIM对抗样本生成 3.3 可视化展示 附录 1 引言 MIM,即基于动量的基本迭代法.在BIM上加了动量的操作.不会BIM ...

  4. OpenAI详细解析:攻击者是如何使用「对抗样本」攻击机器学习的

    原文来源:OpenAI 作者: Ian Goodfellow.Nicolas Papernot.Sandy Huang.Yan Duan.Pieter Abbeel.Jack Clark. 「雷克世界 ...

  5. FGSM生成对抗样本(MNIST数据集)Pytorch代码实现与实验分析

    文章目录 1 实验目标 2 实验流程 2.1 搭建LeNet训练,测试准确度 2.2 fgsm生成对抗样本 2.3 探究不同epsilon值对分类准确度的影响 3 实验结果 4 完整代码 1 实验目标 ...

  6. [当人工智能遇上安全] 1.人工智能真的安全吗?浙大团队外滩大会分享AI对抗样本技术

    您或许知道,作者后续分享网络安全的文章会越来越少.但如果您想学习人工智能和安全结合的应用,您就有福利了,作者将重新打造一个<当人工智能遇上安全>系列博客,详细介绍人工智能与安全相关的论文. ...

  7. [论文阅读] (04) 人工智能真的安全吗?浙大团队外滩大会分享AI对抗样本技术

    外滩大会 AI安全-智能时代的攻守道 Deep Learning Security: From the NLP Perspective 浙江大学 <秀璋带你读论文>系列主要是督促自己阅读优 ...

  8. 新书推荐 |《AI安全之对抗样本入门》

    新书推荐 <AI安全之对抗样本入门> 点击上图了解及购买 AI安全三部曲作者兜哥又一力作,对抗样本的入门知识,AI安全必备. 内容简介 本书系统介绍对抗样本的基本原理,从相关的背景知识开始 ...

  9. 一个符号引发的讨论,对抗攻击算法FGSM的纯粹版:FGNS,附代码

    关注公众号,发现CV技术之美 ▊ 1 引言 是基于梯度迭代攻击中生成对抗样本的开创性工作.我第一次接触相关工作的时候,给我困惑最多的就是论文中为什么要给梯度加上这个符号函数,因为这会导致生成的对抗扰动 ...

  10. PyTorch FGSM Attack 对抗样本生成

    要阅读 带有插图的文章版本 请前往 http://studyai.com/pytorch-1.4/beginner/fgsm_tutorial.html 如果你正在阅读这篇文章,希望你能体会到一些机器 ...

最新文章

  1. win32 wmi编程获取系统信息
  2. 计算机科学概论ppt免费,计算机科学概论(第9版)Lecture_slide07.ppt
  3. C# Marshal类基本概念和入门示例程序
  4. appcan 微信支付
  5. SON Web Token设计单点登录系统
  6. corssover linux运行无效,使用 CrossOver 在 Linux运行 Windows 软件(金测OK)
  7. 邮箱附件、QQ、微信等社交工具大文件传输解决方案
  8. VMware网络连接模式—桥接、NAT以及仅主机模式的详细介绍和区别
  9. 一个网卡设备配置两个不同网段的IP地址
  10. 微信小程序-制作购物车
  11. 简单的开源日志Log4D delphi 6---delphi xe 10全可用
  12. KUKA 机器人仿真软件OfficeLite
  13. 字符识别,口算题识别论文小梗概
  14. ps快捷图标在哪个文件夹_ps安装包在哪个文件夹
  15. UI设计师必备的五款界面设计工具
  16. hadoop集群搭建详述
  17. (详细易懂)一篇文章让你读懂到底什么是Ajax
  18. 日活、周活(周重活)、月活 统计
  19. jdk版本升级、技术选型
  20. 简单的图片轮播器(一):一个关于仿flash的图片轮换器

热门文章

  1. 伍德里奇计量经济学导论pdf_伍德里奇 计量经济学导论(第六版) 第3章
  2. Git 提交代码步骤总结
  3. hijson,64位百度云永久免费,这是一个爱分享的世界
  4. 怎样把两个HTML合一起,将两个 PDF 页面合并在一起
  5. 当当网图书爬虫与数据分析
  6. UG NX 12 草图尺寸小数点怎么更改?
  7. axure原型设计:手机版可视化图表
  8. Linux-----信号量
  9. php ziparchive类,PHP Zip ZipArchive 类_编程学问网
  10. Centos中安装svnserver