PyTorch深度学习实战(28)——对抗攻击(Adversarial Attack)

PyTorch深度学习实战(28)——对抗攻击

    • 0. 前言
    • 1. 对抗攻击
    • 2. 对抗攻击模型分析
    • 3. 使用 PyTorch 实现对抗攻击
    • 小结
    • 系列链接

0. 前言

近年来,深度学习在图像分类、目标检测、图像分割等诸多领域取得了突破性进展,深度学习模型已经能够以接近甚至超越人类水平的完成某些特定任务。但最近的研究表明,深度学习模型容易受到输入数据中细微扰动的影响,从而导致模型输出错误的预测。在图像领域,此类扰动通常很小对于人眼而言甚至无法察觉,但它们却能够愚弄深度学习模型。针对深度学习模型的这种对抗攻击,限制了深度学习的成功在更广泛领域的应用。本节中,我们将介绍对抗攻击 (Adversarial Attack) 的基本概念,并使用 PyTorch 实现对抗攻击生成可欺骗神经网络的图像。

1. 对抗攻击

深度学习在执行各种计算机视觉任务方面都有着优异的准确性,但尽管深度学习模型的精确度很高,现代深度网络却容易被微小扰动形式的对抗攻击所干扰,这些扰动对虽然对人类视觉系统而言几乎无法感知,但却可能导致神经网络分类器完全改变其对图像的预测。甚至,被攻击的模型对错误的预测结果具有很高的置信度。对抗攻击 (Adversarial Attack) 是针对机器学习模型的一种攻击方式,通过精心构造的数据输入,来欺骗机器学习模型以使其产生错误的结果。
包含恶意扰动的数据通常称为对抗样本 (Adversarial Example),而对抗攻击 (Adversarial Attack) 则是构建对抗样本的并对目标模型实施攻击的过程。例如,如下图所示,通过在图像中添加不明显的扰动,并不会影响人类对其内容的判断,但深度神经网络却对扰动后的图像输出了完全错误的分类结果。

对抗样本示例

2. 对抗攻击模型分析

本质上,对抗攻击是对输入图像值(像素)进行更改。在本节中,我们将学习如何调整输入图像,以使训练后性能良好的深度学习模型对修改后的图像输出为指定类别而非原始类别:

  1. 使用红狐图像
  2. 指定模型预测对抗样本的目标类别
  3. 导入预训练模型,冻结模型参数 (gradients = False)
  4. 指定计算输入图像像素值(而非神经网络的权重)的梯度,因为在进行对抗攻击时,我们无法控制模型权重,只能修改输入图像
  5. 计算与模型预测和目标类别对应的损失
  6. 执行反向传播,获取与每个输入像素值相关的梯度
  7. 根据每个输入像素值对应的梯度方向更新输入图像像素值
  8. 重复步骤 5-7,直到模型以较高的置信度将修改后的图像预测为指定类别

3. 使用 PyTorch 实现对抗攻击

在本节中,我们使用 PyTorch 实现上述对抗攻击策略,以生成对抗样本。

(1) 导入相关库、读取输入图像和预训练 ResNet50 模型,另外需要冻结模型参数:

import numpy as np
import torch
from torch import nn
from matplotlib import pyplot as pltfrom torchvision.models import resnet50
model = resnet50(pretrained=True)
for param in model.parameters():param.requires_grad = False
model = model.eval()import requests
from PIL import Image
file = '5.png'
original_image = Image.open(file).convert('RGB')
original_image = np.array(original_image)
original_image = torch.Tensor(original_image)

(2) 导入 Imagenet 类别文件并为每个类别分配 ID

image_net_classes = 'https://gist.githubusercontent.com/yrevar/942d3a0ac09ec9e5eb3a/raw/238f720ff059c1f82f368259d1ca4ffa5dd8f9f5/imagenet1000_clsidx_to_labels.txt'
image_net_classes = requests.get(image_net_classes).text
image_net_ids = eval(image_net_classes)
image_net_classes = {i:j for j,i in image_net_ids.items()}

