当前位置: 首页 > news >正文

BIMILLC算法源码解析

论文链接:https://arxiv.org/abs/1607.02533
源码出处:https://github.com/Harry24k/adversarial-attacks-pytorch/tree/master


源码

import torch
import torch.nn as nnfrom ..attack import Attackclass BIM(Attack):r"""BIM or iterative-FGSM in the paper 'Adversarial Examples in the Physical World'[https://arxiv.org/abs/1607.02533]Distance Measure : LinfArguments:model (nn.Module): model to attack.eps (float): maximum perturbation. (Default: 8/255)alpha (float): step size. (Default: 2/255)steps (int): number of steps. (Default: 10).. note:: If steps set to 0, steps will be automatically decided following the paper.Shape:- images: :math:`(N, C, H, W)` where `N = number of batches`, `C = number of channels`,        `H = height` and `W = width`. It must have a range [0, 1].- labels: :math:`(N)` where each value :math:`y_i` is :math:`0 \leq y_i \leq` `number of labels`.- output: :math:`(N, C, H, W)`.Examples::>>> attack = torchattacks.BIM(model, eps=8/255, alpha=2/255, steps=10)>>> adv_images = attack(images, labels)"""def __init__(self, model, eps=8/255, alpha=2/255, steps=10):super().__init__("BIM", model)self.eps = epsself.alpha = alphaif steps == 0:self.steps = int(min(eps*255 + 4, 1.25*eps*255))else:self.steps = stepsself.supported_mode = ['default', 'targeted']def forward(self, images, labels):r"""Overridden."""self._check_inputs(images)images = images.clone().detach().to(self.device)labels = labels.clone().detach().to(self.device)if self.targeted:target_labels = self.get_target_label(images, labels)loss = nn.CrossEntropyLoss()ori_images = images.clone().detach()for _ in range(self.steps):images.requires_grad = Trueoutputs = self.get_logits(images)# Calculate lossif self.targeted:cost = -loss(outputs, target_labels)else:cost = loss(outputs, labels)# Update adversarial imagesgrad = torch.autograd.grad(cost, images,retain_graph=False,create_graph=False)[0]adv_images = images + self.alpha*grad.sign()a = torch.clamp(ori_images - self.eps, min=0)b = (adv_images >= a).float()*adv_images + (adv_images < a).float()*ac = (b > ori_images+self.eps).float()*(ori_images+self.eps) + (b <= ori_images + self.eps).float()*bimages = torch.clamp(c, max=1).detach()return images

解析

BIM算法(Basic Iterative Method)又叫迭代FGSM算法(I-FGSM),FGSM算法假设目标损失函数 J ( x , y ) J(x,y) J(x,y) x x x之间是近似线性的,即 J ( x , y ) ≈ w T x J(x ,y)≈w^Tx J(x,y)wTx,所以沿着梯度上升的方向改变输入 x x x可以增大损失,从而达到使模型分类错误的目的。但是这个假设不一定正确,即 J ( x , y ) J(x,y) J(x,y) x x x之间可能不是线性的,也就是说改变在 ( 0 , ϵ s i g n ( ▽ x J ( θ , x , y ) ) ) (0,\epsilon sign(\bigtriangledown_{x}J(\theta,x,y))) (0,ϵsign(xJ(θ,x,y)))之间可能存在某个扰动,使得 J J J增加得更多。于是本篇论文就提出迭代的方式来找各个像素点的扰动,而不是一次性所有像素都改那么多,即迭代式的FGSM。公式如下所示:
X 0 a d v = X , X N + 1 a d v = C l i p X , ϵ { X N a d v + α s i g n ( ▽ x J ( X N a d v , y t r u e ) ) } X^{adv}_0=X,X^{adv}_{N+1}=Clip_{X,\epsilon}\{X^{adv}_N+\alpha sign(\triangledown_{x}J(X^{adv}_N,y_{true}))\} X0adv=X,XN+1adv=ClipX,ϵ{XNadv+αsign(xJ(XNadv,ytrue))}
迭代的含义:每次在上一步的对抗样本的基础上,各个像素增长 α \alpha α(或者减少),然后再执行裁剪,保证新样本的各个像素都在 x x x ϵ \epsilon ϵ邻域内。这种迭代的方法是有可能在各个像素变化小于 ϵ \epsilon ϵ的情况下找到对抗样本的,如果找不到,最差的效果就跟原始的FGSM一样。
裁剪( C l i p Clip Clip)的作用:在迭代更新过程中,随着增加扰动的次数的增加,样本的部分像素值可能会溢出,比如超出0到1的范围,这时需将这些值用0或1代替,最后才能生成有效的图像。
论文还提出了ILLC算法(Iterative Least Likely Class Attack),即使用类似的迭代的方法进行有目标攻击,公式如下所示: X 0 a d v = X , X N + 1 a d v = C l i p X , ϵ { X N a d v − α s i g n ( ▽ x J ( X N a d v , y t a r g e t ) ) } X^{adv}_0=X,X^{adv}_{N+1}=Clip_{X,\epsilon}\{X^{adv}_N-\alpha sign(\triangledown_{x}J(X^{adv}_N,y_{target}))\} X0adv=X,XN+1adv=ClipX,ϵ{XNadvαsign(xJ(XNadv,ytarget))}其中 y t a r g e t = arg min ⁡ y ( y ∣ X ) y_{target}=\argmin\limits_y(y\mid X) ytarget=yargmin(yX)也就是与样本 X X X偏离最远的错误类。

