利用Keras实现FGSM算法

2023-10-27

最近项目中需要使用FGSM攻击方法,使用主流的foolboxcleverhans中的攻击方法时,发现模型不匹配,所以不能继续使用,网上找到的代码也不能使用,需要自己实现一个。

根据论文 Explaining and Harnessing Adversarial Examples,FGSM的原理是损失函数对图像x求梯度,所以先求得损失函数,之后再对图像x求导,获得梯度,代码如下。

FGSM算法原理
其中噪声的计算方法如下所示,ε 表示扰动的大小,L 表示损失函数。

通过查找资料和讨论,得出了如下的代码。

from keras import backend, losses

def fgsm(model, image, y_true, eps=0.1):
   
    y_pred = model.output 
    
    # y_true: 目标真实值的张量。
    # y_pred: 目标预测值的张量。
    loss = losses.categorical_crossentropy(y_true, y_pred)

    gradient = backend.gradients(loss, model.input)
    gradient = gradient[0] 

    adv = image + backend.sign(gradient) * eps #fgsm算法
    
    sess = backend.get_session() 
    adv = sess.run(adv, feed_dict={ model.input : image}) #注意这里传递参数的情况
    adv = np.clip(adv, 0, 255) #有的像素点会超过255,需要处理

    return adv

# fgsm攻击 函数调用
# 下面部分代码(图像处理)需要根据自己的攻击图像的实际情况进行修改
def fgsm_attack(img, epsilons = 1000):
    image = cv2.imread(img)
    if image is None:
        print(img, end=' ')
        print("图像读取失败")
        return False

    # 加载准备攻击的模型,对要攻击的图形进行转换
    lpr_model = xxx 
    img_convert = cv2.resize(image, (x,y)) # 这里的x/y根据要求进行修改
    ret_predict = lpr_model.predict(np.array([img_convert])) #进行预测

    # 获取预测结果的one-hot编码,在攻击时需要用到
    label = np.zeros([1, 10, 1, 10]) #根据自己的情况进行修改
    for i in range(ret_predict.shape[0]):
        pos = res[i]
        label[0][i][0][pos] = 1

    # 计算eps的值
    epsilons = np.linspace(0,1,num=epsilons+1)[1:]

    print("开始使用fgsm进行攻击")
    for eps in epsilons:
        img_attack = fgsm(lpr_model, img_convert, label, eps=eps)
        attack = lpr_model.predict(img_attack)

        # 当识别的结果不等时,表示攻击成功
        if attack != ret_predict:
            print('攻击成功,攻击后的结果为:', attack)
            cv2.imwrite("attack_result.jpg", img_ret)

            return True
    return False

if __name__ == "__main__":
    fgsm_attack("./images/1.jpg")

参考:

  1. stackoverflow问答 https://stackoverflow.com/questions/39561560/getting-gradient-of-model-output-w-r-t-weights-using-keras
  2. keras的官方issue https://github.com/keras-team/keras/issues/2226
  3. stackoverflow问答 https://stackoverflow.com/questions/54480208/get-gradient-values-in-a-cnn-with-keras-tf
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用Keras实现FGSM算法 的相关文章