(3) 定义函数执行图像归一化函数 image2tensor() 与逆归一化函数 tensor2image()

from torchvision import transforms as T
from torch.nn import functional as F
normalize = T.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
denormalize = T.Normalize([-0.485/0.229, -0.456/0.224, -0.406/0.225], [1/0.229, 1/0.224, 1/0.225])def image2tensor(input):x = normalize(input.clone().permute(2,0,1)/255.)[None]return x
def tensor2image(input):x = (denormalize(input[0].clone()).permute(1,2,0)*255.).type(torch.uint8)return x

(4) 定义预测给定图像类别的函数 predict_on_image()

def predict_on_image(input):model.eval()plt.imshow(input)# show(input)plt.show()input = image2tensor(input)pred = model(input)pred = F.softmax(pred, dim=-1)[0]prob, clss = torch.max(pred, 0)clss = image_net_ids[clss.item()]print(f'PREDICTION: `{clss}` @ {prob.item()}')

在以上代码中,将输入图像转换为张量(使用 image2tensor() 函数),并使用预训练模型预测模型类别 clss 及对应概率 prob

(5) 定义对抗攻击函数 attack

attack() 函数使用 imagemodeltarget 作为输入:

from tqdm import trange
losses = []
def attack(image, model, target, epsilon=1e-6):

将图像转换为张量,并指定计算输入图像梯度:

    input = image2tensor(image)input.requires_grad = True

计算模型对给定输入 input 的预测结果,然后计算目标类别 target 对应的损失值:

    pred = model(input)loss = nn.CrossEntropyLoss()(pred, target)

通过反向传播最小化损失值:

    loss.backward()losses.append(loss.mean().item())

根据梯度方向小幅度更新图像:

    output = input - epsilon * input.grad.sign()

在以上代码中,对输入值进行小幅度(乘以 epsilon )更新。也就是说,我们并未直接通过梯度大小更新图像,而是通过在梯度方向上 (input.grad.sign()) 乘以一个非常小的值 (epsilon) 后更新图像。

使用 tensor2image 方法将张量转换回图像后返回输出:

    output = tensor2image(output)del inputreturn output.detach()

(6) 将图像修改为指定类别。

指定对抗攻击的目标类别 desired_targets

modified_images = []
desired_targets = ['lemon', 'comic book', 'sax, saxophone']

循环遍历 desired_targets,并在每次迭代中将目标类别转换为相应索引:

for target in desired_targets:target = torch.tensor([image_net_classes[target]])

修改图像进行对抗攻击,并将结果追加到列表 modified_images 中:

    image_to_attack = original_image.clone()for _ in trange(10):image_to_attack = attack(image_to_attack, model, target)modified_images.append(image_to_attack)

绘制修改后的图像,并显示相应的类别:

for image in [original_image, *modified_images]:predict_on_image(image)
# PREDICTION: `lemon` @ 0.9999375343322754
# PREDICTION: `comic book` @ 0.9998908042907715
# PREDICTION: `sax, saxophone` @ 0.9997311234474182

对抗攻击结果
可以看到,即使对图像进行非常微小的改动(甚至在人眼看来并无差别),模型也会对扰动样本以极高的置信度预测输出错误的类别。

小结

尽管深度神经网络在各种计算机视觉任务上具有很高的准确性,但研究表明它们容易受到微小扰动的影响,从而导致它们输出完全错误的预测结果。由于深度学习是当前机器学习和人工智能的核心技术,这一缺陷引起了研究人员广泛的兴趣。本文首先介绍了对抗攻击的基本概念,然后利用 PyTorch 实现了一种经典的对抗攻击算法,通过在图中添加微小扰动令红狐图像被错误的预测为指定类别,我们也可以通过改变攻击的目标索引,来使图像被错误分类为其它类别。

系列链接

