对抗样本指的是一个经过微小调整就可以让机器学习算法输出错误结果的输入样本。在图像识别中,可以理解为原来被一个卷积神经网络(CNN)分类为一个类(比如“熊猫”)的图片,经过非常细微甚至人眼无法察觉的改动后,突然被误分成另一个类(比如“长臂猿”)。

为什么这样轻微的扰动可以对神经网络造成如此大的影响,业界目前的共识认为这不是过拟合的结果,而是因为输入特征维度过高和模型的线性性质导致的。

深度模型本实确实是一个非常非线性的模型,但是模型的组成部分都是线性的,全连接网络的矩阵乘法是线性的,卷积网络的卷积计算也是计算点乘,同样也是线性的,哪怕是激活函数,看似是为了造成模型的非线性,但是目前主流的relu激活函数其实在部分区域内也是线性的。

因此,尽管深度模型整体呈非线性,但是其中的线性部分却依旧占了很大一部分,也正是如此,轻微的扰动经过网络的积累后会形成雪崩效应,从而对最终结果造成影响。

更具体的来说,在高维空间中,每个像素值即使改变很小,这些改变会通过线性模型的参数进行点乘累计造成很明显的变化。只要方向正确,即使数据上只是迈出了一小步,在特征空间上就是一大步,极大概率会跨越决策层。

Fast Gradient Sign Method (FGSM)

关键公式

x′=x+η
η =εsign(▽xJ(θ,x,y))

参数解释:

x -输入图象 ,x^′-输出图像, η-扰动

ε-步长,即扰动大小

Sign()-符号函数,J(θ,x,y)损失函数

θ -模型参数,x-模型输入,y-标签

主要思想

攻击成功的目标是使得模型分类错误,也即是利用加入扰动的样本使得模型的损失增大,而我们沿着梯度方向添加扰动,可以对分类结果产生最大的影响,因为我们一般是沿着梯度下降的方向去减小损失函数。

代码实现

from __future__ import absolute_import, division, print_function, unicode_literals
import warnings
warnings.filterwarnings('ignore')
import tensorflow as tf
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcParams['figure.figsize'] = (8, 8)
mpl.rcParams['axes.grid'] = False
#MobileNetV2# Let's load the pretained MobileNetV2 model and the ImageNet class names.
pretrained_model = tf.keras.applications.MobileNetV2(include_top=True, weights='imagenet')
pretrained_model.trainable = False# ImageNet labels
decode_predictions = tf.keras.applications.mobilenet_v2.decode_predictions# Helper function to preprocess the image so that it can be inputted in MobileNetV2
# 对图像预处理,使得图像可以输入MobileNetV2模型
def preprocess(image):image = tf.cast(x=image, dtype=tf.float32)image = image/255image = tf.image.resize(images=image, size=(224, 224))image = image[None, ...]return image# Helper function to extract labels from probability vector
# 得到图像真实标签 将图像输入模型并得到概率最高的分类结果
def get_imagenet_label(probs):return decode_predictions(probs, top=1)[0][0]#只获取第一个#image_path = tf.keras.utils.get_file(fname='YellowLabradorLooking_new.jpg', origin='https://storage.googleapis.com/download.tensorflow.org/example_images/YellowLabradorLooking_new.jpg')#image_path=tf.keras.utils.get_file('turtle.jpg','https://storage.googleapis.com/download.tensorflow.org/example_images/Green_Sea_Turtle_grazing_seagrass.jpg')
image_path = tf.keras.utils.get_file(fname='grace_hopper.jpg', origin='https://storage.googleapis.com/download.tensorflow.org/example_images/grace_hopper.jpg')
image_raw = tf.io.read_file(filename=image_path)image = tf.image.decode_image(contents=image_raw)#可以自动判定图像格式然后 decodeimage = preprocess(image)#预处理
image_probs = pretrained_model.predict(image)  #模型预测,输入测试集,输出预测结果---概率plt.figure()
plt.imshow(image[0])
_, image_class, class_confidence = get_imagenet_label(image_probs)#probs?
plt.title('{} : {:.2f}% Confidence'.format(image_class, class_confidence*100))#加入标签
plt.show()#计算梯度
loss_object = tf.keras.losses.CategoricalCrossentropy()#损失函数--交叉熵损失函数
#交叉熵是用来评估当前训练得到的概率分布与真实分布的差异情况。
#它刻画的是实际输出(概率)与期望输出(概率)的距离,也就是交叉熵的值越小,两个概率分布就越接近。def create_adversarial_pattern(input_image, input_label):with tf.GradientTape() as tape:  #梯度带tape.watch(tensor=input_image)            #watch函数把需要计算梯度的变量input_image加进来prediction = pretrained_model(input_image)loss = loss_object(input_label, prediction)# Get the gradients of the loss w.r.t to the input image.获取梯度gradient = tape.gradient(loss, input_image)# Get the sign of the gradients to create the perturbation.获取符号signed_grad = tf.sign(gradient) # 符号梯度攻击return signed_grad# Get the input label of the image.
labrador_retriever_index = 208
label = tf.one_hot(labrador_retriever_index, image_probs.shape[-1])
label = tf.reshape(label, (1, image_probs.shape[-1]))perturbations = create_adversarial_pattern(image, image_probs)
plt.imshow(perturbations[0])

