Pytorch | 利用FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
Pytorch | 利用FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
- CIFAR数据集
- FGSM介绍
- FGSM代码实现
- FGSM算法实现
- 攻击效果
- 代码汇总
- fgsm.py
- train.py
- advtest.py
之前已经针对CIFAR10训练了多种分类器:
Pytorch | 从零构建AlexNet对CIFAR10进行分类
Pytorch | 从零构建Vgg对CIFAR10进行分类
Pytorch | 从零构建GoogleNet对CIFAR10进行分类
Pytorch | 从零构建ResNet对CIFAR10进行分类
Pytorch | 从零构建MobileNet对CIFAR10进行分类
Pytorch | 从零构建EfficientNet对CIFAR10进行分类
Pytorch | 从零构建ParNet对CIFAR10进行分类
本篇文章我们使用Pytorch实现快速梯度符号攻击Fast Gradient Sign Method, FGSM)对CIFAR10上的ResNet分类器进行攻击.
CIFAR数据集
CIFAR-10数据集是由加拿大高级研究所(CIFAR)收集整理的用于图像识别研究的常用数据集,基本信息如下:
- 数据规模:该数据集包含60,000张彩色图像,分为10个不同的类别,每个类别有6,000张图像。通常将其中50,000张作为训练集,用于模型的训练;10,000张作为测试集,用于评估模型的性能。
- 图像尺寸:所有图像的尺寸均为32×32像素,这相对较小的尺寸使得模型在处理该数据集时能够相对快速地进行训练和推理,但也增加了图像分类的难度。
- 类别内容:涵盖了飞机(plane)、汽车(car)、鸟(bird)、猫(cat)、鹿(deer)、狗(dog)、青蛙(frog)、马(horse)、船(ship)、卡车(truck)这10个不同的类别,这些类别都是现实世界中常见的物体,具有一定的代表性。
下面是一些示例样本:

FGSM介绍
FGSM(Fast Gradient Sign Method)算法是一种基于梯度的快速攻击算法,由Goodfellow等人在2015年提出,主要用于评估神经网络模型的鲁棒性。以下是对FGSM算法原理的详细介绍:
算法原理
- FGSM算法的核心思想是利用神经网络的梯度信息来生成对抗样本。对于给定的输入样本,通过计算模型对该样本的损失函数关于输入的梯度,然后根据梯度的符号来确定扰动的方向,最后在该方向上添加一个小的扰动,得到对抗样本。
- 具体而言,给定一个输入样本 x x x,其对应的真实标签为 y y y,模型的参数为 θ \theta θ,损失函数为 J ( θ , x , y ) J(\theta, x, y) J(θ,x,y)。首先计算损失函数 J J J 关于输入 x x x 的梯度 ∇ x J ( θ , x , y ) \nabla_x J(\theta, x, y) ∇xJ(θ,x,y),然后根据梯度的符号确定扰动的方向 sign ( ∇ x J ( θ , x , y ) ) \text{sign}(\nabla_x J(\theta, x, y)) sign(∇xJ(θ,x,y)),最后生成对抗样本 x ′ = x + ϵ ⋅ sign ( ∇ x J ( θ , x , y ) ) x' = x + \epsilon \cdot \text{sign}(\nabla_x J(\theta, x, y)) x′=x+ϵ⋅sign(∇xJ(θ,x,y)),其中 ϵ \epsilon ϵ 是一个很小的正数,用于控制扰动的大小。
FGSM代码实现
FGSM算法实现
import torch
import torch.nn as nndef FGSM(model, criterion, original_images, labels, epsilon):"""FGSM (Fast Gradient Sign Method)参数:- model: 要攻击的模型- criterion: 损失函数- original_images: 原始图像- labels: 原始图像的标签- epsilon: 扰动幅度"""perturbed_images = original_images.clone().detach().requires_grad_(True)outputs = model(perturbed_images)loss = criterion(outputs, labels)model.zero_grad()loss.backward()data_grad = perturbed_images.grad.datasign_data_grad = data_grad.sign()perturbed_images = perturbed_images + epsilon * sign_data_gradperturbed_images = torch.clamp(perturbed_images, original_images - epsilon, original_images + epsilon)return perturbed_images
攻击效果