eps:即 ϵ \epsilon ϵ,表示最大扰动。
alpha:即 α \alpha α,表示每次迭代中扰动的增加量(或减少量)。
steps:表示迭代次数,论文中将其设为 m i n ( ϵ + 4 , 1.25 ϵ ) min(\epsilon+4,1.25\epsilon) min(ϵ+4,1.25ϵ),因为论文中认为这足够对抗性示例到达最大范数球的边缘,同时也保证实验的计算成本可控。由于代码中图像已经被归一化为 [ 0 , 1 ] [0,1] [0,1] ϵ \epsilon ϵ也在该范围内,所以steps即为 m i n ( ϵ × 255 + 4 , 1.25 ϵ × 255 ) min(\epsilon\times255+4,1.25\epsilon\times255) min(ϵ×255+4,1.25ϵ×255)
images = images.clone().detach().to(self.device)clone()将图像克隆到一块新的内存区(pytorch默认同样的tensor共享一块内存区);detach()是将克隆的新的tensor从当前计算图中分离下来,作为叶节点,从而可以计算其梯度;to()作用就是将其载入设备。
target_labels = self.get_target_label(images, labels):若是有目标攻击的情况,获取目标标签。目标标签的选取有多种方式,例如可以选择与真实标签相差最大的标签,也可以随机选择除真实标签外的标签。
loss = nn.CrossEntropyLoss():设置损失函数为交叉熵损失。
ori_images = images.clone().detach():保存原始图像,用于裁剪过程。
outputs = self.get_logits(images):获得图像的在模型中的输出值。
cost = -loss(outputs, target_labels):有目标情况下计算损失
cost = loss(outputs, labels):无目标情况下计算损失
grad = torch.autograd.grad(cost, images, retain_graph=False, create_graph=False)[0]costimages求导,得到梯度grad
adv_images = images + self.alpha*grad.sign():根据公式在图像上沿着梯度上升方向以步长为 α \alpha α增加扰动。

a = torch.clamp(ori_images - self.eps, min=0)  # a为图像最小值,即减去最大扰动值
b =(adv_images >= a).float()*adv_images + (adv_images < a).float()*a  # 将对抗图像小于a的部分设为a
c = (b > ori_images+self.eps).float()*(ori_images+self.eps) + (b <= ori_images + self.eps).float()*b  # 将b中超出扰动范围的值设为最大值
images = torch.clamp(c, max=1).detach()  # 将c中超出1的值设为1

以上四行代码为裁剪( C l i p Clip Clip)过程,得到有效的图像。

相关文章:

BIMILLC算法源码解析

论文链接&#xff1a;https://arxiv.org/abs/1607.02533 源码出处&#xff1a;https://github.com/Harry24k/adversarial-attacks-pytorch/tree/master 源码 import torch import torch.nn as nnfrom ..attack import Attackclass BIM(Attack):r"""BIM or iter…...

Android STR研究之五

前言&#xff1a; 在前四篇中初步介绍了开机流程&#xff0c;STR流程&#xff0c;唤醒流程&#xff0c;这里讲下STR的问题点 Android STR研究之一-CSDN博客 Android STR研究之二-CSDN博客 Android STR研究之三-CSDN博客 Android STR研究之四-CSDN博客 问题1&#xff1a;进入STR…...

python3+requests接口自动化测试实例详细操作

前段时间由于公司测试方向的转型&#xff0c;由原来的web页面功能测试转变成接口测试&#xff0c;之前大多都是手工进行&#xff0c;利用postman和jmeter进行的接口测试&#xff0c;后来&#xff0c;组内有人讲原先web自动化的测试框架移驾成接口的自动化框架&#xff0c;使用的…...

在Node.js中,什么是中间件(middleware)?它们的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…...

当函数参数为一级指针,二级指针

当函数参数为一级指针&#xff0c;二级指针 在讲述内容之前&#xff0c;先讲四点重要知识 1.当传入参数时&#xff0c;函数形参会立即申请形参的内存空间&#xff0c;函数执行完毕后&#xff0c;形参的内存空间立即释放掉。 1.指针是存放其他变量地址的变量。指针有自己的内…...

Hydra post登录框爆破

文章目录 无token时的Hydra post登录框爆破带Token时的Hydra post登录框爆破 无token时的Hydra post登录框爆破 登录一个无验证码和token的页面&#xff0c;同时抓包拦截 取出发送数据包&#xff1a;usernameadb&password133&submitLogin 将用户名和密码替换 userna…...

阿里云推出AI编程工具“通义灵码“;生成式 AI 入门教程 2

&#x1f989; AI新闻 &#x1f680; 阿里云推出AI编程工具"通义灵码"&#xff0c;支持多种语言及实时续写功能 摘要&#xff1a;阿里云推出了一款名为"通义灵码"的AI编程工具&#xff0c;支持多种主流编程语言&#xff0c;包括Java、Python、Go等。该工…...