PyTorch深度学习实战(1)——神经网络与模型训练过程详解
PyTorch深度学习实战(2)——PyTorch基础
PyTorch深度学习实战(3)——使用PyTorch构建神经网络
PyTorch深度学习实战(4)——常用激活函数和损失函数详解
PyTorch深度学习实战(5)——计算机视觉基础
PyTorch深度学习实战(6)——神经网络性能优化技术
PyTorch深度学习实战(7)——批大小对神经网络训练的影响
PyTorch深度学习实战(8)——批归一化
PyTorch深度学习实战(9)——学习率优化
PyTorch深度学习实战(10)——过拟合及其解决方法
PyTorch深度学习实战(11)——卷积神经网络
PyTorch深度学习实战(12)——数据增强
PyTorch深度学习实战(13)——可视化神经网络中间层输出
PyTorch深度学习实战(14)——类激活图
PyTorch深度学习实战(15)——迁移学习
PyTorch深度学习实战(16)——面部关键点检测
PyTorch深度学习实战(17)——多任务学习
PyTorch深度学习实战(18)——目标检测基础
PyTorch深度学习实战(19)——从零开始实现R-CNN目标检测
PyTorch深度学习实战(20)——从零开始实现Fast R-CNN目标检测
PyTorch深度学习实战(21)——从零开始实现Faster R-CNN目标检测
PyTorch深度学习实战(22)——从零开始实现YOLO目标检测
PyTorch深度学习实战(23)——使用U-Net架构进行图像分割
PyTorch深度学习实战(24)——从零开始实现Mask R-CNN实例分割
PyTorch深度学习实战(25)——自编码器(Autoencoder)
PyTorch深度学习实战(26)——卷积自编码器(Convolutional Autoencoder)
PyTorch深度学习实战(27)——变分自编码器(Variational Autoencoder, VAE)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/579900.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见的一些库函数

什么是库函数: 库函数是一组预先定义好的函数,可以通过包含相应的头文件来使用。它们提供了各种常用的功能和算法,使得编程更加方便和高效。 库函数的作用如下: 提供常用功能:库函数提供了各种常用的功能,…

记一次应急响应练习(Linux)

记一次应急响应练习(Linux) Linux: 请提交攻击者的IP地址 答: 192.168.31.132 思路: 通过查看历史命令和开放的8080端口看到这台主机上运行的是Tomcat服务。并且在历史命令中看到了Tomcat的安装路径。那么就算是找到了日志的查看点了&#x…

设计模式-依赖注入模式

设计模式专栏 模式介绍模式特点应用场景依赖注入和控制反转的区别代码示例Java实现依赖注入模式Python实现依赖注入模式 依赖注入模式在spring中的应用 模式介绍 依赖注入(Dependency Injection,简称DI)是一种面向对象编程中的设计模式&…

STM32F407-14.3.10-表73具有有断路功能的互补通道OCx和OCxN的输出控制位-1x001

如上表所示,MOE1,OSSR0,CCxE0,CCxNE1时,OCx输出状态取决于GPIO端口上下拉状态,OCxN输出状态取决于OCx_REF与极性选择(CCxNP)。 -------------------------------------------------…

【头歌实训】Spark 完全分布式的安装和部署(新)

文章目录 第1关: Standalone 分布式集群搭建任务描述相关知识课程视频Spark分布式安装模式主机映射免密登录准备Spark安装包配置环境变量修改 spark-env.sh 配置文件修改 slaves 文件分发安装包启动spark验证安装 编程要求测试说明答案代码 第1关: Stand…

C++ Qt开发:QSqlDatabase数据库组件

Qt 是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QSqlDatabase数据库模块的常用方法及灵活运用…

Cloudstack多个管理服务器节点

https://docs.cloudstack.apache.org/en/4.18.0.0/adminguide/reliability.html 参考翻译: 代理上支持多个管理服务器 在具有多个管理服务器的Cloudstack环境中,可以根据算法配置代理,将其连接到哪个管理服务器。这对于内部负载均衡器或高可…

【机器学习】人工智能概述

人工智能(Artificial Intelligence,简称AI)是一门研究如何使机器能够像人一样思考、学习和执行任务的学科。它是计算机科学的一个重要分支,涉及机器学习、自然语言处理、计算机视觉等多个领域。 人工智能的概念最早可以追溯到20世…