代码汇总
fgsm.py
import torch
import torch.nn as nndef FGSM(model, criterion, original_images, labels, epsilon):"""FGSM (Fast Gradient Sign Method)参数:- model: 要攻击的模型- criterion: 损失函数- original_images: 原始图像- labels: 原始图像的标签- epsilon: 扰动幅度"""perturbed_images = original_images.clone().detach().requires_grad_(True)outputs = model(perturbed_images)loss = criterion(outputs, labels)model.zero_grad()loss.backward()data_grad = perturbed_images.grad.datasign_data_grad = data_grad.sign()perturbed_images = perturbed_images + epsilon * sign_data_gradperturbed_images = torch.clamp(perturbed_images, original_images - epsilon, original_images + epsilon)return perturbed_images
train.py
import torch
import torch.nn as nn
import torchvision
import torchvision.transforms as transforms
from models import ResNet18# 数据预处理
transform_train = transforms.Compose([transforms.RandomCrop(32, padding=4),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])transform_test = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])# 加载Cifar10训练集和测试集
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=False, transform=transform_train)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=128, shuffle=True, num_workers=2)testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=False, transform=transform_test)
testloader = torch.utils.data.DataLoader(testset, batch_size=100, shuffle=False, num_workers=2)# 定义设备(GPU或CPU)
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")# 初始化模型
model = ResNet18(num_classes=10)
model.to(device)# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)if __name__ == "__main__":# 训练模型for epoch in range(10): # 可以根据实际情况调整训练轮数running_loss = 0.0for i, data in enumerate(trainloader, 0):inputs, labels = data[0].to(device), data[1].to(device)optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()if i % 100 == 99:print(f'Epoch {epoch + 1}, Batch {i + 1}: Loss = {running_loss / 100}')running_loss = 0.0torch.save(model.state_dict(), f'weights/epoch_{epoch + 1}.pth')print('Finished Training')
advtest.py
import torch
import torch.nn as nn
import torchvision
import torchvision.transforms as transforms
from models import *
from attacks import *
import ssl
import os
from PIL import Image
import matplotlib.pyplot as pltssl._create_default_https_context = ssl._create_unverified_context# 定义数据预处理操作
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.491, 0.482, 0.446), (0.247, 0.243, 0.261))])# 加载CIFAR10测试集
testset = torchvision.datasets.CIFAR10(root='./data', train=False,download=False, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=128,shuffle=False, num_workers=2)# 定义设备(GPU优先,若可用)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")model = ResNet18(num_classes=10).to(device)criterion = nn.CrossEntropyLoss()# 加载模型权重
weights_path = "weights/epoch_10.pth"
model.load_state_dict(torch.load(weights_path, map_location=device))if __name__ == "__main__":# 在测试集上进行FGSM攻击并评估准确率model.eval() # 设置为评估模式correct = 0total = 0epsilon = 16 / 255 # 可以调整扰动强度for data in testloader:original_images, labels = data[0].to(device), data[1].to(device)original_images.requires_grad = Trueattack_name = 'FGSM'if attack_name == 'FGSM':perturbed_images = FGSM(model, criterion, original_images, labels, epsilon)perturbed_outputs = model(perturbed_images)_, predicted = torch.max(perturbed_outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()accuracy = 100 * correct / total# Attack Success RateASR = 100 - accuracyprint(f'Load ResNet Model Weight from {weights_path}')print(f'epsilon: {epsilon}')print(f'ASR of {attack_name} : {ASR}%')
相关文章:
Pytorch | 利用FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
Pytorch | 利用FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集FGSM介绍FGSM代码实现FGSM算法实现攻击效果 代码汇总fgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器: Pytorch | 从零构建AlexNet对CIFAR10进行分类 Pytorch | 从零构建Vgg…...
消息队列(二)消息队列的高可用原理
高可用的定义 上一篇文章提过,引入了消息队列的优势在于解耦、并发和缓冲,代价就是让程序的复杂性上升,引入了消息队列后,就需要考虑消息队列对于系统整体的影响,此时消息队列的稳定和健壮就是重中之重。也就是消息队…...
大模型-使用Ollama+Dify在本地搭建一个专属于自己的聊天助手与知识库
大模型-使用OllamaDify在本地搭建一个专属于自己的知识库 1、本地安装Dify2、本地安装Ollama并解决跨越问题3、使用Dify搭建聊天助手4、使用Dify搭建本地知识库 1、本地安装Dify 参考往期博客:https://guoqingru.blog.csdn.net/article/details/144683767 2、本地…...
深入理解索引的最左匹配原则:底层逻辑解析
1. 什么是最左匹配原则? 最左匹配原则是指在使用复合索引时,查询条件从左到右依次匹配索引列的顺序,一旦中间有列未匹配,索引将停止工作或部分失效。 1.1 举例说明 假设我们有一张用户表(users)…...
微服务——数据管理与一致性
1、在微服务架构中,每个微服务都有自己的数据库,这种设计有什么优点和挑战? 优点挑战服务自治:每个微服务可独立选择适合自己的数据库类型。数据一致性:跨微服务的事务难以保证强一致性。故障隔离:一个微服…...
Docker之技术架构【八大架构演进之路】
Docker之技术架构 1. 八大架构演进之路1.1 单机架构1.2 应用数据分离架构1.3 应用服务集群架构1.4 读写分离架构1.5 冷热分离架构1.6 垂直分库架构1.7 微服务架构1.8 容器编排架构(docker出现) 2. 一个互联网实战架构 本章意在让大家了解Docker出现的历史…...
CSP-X2024山东小学组T4:刷题
题目链接 CSP-X2024山东小学组T4:刷题 题目描述 比赛之路多艰,做题方得提升。努力刷题的人在比赛中往往能取得很好的成绩,小红就是这样的人。 为了继续提升自己的编程实力,小红整理了一份刷题题单,并选中了题单中的…...
【Windows指令】Windows常用快捷指令
一.查找系统上所有可用的 .cpl 文件 要查找系统上所有可用的 .cpl 文件,你可以浏览到以下目录: C:\Windows\System32在“System32”文件夹中搜索扩展名为 .cpl 的文件,将列出所有可用的控制面板小程序。 ❗某些 .cpl 文件可能仅存在于特定的…...
NLP中的神经网络基础
一:多层感知器模型 1:感知器 解释一下,为什么写成 wxb>0 ,其实原本是 wx > t ,t就是阈值,超过这个阈值fx就为1,现在把t放在左边。 在感知器里面涉及到两个问题: 第一个,特征提…...
安全筑堤,效率破浪 | 统一运维管理平台下的免密登录应用解析
在信息技术迅猛发展的今天,企业运维管理领域正面临着前所未有的复杂挑战。统一运维管理平台作为集中管理和监控IT基础设施的核心工具,其安全性和效率至关重要。免密登录作为一种新兴的身份验证技术,正逐渐成为提升运维管理效率和安全性的重要…...
初学elasticsearch
ES 文章目录 ES一、初识elasticsearch1、什么是elasticsearch,elastic static,Lucene2、倒排索引2.1、正向索引和倒排序索引 3、es与mysql的概念对比3.1、文档3.2、索引3.3、es与数据库中的关系 二、索引库操作1、mapping属性2、创建索引库和映射基本语法…...
HTMLCSS:惊!3D 折叠按钮
这段代码创建了一个具有 3D 效果和动画的按钮,按钮上有 SVG 图标和文本。按钮在鼠标悬停时会显示一个漂浮点动画,图标会消失并显示一个线条动画。这种效果适用于吸引用户注意并提供视觉反馈。按钮的折叠效果和背景渐变增加了页面的美观性。 演示效果 HT…...
SDK 指南
在前端开发中,SDK(Software Development Kit,软件开发工具包)是一个用于帮助开发者在特定平台、框架或技术栈中实现某些功能的工具集。 1. SDK 是什么? SDK 是一种开发工具包,它提供了开发人员实现某些功…...
Web 应用项目开发全流程解析与实战经验分享
目录 一、引言 二、需求分析 三、技术选型 四、架构设计 五、开发实现 六、测试优化 七、部署上线 八、实战经验分享 九、总结 一、引言 在当今数字化时代,Web 应用已经深入到我们生活和工作的各个角落。从社交网络到电子商务,从在线办公到娱乐…...
WPS中插入矩阵的方法
WPS中插入矩阵的方法: 1、先选择插入公式中的矩阵中的第二个括号矩阵 选中矩阵右键,点击插入 点击在此后插入列和在此后插入行,会得到3x3矩阵,如图 分别点击两次会得到4x4矩阵,如图,可以画出4x4矩阵...
Python调用R语言中的程序包来执行回归树、随机森林、条件推断树和条件推断森林算法
要使用Python调用R语言中的程序包来执行回归树、随机森林、条件推断树和条件推断森林算法,重新计算中国居民收入不平等,并进行分类汇总,我们可以使用rpy2库。rpy2允许在Python中嵌入R代码并调用R函数。以下是一个详细的步骤和示例代码&#x…...
uniapp input苹果中文键盘输入拼音直接切换输入焦点监听失效
问题: uniapp微信小程序,苹果手机中文键盘状态下,输入字母时,不点击确定也不点击空白处,直接切换到下一个input输入框,UI界面会保留上个输入框输入的内容,但input、blur事件监听到的值都是空&a…...
多智能体/多机器人网络中的图论法
一、引言 1、网络科学至今受到广泛关注的原因: (1)大量的学科(尤其生物及材料科学)需要对元素间相互作用在多层级系统中所扮演的角色有更深层次的理解; (2)科技的发展促进了综合网…...
华为:数字化转型只有“起点”,没有“终点”
上个月,我收到了一位朋友的私信,他询问我是否有关于华为数字化转型的资料。幸运的是,我手头正好收藏了一些,于是我便分享给他。 然后在昨天,他又再次联系我,并感慨:“如果当初我在进行企业数字…...
centos server系统新装后的网络配置
当前状态: ping www.baidu.com报错 1、检查IP ip addr show记录要编辑的网卡 link/ether 后的XX:XX:XX:XX:XX:XX号 2、以em1为例: vi /etc/sysconfig/network-scripts/ifcfg-em1,新增如下行: HWADDRXX:XX:XX:XX:XX:XX(具体值…...
Facebook4月为什么很容易封号,是风控变严了吗?
是的,4月份Facebook的风控确实会明显趋严。 这是平台为清理垃圾内容和违规行为而进行的大规模审核行动,主要源于Meta在4月底宣布的一项重大政策收紧。具体的风控升级背景和应对方案如下:🧐 为什么4月风控尤其严?Meta官…...
Nginx何以征服高性能之巅?深入剖析其架构设计哲学
前言 在现代互联网的星辰大海中,Nginx无疑是一艘性能卓越的航母。它轻松应对着每秒数十万计的并发请求,成为全球众多高流量网站(如Netflix、知乎、豆瓣等)不可或缺的基础组件。许多人将其高性能归功于某项“黑科技”,但事实上,Nginx的高性能是其深邃的架构设计哲学与一系…...
揭秘Browsershot:让HTML转PDF/图片变得如此简单高效的终极工具
揭秘Browsershot:让HTML转PDF/图片变得如此简单高效的终极工具 【免费下载链接】browsershot Convert HTML to an image, PDF or string 项目地址: https://gitcode.com/gh_mirrors/br/browsershot Browsershot是一款强大的开源工具,能够轻松将HT…...
ANIMATEDIFF PRO场景应用:为社交媒体制作惊艳的动态封面视频
ANIMATEDIFF PRO场景应用:为社交媒体制作惊艳的动态封面视频 1. 社交媒体视觉革命:为什么需要动态封面 在信息爆炸的社交媒体时代,静态图片已经难以抓住用户快速滑动的注意力。数据显示,带有动态元素的封面内容点击率比静态图片…...
Phi-3 Forest Laboratory在操作系统教学中的应用:模拟进程调度与内存管理
Phi-3 Forest Laboratory在操作系统教学中的应用:模拟进程调度与内存管理 不知道你有没有过这样的经历:坐在操作系统原理的课堂上,听着老师讲进程调度、内存分页,那些抽象的概念和算法在PPT上跳来跳去,公式和流程图看…...
OpenClaw+千问3.5-9B智能搜索:快速定位本地文件
OpenClaw千问3.5-9B智能搜索:快速定位本地文件 1. 为什么需要智能文件搜索 作为一个长期与代码和文档打交道的开发者,我经常陷入"文件存在但找不到"的困境。传统的文件名搜索在面对以下场景时显得力不从心: 只记得文档内容关键词…...
GLM-4.1V-9B-Base企业实操:教育行业试卷图像内容解析落地案例
GLM-4.1V-9B-Base企业实操:教育行业试卷图像内容解析落地案例 1. 教育行业的痛点与解决方案 在教育行业,试卷批改和内容分析一直是耗时费力的工作。传统方式需要教师人工阅卷,不仅效率低下,还容易出现主观偏差。特别是在大规模考…...
YOLOv10优化升级:利用TensorRT加速,推理性能再提升
YOLOv10优化升级:利用TensorRT加速,推理性能再提升 1. YOLOv10与TensorRT的完美结合 在计算机视觉领域,目标检测模型的推理速度直接影响着实际应用效果。YOLOv10作为最新一代的目标检测模型,通过消除NMS后处理实现了真正的端到端…...
盘姬工具箱:一款值得收藏的免费无广告系统维护神器
在日常使用电脑的过程中,我们难免会遇到各种各样的问题。 系统崩溃、文件误删、右键菜单混乱、网络故障等等,这些问题都让人头疼不已。 为了解决这些问题,很多用户会安装各种专门的工具软件。 但每安装一个软件,都会占用磁盘空…...
保姆级教程:用OpenCV+Wireshark搞定海康萤石摄像头RTSP视频流(附常见品牌地址格式)
从零破解:OpenCVWireshark实战解析主流安防摄像头RTSP协议 当你面对一台陌生的网络摄像头,既不知道IP地址也不清楚RTSP流格式时,那种无从下手的挫败感我深有体会。去年在帮朋友搭建智能监控系统时,我花了整整三天时间才搞明白不同…...