使用Qt Installer Framework将自己的程序打包成安装包程序

使用Qt Installer Framework将自己的程序打包成安装包程序 制作安装包程序就是将自己的程序打包成一个可执行的exe&#xff0c;双击之后进行安装。 1. 在制作安装包程序之前需要安装qt官方提供的安装包制作工具Qt Installer Framework 去qt官方网址&#xff0c;下载对应的 Q…...

逆袭Flutter? Facebook 发布全新跨平台引擎 Hermes!

Facebook 于前日发布了新的 JavaScript 引擎&#xff1a;Hermes&#xff0c;专注于提高 React Native 应用的性能&#xff0c;并且在市面上那些内存较少、存储速度较慢且计算能力低下的移动设备上都有良好的表现。但是不是为了追赶Flutter&#xff1f;这块作者没有说明。 移动应…...

c++ 互斥锁使用详解 lock_guard

c 互斥锁使用详解 std::mutex 用于保护共享资源&#xff0c;防止多个线程同时修改共享资源而引发竞争条件。 成员函数 lock&#xff1a;锁定互斥&#xff0c;若互斥不可用则阻塞。try_lock&#xff1a;尝试锁定互斥&#xff0c;若互斥不可用则返回。unlock&#xff1a;解锁…...

【快速解决】Android Button页面跳转功能

目录 让我们直接开始 第一步&#xff1a;先建立一个新的activity ​编辑 第二步&#xff1a;打开第一个页面的Java文件MainActivity 方法一&#xff1a;直接跳转功能如下&#xff1a; 方法二&#xff1a;输入密码才能进行跳转功能如下&#xff1a; 需要注意的地方 结语 让…...

C语言 pthread_create

备注void *&#xff0c;最好添加返回值 原因&#xff1a;在实践中&#xff0c;虽然你的函数可能不需要返回任何值&#xff0c;但为了与 pthread_create 函数的预期函数指针格式相匹配&#xff0c;最好遵守函数指针所需的返回类型。这是一种良好的编程实践&#xff0c;确保你的代…...

前端uniapp提交表单调用接口方法最新

目录 源码1源码2最后 源码1 <template><view class"my-add-bank-card"><!-- name"bank_name" form表单提交的input里面一定要加name绑定要传的参数 name"bank_name" type"text" v-model"address.bank_name"…...

OpenFeign的简单介绍和功能实操

前言 本文主要做一下OpenFeign的简单介绍和功能实操&#xff0c;实操主要是OpenFeign的超时和重试&#xff0c;在阅读本文章前&#xff0c;请完成《Nacos 注册中心介绍与实操》内的Nacos多模块生产消费者项目 什么是OpenFeign OpenFeign全名Spring Cloud OpenFeign&#xff…...

webpack 高级

高级配置就是要进行 webpack 优化&#xff0c;让代码在编译、运行时性能更好 主要从以下角度去优化&#xff1a; 1、提升开发体验 2、提升打包构建速度 3、减少代码体积 4、优化代码运行性能 一、提升体验 1、SourceMap 为什么 打包出来的所有css和js合并成了一个文件&#…...

OLE DB 访问接口所需的(最大)数据长度为 18,但返回的数据长度为 6。

sqlserver查询oracle链接服务器视图,报错 给最终返回的字符串进行类型转换,字符串大小按返回值最大的那个oracle源本字段类型长度 aaaaaa AS yljgbmcast(aaaaaa AS varchar(10)) AS yljgbm...

oracle (9)Storage Relationship Strut

目录 一、基础知识 1、数据库逻辑结构图 2、Types of Segments 段的类型 3、Storage Clause Precedence 存储条款的优先顺序 4、Extent Alloc & Dealloc 区的范围分配和取消分配 5、 Used and Free Extents 使用和自由区 6、Database Block 数据库块 7、Multiple B…...

React 项目结构小结

React 项目结构小结 简单的记录一下目前 React 项目用的依赖和实现 摸索了大半年了大概构建一套用起来还算轻松的体系……&#xff1f;基本上应该是说可以应对大部分的项目了 使用的依赖 目前项目还在 refactoring 的阶段&#xff0c;所以乱得很&#xff0c;这里是新建一个…...

4.网络之TCP

TCP协议(传输层) 文章目录 TCP协议(传输层)1. TCP报文格式2. TCP相关机制2.1 确认应答机制2.2 超时重传机制2.3 连接管理机制&#xff08;重点&#xff09;2.3.1 三次握手2.3.2 四次挥手 2.4 滑动窗口机制2.5 流量控制机制2.6 拥塞控制机制2.7 延迟应答机制2.8 捎带应答机制 3.…...

电池原理与分类

1 电池基础知识 电池目前大量应用于我们的生活中&#xff0c;主要包括3C消费类、动力类、储能类。 图1 电池应用方向 备注&#xff1a;3C指的是计算机(Computer )、通讯&#xff08;Communication&#xff09;消费类电子产品&#xff08;Consumer Electronic&#xff09;三类…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...