随机推荐

  • GIT 撤销与回滚

    git 相信大家都会用 但是大家有没有遇到过 不小心把不该提交的文件 commit 了 小编整理了一些我在开发中常见的使用场景 供大家参考 场景一 糟了 我刚把不想要的代码 commit到本地仓库中了 但是还没有做push操作 这种场景称为
  • Java什么是对象?

    真实世界对象具有共同的两个特性 它们都有状态和行为 狗有状态 名字 颜色 品种 饥饿 和行为 叫 刨地 摇尾巴 自行车也有状态 当前的齿轮档位 当前的脚踏板频率 当前的速度 和行为 变速 变脚踏板速率 刹车 识别真实世界对象的状态和行为是开
  • ECLIPSE java类文件从实心变为空心,以及右键项目没有 build path,或build path显示 no available source的问题

    导入别人的项目 一开始问题是Java类文件的图标由实心变成了空心 这样的话类文件不能编译 main方法也不能执行 查了半天都说要重新配置 build path 可是我右键项目名根本就没有build path 然后有人说把右上角 javaEE
  • mysql 建表时at line 1_数据库学习笔记之MySQL(11)

    目录 01 三表复合查询 02 对比外键约束的作用 03 添加外键 建表时添加 正文 01 三表复合查询从性能角度讲 多表联合查询没有从单表查询后合并性能高 SELECT a id a name b tel c emailFROM tbl
  • ChatGLM-6B之SSE通信(Server-sent Events)

    目录 研究历程 只是感受 不感兴趣的这段可以跳过 直接看下边的正题 找 正题 二字 正题 1 SSE Server sent Events 2 ChatGLM的流式方法 3 ChatGLM之SSE通信 写这篇博客还是很激动开心的 因为是我经
  • 错误解决——搭建悟空crm9项目运行环境过程中遇到的一些问题和错误解决办法

    错误解决 搭建悟空crm9项目运行环境过程中遇到的一些问题和错误解决办法 一 安装jdk 二 安装Tomcat 问题 1 三 安装MySQL 四 安装Redis 问题 1 问题 2 问题 3 五 安装悟空crm9 问题 1 问题 2 问题
  • C# 静态类和sealed类(密封类)的区别

    网上看到很多文章写静态类 和密封类 但是鲜有它们的对比总结 在此简单总结一下 静态类 Static Class 静态类不能被实例化 其成员都是静态的 可以通过类名直接访问 静态类通常用于创建一组相关的静态方法和属性 提供一些全局功能或工具函
  • Golang爬虫终极杀器——Chromedp让你成为二维码登陆终结者(教程)

    Golang爬虫终极杀器 Chromedp让你成为二维码登陆终结者 教程 Github源码 chromedp 文章项目Gitee源码 1 Chromedp是什么 chromedp是一个更快 更简单的Golang库用于调用支持Chrome D
  • 二哈智能图像识别使用I2C导出识别结果到Wemos D1板

    学校比赛 购买了一块智能识别传感器模块huskylens 商家给了使用文档 但是别人用的官方uno板子来连接 我手里面只有ESP8266WiFi板子 只能把I2C驱动程序编译到esp8266上了 这是我的板子 说明文档里面只给了连接UNO
  • LZW编解码算法实现及编码效率分析

    一 编码原理 第二类算法的想法是企图从输入的数据中创建一个 短语词典 dictionary of the phrases 这种短语可以是任意字符的组合 编码数据过程中当遇到已经在词典中出现的 短语 时 编码器就输出这个词典中的短语的 索引号
  • 美国的有线电视节目提供商

    HBO HBO电视网 英文名 Home Box Office 是总部位于美国纽约的有线电视网络媒体公司 HBO电视网于1972年开播 全天候播出电影 音乐 纪录片 体育赛事等娱乐节目 与绝大多数电视频道不同的是 它不卖广告 经过22年的发展
  • 什么是正则表达式?

    什么是正则表达式 1 什么是正则表达式 2 基本匹配 3 元字符 1 什么是正则表达式 正则表达式是 组由字 和符号组成的特殊 本 它可以 来从 本中找出满 你想要的格式的句 个正则表达式是 种从左到右匹配主体字符串的模式 Regular
  • Vue 中给数组增加自定义方法

    第一步 在程序根目录下创建 src common functions myFunction js 文件 第二步 文件内写入 export default install Vue 返回val在当前列表内的位置 Array prototype
  • SimpleServletHandlerAdapter类简介说明

    转自 SimpleServletHandlerAdapter类简介说明 下文笔者讲述SimpleServletHandlerAdapter类简介说明 如下所示 SimpleServletHandlerAdapter简介 SimpleServ
  • pycharm配置python环境变量详细步骤

    1 打开pycharm 点file settings 2 点击profect下的Python Interpeter
  • 目标检测与识别算法研究

    一 目标检测与识别 目标检测与识别是很多计算机视觉任务的基础 通俗地讲 其目的是在目标场景中将目标用一个个框框出来 并且识别出这个框中的物体 即包括加测 where 和识别 what 两个过程 1 技术难点 目标检测与识别任务对于人类来说
  • linux c语言字符串函数replace,indexOf,substring等的实现

    c语言没有像java那么丰富的字符串操作函数 很多有用的函数得自己写 搞了一天 写了几个常用函数 留着以后有用 include
  • Spark大数据分析与实战笔记(第一章 Scala语言基础-1)

    文章目录 章节概要 1 1 初识Scala 1 1 1 Scala的概述 1 1 2 Scala的下载安装 1 1 3 在IDEA开发工具中下载安装Scala插件 1 1 4 开发第一个Scala程序 章节概要 Spark是专为大规模数据处
  • python高级变量类型

    列表概念及操作 1 列表的定义 列表格式 列表名 元素1 元素2 例 my list 1 2 3 True 空列表的定义 my list 或 my list list 2 列表的循环遍历 for 循环遍历 while循环遍历 3 列表的常见
  • 利用Keras实现FGSM算法

    最近项目中需要使用FGSM攻击方法 使用主流的foolbox和cleverhans中的攻击方法时 发现模型不匹配 所以不能继续使用 网上找到的代码也不能使用 需要自己实现一个 根据论文 Explaining and Harnessing A