3.docker 安装失败

1、错误描述 2、报错前操作 ① 安装yum工具 yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken ② 更新本地镜像源 # 设置docker镜像源 yum-config-manager \--add-repo \https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo…

扫描全能王启动鸿蒙原生应用开发,系HarmonyOS NEXT智能扫描领域首批

近期,“鸿蒙合作签约暨扫描全能王鸿蒙原生应用开发启动仪式”(简称“签约仪式”)正式举行。合合信息与华为达成鸿蒙合作,旗下扫描全能王将基于HarmonyOS NEXT正式启动鸿蒙原生应用开发。据悉,扫描全能王是鸿蒙在智能扫…

DM、HIVE和Kingbase8(人大金仓数据库)给列增加备注

DM数据库给列增加备注 1、创建表 CREATE TABLE test222 ( id int NOT NULL PRIMARY KEY, name varchar(1000) DEFAULT NULL, email varchar(1000) DEFAULT NULL, phone varchar(1000) DEFAULT NULL ) 2、给列添加注释 comment on column TEST222.NAME is 这是一个列注释; 例如…

说说 Spring Boot 实现接口幂等性有哪几种方案?

一、什么是幂等性 幂等是一个数学与计算机学概念,在数学中某一元运算为幂等时,其作用在任一元素两次后会和其作用一次的结果相同。 在计算机中编程中,一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数或幂等…

关联规则+聚类分析+分类算法(数据挖掘)

3.关联规则 经典案例 : 尿布与啤酒的故事; 基本概念 : 设I {i1,i2,....im}是项(Item)的集合。 D 是 事务(transaction)的集合(事务数据库)。 事务T是项的集合,且对每个事务具有唯一的标识: 事务号,记作TID; 设A是I中的一个项集&#xf…

Redis分布式缓存之主从哨兵分片集群

Redis主从 数据同步原理 Redis哨兵 Redis分片集群 集群伸缩:在集群中插入或删除某个节点 集群故障转移

Android 13 - Media框架(28)- ACodec(五)

前面几节我们了解了OMXNodeInstance是如何处理setPortMode、allocateBuffer、useBuffer的,这一节我们再回到ACodec,来看看 ACodec start 的其他部分。 我们首先来回顾一下,ACodec start 的状态切换以及处理的事务,我们用一张不太准…

「GPT」G、P、T分别是啥意思?

G意为Generative :生成式 比如,生成式的分类器(模型)包括---- generative classifiers: naive Bayes classifier and linear discriminant analysis 与之对应的为判别式----- discriminative model: logistic regression P意为…

基于 Linux 的批量上传本地 Git 仓库到 Github 的实践

基于 Linux 的批量上传本地 Git 仓库到 Github 的实践 一、需求二、上传本地 Git 仓库2.1 初始版本2.2 优化版本 三、 GitHub 创建空仓库3.1 初始版本3.2 优化版本 一、需求 app目录下的每个文件夹都是一个git仓库,如何使用shell脚本将所有git仓库都上传到github上…

记一次Mac端mysql重置密码

在执行mysql命令的时候,报如下的错误,表示不支持mysql命令: zsh: command not found: mysql 1. 先查看mysql服务是否存在 在系统偏好设置中查看: 2. 发现mysql服务已经在运行,可能因为/usr/local/bin目录下缺失mysq…

如何使用设计模式来解决类与类之间调用过深的问题。

我们将使用责任链模式和装饰者模式的组合。 考虑一个简化的餐厅订单处理系统,其中包括服务员(Waiter)、厨师(Chef)和收银员(Cashier)。订单从服务员开始,然后传递给厨师&#xff0c…

ubuntu22.04搭建RTSP服务器

大致命令如下: git clone --depth 1 gitgithub.com:ZLMediaKit/ZLMediaKit.git sudo apt-get install build-essential sudo apt-get install cmake #除了openssl,其他其实都可以不安装 sudo apt-get install libssl-dev sudo apt-get install libsdl-dev sudo apt…