#定义函数来显示图像
def display_images(image, description): # 展示被攻击过的图像_, label, confidence = get_imagenet_label(pretrained_model.predict(image))plt.figure()plt.imshow(image[0])plt.title('{} \n {} : {:.2f}% Confidence'.format(description,label, confidence*100))plt.show()#加入噪声后再将图像输入模型进行判断
epsilons = [0, 0.01, 0.1, 0.15, 0.20]
descriptions = [('Epsilon = {:0.3f}'.format(eps) if eps else 'Input') for eps in epsilons]for i, eps in enumerate(epsilons):adv_x = image + eps*perturbations[0]adv_x = tf.clip_by_value(adv_x, 0, 1) # 将值限制在[0,1]范围内display_images(adv_x, descriptions[i])






参考链接
https://blog.csdn.net/nemoyy/article/details/81052301
https://blog.csdn.net/nemoyy/article/details/81052301
https://download.csdn.net/download/qq_35225463/11646431

对抗网络学习-FGSM对抗样本生成相关推荐

  1. GAN (生成对抗网络) 手写数字图片生成

    GAN (生成对抗网络) 手写数字图片生成 文章目录 GAN (生成对抗网络) 手写数字图片生成 Discriminator Network Generator Network 简单版本的生成对抗网络 ...

  2. 生成对抗网络学习笔记5----DCGAN(unsupervised representation learning with deep convolutional generative adv)的实现

    首先是各种参考博客.链接等,表示感谢. 1.参考博客1:地址 --以下,开始正文. 1.DCGAN的简单总结 稳定的深度卷积GAN 架构指南: 所有的pooling层使用步幅卷积(判别网络)和微步幅度 ...

  3. 【论文翻译】Auto-painter:基于条件Wasserstein生成性对抗网络的草图卡通形象生成

    Auto-painter: Cartoon image generation from sketch by using conditional Wasserstein generative adver ...

  4. 生成对抗网络简介,深度卷积生成对抗网络(DCGAN)简介

    本博客是个人学习的笔记,讲述的是生成对抗网络(generate adversarial network ) 的一种架构:深度生成对抗网络 的简单介绍,下一节将使用 tensorflow 搭建 DCGA ...

  5. Pytorch:GAN生成对抗网络实现二次元人脸的生成

    github:https://github.com/SPECTRELWF/pytorch-GAN-study 网络结构 最近在疯狂补深度学习一些基本架构的基础,看了一下大佬的GAN的原始论文,说实话一 ...

  6. 生成式对抗网络(GAN)实战——书法字体生成练习赛

    https://www.tinymind.cn/competitions/ai 生成式对抗网络(GAN)是近年来大热的深度学习模型. 目前GAN最常使用的场景就是图像生成,作为一种优秀的生成式模型,G ...

  7. 强化学习(二)--让你轻松玩转生成对抗网络(GAN)与生成对抗模仿学习(GAIL)

    GAN的基本结构 GAN的主要结构包括一个生成器G(Generator)和一个判别器D(Discriminator) GAN 充分利用"对抗过程"训练两个神经网络,这两个网络会互相 ...

  8. 生成对抗网络学习笔记4----GAN(Generative Adversarial Nets)的实现

    首先是各种参考博客.链接等,表示感谢. 1.参考博客1:地址  2.参考博客2:地址 --以下,开始正文. 1.GAN的简单总结 见上一篇博客. 2.利用GAN生成1维正态分布 首先,我们创建&quo ...

  9. 改善图像处理效果的五大生成对抗网络

    作者 | Martin Isaksson 译者 | Sambodhi 策划 | 刘燕 在图像处理方面,机器学习实践者们正在逐渐转向借助生成对抗网络的力量,本文带你了解其中五种生成对抗网络,可根据自己的 ...

  10. 深度学习(九) GAN 生成对抗网络 理论部分

    GAN 生成对抗网络 理论部分 前言 一.Pixel RNN 1.图片的生成模型 2.Pixel RNN 3.Pixel CNN 二.VAE(Variational Autoencoder) 1.VA ...

最新文章

  1. 查询表空间是否是设置了自增
  2. Java中swing和awt初了解
  3. JVM内存模型、指令重排、内存屏障概念解析
  4. Java Web——JavaBean简介
  5. 计量经济学计算机答案第三章,计量经济学第三章习题及答案
  6. Linux网络编程 | 信号 :信号函数、信号集、统一事件源 、网络编程相关信号
  7. OneVPL与FFmpeg/GStreamer硬件编解码器
  8. linux使用open无法打开驱动解决方式
  9. python基础1之 由来、种类、优缺点、安装环境
  10. 美团java在线笔试题_美团点评春招在线笔试后台开发方向笔试题编程题第一题题解...
  11. Redis 读写分离技术,你了解多少?
  12. 继承ActionSupport类
  13. 【thinkphp 基础 3】配合phpstudy进行验证码拓展安装
  14. 记一次失败的小米前端面试经历
  15. 关于互联网+分布式光伏运维平台的应用介绍-李亚俊
  16. yolov4离线安装笔记
  17. NFS配置(RHCE考试题)
  18. interrupt()方法理解和实例
  19. Android开发之关机广播
  20. C++: 对称数字金字塔

热门文章

  1. 飞机大战(源码+素材)
  2. 数据库变为可疑_SQL SERVER 数据库被标记为“可疑”的解决办法
  3. you-get下载酷我音乐付费歌曲
  4. python2.7详细安装教程_python2.7安装图文教程
  5. EndnoteX7插入文献时,提示“访问未命名的文件时尝试越过其结尾”的解决方法
  6. Lua云验证卡密破解工具
  7. json的各种格式的转换
  8. 人工智能 一种现代方法 第1章 绪论
  9. 计算机运行命令定时关机,电脑定时关机命令 使用系统命令定时关机 - 云骑士一键重装系统...
  10. PHP ZipArchive 实现压缩解压Zip文件