【人工智能课程】计算机科学博士作业三

【人工智能课程】计算机科学博士作业三

来源:李宏毅2022课程第10课的作业

1 图片攻击概念

图片攻击是指故意对数字图像进行修改,以使机器学习模型产生错误的输出或者产生预期之外的结果。这种攻击是通过将微小的、通常对人类难以察觉的扰动应用于输入图像来实现的。图片攻击是对深度学习系统中的鲁棒性和安全性的一种测试,也可以用于欺骗、隐私侵犯、对抗性水印等。以下是一些常见的图片攻击的目的:

  1. 对抗样本研究:通过图片攻击,研究人员可以探索深度学习模型的鲁棒性和对抗样本的生成方法,以便改进模型的安全性和鲁棒性。
  2. 欺骗机器学习模型:攻击者可能希望通过修改图片使其被错误地分类,从而欺骗机器学习模型,例如将停车标志误识别为速限标志。
  3. 隐私攻击:通过修改图片,攻击者可以消除敏感信息,或者使图像模糊以保护隐私。
  4. 对抗性水印:攻击者可能希望通过添加微小的、难以察觉的扰动,来隐藏或改变水印,或者转移水印,以保护知识产权或者追踪盗版图片来源。

总之,图片攻击的目的可以是为了研究、测试模型的鲁棒性,也可以是出于恶意目的,比如欺骗或者损害隐私。在实际应用中,保护和提高模型的鲁棒性,并确保数据的安全与隐私是至关重要的。

2 算法

除了FGSM、IFGSM和MIFGSM之外,还有一些其他流行的图像攻击算法,包括:

  1. DeepFool:它是一种迭代的无目标攻击算法,通过找到沿着特征空间最不相关的方向来生成对抗样本。

  2. CW攻击(Carlini and Wagner攻击):这个算法试图最小化一种特定的损失函数,以欺骗分类器,并在L2和L∞规范下产生对抗样本。

  3. JSMA(Jacobian-based Saliency Map Attack):JSMA算法通过最大化目标函数的梯度,以找到最有效的像素扰动,使图像被错误分类。

  4. EOT(Expectation over Transformation):EOT算法通过对输入图像进行多个随机扰动,然后对这些扰动的预期值进行优化,生成对抗样本。

  5. One-pixel攻击:这种攻击算法仅修改图像中的几个像素,以欺骗分类器,同时尽可能减少对原始图像的影响。

3 Python实现

3.1 下载数据

# 设置环境
!pip install pytorchcv
!pip install imgaug# 下载数据
!wget https://github.com/DanielLin94144/ML-attack-dataset/files/8167812/data.zip# 解压
!unzip ./data.zip
!rm ./data.zip

3.2 参数设置

import torch
import torch.nn as nndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
batch_size = 8# 平均值和标准差是根据cifar10数据集计算的统计数据
cifar_10_mean = (0.491, 0.482, 0.447) # cifar_10 图片数据三个通道的均值
cifar_10_std = (0.202, 0.199, 0.201) # cifar_10 图片数据三个通道的标准差# 将mean和std转换为三维张量,用于未来的运算
mean = torch.tensor(cifar_10_mean).to(device).view(3, 1, 1)
std = torch.tensor(cifar_10_std).to(device).view(3, 1, 1)epsilon = 8/255/stdroot = '/data' # 用于存储`benign images`的目录

3.3 导入数据

import os
import glob
import shutil
import numpy as np
from PIL import Image
from torchvision.transforms import transforms
from torch.utils.data import Dataset, DataLoadertransform = transforms.Compose([transforms.ToTensor(),transforms.Normalize(cifar_10_mean, cifar_10_std)
])class AdvDataset(Dataset):def __init__(self, data_dir, transform):self.images = []self.labels = []self.names = []'''data_dir├── class_dir│   ├── class1.png│   ├── ...│   ├── class20.png'''for i, class_dir in enumerate(sorted(glob.glob(f'{data_dir}/*'))):images = sorted(glob.glob(f'{class_dir}/*'))self.images += imagesself.labels += ([i] * len(images))self.names += [os.path.relpath(imgs, data_dir) for imgs in images]self.transform = transformdef __getitem__(self, idx):image = self.transform(Image.open(self.images[idx]))label = self.labels[idx]return image, labeldef __getname__(self):return self.namesdef __len__(self):return len(self.images)adv_set = AdvDataset(root, transform=transform)
adv_names = adv_set.__getname__()
adv_loader = DataLoader(adv_set, batch_size=batch_size, shuffle=False)print(f'number of images = {adv_set.__len__()}')

3.4 工具函数

(1)评估模型在良性图像上的性能

# 评估模型在良性图像上的性能
def epoch_benign(model, loader, loss_fn):model.eval()train_acc, train_loss = 0.0, 0.0for x, y in loader:x, y = x.to(device), y.to(device)yp = model(x)loss = loss_fn(yp, y)train_acc += (yp.argmax(dim=1) == y).sum().item()train_loss += loss.item() * x.shape[0]return train_acc / len(loader.dataset), train_loss / len(loader.dataset)

(2)

# 执行对抗性攻击 并生成对抗性示例
def gen_adv_examples(model, loader, attack, loss_fn):model.eval()adv_names = []train_acc, train_loss = 0.0, 0.0for i, (x, y) in enumerate(loader):x, y = x.to(device), y.to(device)x_adv = attack(model, x, y, loss_fn) # obtain adversarial examplesyp = model(x_adv)loss = loss_fn(yp, y)train_acc += (yp.argmax(dim=1) == y).sum().item()train_loss += loss.item() * x.shape[0]# store adversarial examplesadv_ex = ((x_adv) * std + mean).clamp(0, 1) # to 0-1 scaleadv_ex = (adv_ex * 255).clamp(0, 255) # 0-255 scaleadv_ex = adv_ex.detach().cpu().data.numpy().round() # round to remove decimal partadv_ex = adv_ex.transpose((0, 2, 3, 1)) # transpose (bs, C, H, W) back to (bs, H, W, C)adv_examples = adv_ex if i == 0 else np.r_[adv_examples, adv_ex]return adv_examples, train_acc / len(loader.dataset), train_loss / len(loader.dataset)# 创建存储对抗性示例的目录
def create_dir(data_dir, adv_dir, adv_examples, adv_names):if os.path.exists(adv_dir) is not True:_ = shutil.copytree(data_dir, adv_dir)for example, name in zip(adv_examples, adv_names):im = Image.fromarray(example.astype(np.uint8)) # 图片数据需要转成 uint8im.save(os.path.join(adv_dir, name))

3.5 攻击算法

(1)fgsm算法

def fgsm(model, x, y, loss_fn, epsilon=epsilon):x_adv = x.detach().clone() # 用良性图片初始化 x_advx_adv.requires_grad = True # 需要获取 x_adv 的梯度loss = loss_fn(model(x_adv), y) # 计算损失loss.backward()  # fgsm: 在x_adv上使用梯度上升来最大化损失grad = x_adv.grad.detach()x_adv = x_adv + epsilon * grad.sign()return x_adv

(2)ifgsm算法

# 在“全局设置”部分中将alpha设置为步长 
# alpha和num_iter可以自己决定设定成何值
alpha = 0.8 / 255 / std
def ifgsm(model, x, y, loss_fn, epsilon=epsilon, alpha=alpha, num_iter=20):x_adv = x# num_iter 次迭代for i in range(num_iter):x_adv = fgsm(model, x_adv, y, loss_fn, alpha) # 用(ε=α)调用fgsm以获得新的x_adv# x_adv = x_adv.detach().clone()# x_adv.requires_grad = True  # loss = loss_fn(model(x_adv), y)  # loss.backward()  # grad = x_adv.grad.detach()# x_adv = x_adv + alpha * grad.sign()x_adv = torch.max(torch.min(x_adv, x+epsilon), x-epsilon) # x_adv 裁剪到 [x-epsilon, x+epsilon]范围return x_adv

(3)mifgsm算法

def mifgsm(model, x, y, loss_fn, epsilon=epsilon, alpha=alpha, num_iter=20, decay=1.0):x_adv = x# 初始化 momentum tensormomentum = torch.zeros_like(x).detach().to(device)# num_iter 次迭代for i in range(num_iter):x_adv = x_adv.detach().clone()x_adv.requires_grad = True  loss = loss_fn(model(x_adv), y)  loss.backward()  # TODO: Momentum calculationgrad = x_adv.grad.detach() + (1 - decay) * momentummomentum = gradx_adv = x_adv + alpha * grad.sign()x_adv = torch.max(torch.min(x_adv, x+epsilon), x-epsilon) # x_adv 裁剪到 [x-epsilon, x+epsilon]范围return x_adv

(4)EOT算法

def eot_attack(model, x, y, loss_fn, epsilon= 0.03, num_samples= 10, sigma= 0.1):best_adv_example = Nonebest_adv_loss = float('inf')for _ in range(num_samples):perturbation = torch.randn_like(x) * sigmax_adv = x + perturbationx_adv = torch.clamp(x_adv, 0, 1)  # 将像素值限制在合理范围内# 使用 fgsm 得到对抗样本x_adv = fgsm(model, x_adv, y, loss_fn, epsilon)# 计算对抗样本的损失adv_loss = loss_fn(model(x_adv), y).item()# 保留损失最小的对抗样本if adv_loss < best_adv_loss:best_adv_example = x_adv.detach()best_adv_loss = adv_lossreturn best_adv_example

3.6 算法评估

准确率越低越好,损失越大越好

(1)基准模型

from pytorchcv.model_provider import get_model as ptcv_get_modelmodel = ptcv_get_model('resnet110_cifar10', pretrained=True).to(device)
loss_fn = nn.CrossEntropyLoss()benign_acc, benign_loss = epoch_benign(model, adv_loader, loss_fn)
print(f'[ Base(未Attack图片评估) ] benign_acc = {benign_acc:.5f}, benign_loss = {benign_loss:.5f}')

[ Base(未Attack图片评估) ] benign_acc = 0.95000, benign_loss = 0.22678

(2)FGSM算法

adv_examples, fgsm_acc, fgsm_loss = gen_adv_examples(model, adv_loader, fgsm, loss_fn)
print(f'[ Attack(FGSM Attack图片评估) ] fgsm_acc = {fgsm_acc:.5f}, fgsm_loss = {fgsm_loss:.5f}')# create_dir(root, 'fgsm', adv_examples, adv_names)

[ Attack(FGSM Attack图片评估) ] fgsm_acc = 0.59000, fgsm_loss = 2.49272

(3)I-FGSM算法

adv_examples, ifgsm_acc, ifgsm_loss = gen_adv_examples(model, adv_loader, ifgsm, loss_fn)
print(f'[ Attack(I-FGSM Attack图片评估) ] ifgsm_acc = {ifgsm_acc:.5f}, ifgsm_loss = {ifgsm_loss:.5f}')create_dir(root, 'ifgsm', adv_examples, adv_names)

[ Attack(I-FGSM Attack图片评估) ] ifgsm_acc = 0.01000, ifgsm_loss = 17.30204

(4)EOT算法

adv_examples, ifgsm_acc, ifgsm_loss = gen_adv_examples(model, adv_loader, eot_attack, loss_fn)
print(f'[ Attack(I-FGSM Attack图片评估) ] ifgsm_acc = {ifgsm_acc:.5f}, ifgsm_loss = {ifgsm_loss:.5f}')create_dir(root, 'eot', adv_examples, adv_names)

[ Attack(I-FGSM Attack图片评估) ] ifgsm_acc = 0.21000, ifgsm_loss = 5.35198

(5)基于Ensemble 模型的IFGSM算法

class ensembleNet(nn.Module):def __init__(self, model_names):super().__init__()self.models = nn.ModuleList([ptcv_get_model(name, pretrained=True) for name in model_names])self.softmax = nn.Softmax(dim=1)def forward(self, x):ensemble_logits = 0for i, m in enumerate(self.models):ensemble_logits += m(x)return ensemble_logits/len(self.models)
model_names = ['nin_cifar10','resnet20_cifar10','preresnet20_cifar10'
]
ensemble_model = ensembleNet(model_names).to(device)
loss_fn = nn.CrossEntropyLoss()adv_examples, ifgsm_acc, ifgsm_loss = gen_adv_examples(ensemble_model, adv_loader, ifgsm, loss_fn)
print(f'[ Attack(I-FGSM Attack图片评估) ] ifgsm_acc = {ifgsm_acc:.5f}, ifgsm_loss = {ifgsm_loss:.5f}')# create_dir(root, 'ensemble_model_ifgsm', adv_examples, adv_names)

[ Attack(I-FGSM Attack图片评估) ] ifgsm_acc = 0.00000, ifgsm_loss = 13.37727

(6)基于Ensemble 模型的EOT算法

class ensembleNet(nn.Module):def __init__(self, model_names):super().__init__()self.models = nn.ModuleList([ptcv_get_model(name, pretrained=True) for name in model_names])self.softmax = nn.Softmax(dim=1)def forward(self, x):ensemble_logits = 0for i, m in enumerate(self.models):ensemble_logits += m(x)return ensemble_logits/len(self.models)
model_names = ['nin_cifar10','resnet20_cifar10','preresnet20_cifar10'
]
ensemble_model = ensembleNet(model_names).to(device)
loss_fn = nn.CrossEntropyLoss()adv_examples, ifgsm_acc, ifgsm_loss = gen_adv_examples(ensemble_model, adv_loader, eot_attack, loss_fn)
print(f'[ Attack(I-FGSM Attack图片评估) ] ifgsm_acc = {ifgsm_acc:.5f}, ifgsm_loss = {ifgsm_loss:.5f}')create_dir(root, 'ensemble_model_eot', adv_examples, adv_names)

[ Attack(I-FGSM Attack图片评估) ] ifgsm_acc = 0.08000, ifgsm_loss = 3.68992

3.7 可视化

import matplotlib.pyplot as pltclasses = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']plt.figure(figsize=(10, 20))
cnt = 0
for i, cls_name in enumerate(classes):path = f'{cls_name}/{cls_name}1.png'# 未Attack图片(benign image)cnt += 1plt.subplot(len(classes), 4, cnt)im = Image.open(f'./data/{path}')logit = model(transform(im).unsqueeze(0).to(device))[0]predict = logit.argmax(-1).item()prob = logit.softmax(-1)[predict].item()plt.title(f'benign: {cls_name}1.png\n{classes[predict]}: {prob:.2%}')plt.axis('off')plt.imshow(np.array(im))# Attack后图片(adversarial image)cnt += 1plt.subplot(len(classes), 4, cnt)im = Image.open(f'./ensemble_model_ifgsm/{path}')logit = model(transform(im).unsqueeze(0).to(device))[0]predict = logit.argmax(-1).item()prob = logit.softmax(-1)[predict].item()plt.title(f'adversarial: {cls_name}1.png\n{classes[predict]}: {prob:.2%}')plt.axis('off')plt.imshow(np.array(im))
plt.tight_layout()
plt.show()

可以从图中可以看到,图片的识别出现了错误,说明图片攻击成功。

在这里插入图片描述

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

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

相关文章

KBPC5010-ASEMI逆变器整流桥KBPC5010

编辑&#xff1a;ll KBPC5010-ASEMI逆变器整流桥KBPC5010 型号&#xff1a;KBPC5010 品牌&#xff1a;ASEMI 封装&#xff1a;KBPC-4 最大重复峰值反向电压&#xff1a;1000V 最大正向平均整流电流(Vdss)&#xff1a;50A 功率(Pd)&#xff1a;大功率 芯片个数&#xff…

大数据最佳实践

本文主要收录一些大数据不错的实践文章 1、数禾云上数据湖最佳实践 https://blog.51cto.com/u_15089766/2601706 该文章介绍了数禾云的数据胡实践&#xff0c;包含presto以及数据湖等组件的一些部署架构&#xff0c;文章听不错的&#xff0c;里面提到了为了避免presto与yarn计…

【EI会议征稿通知】第六届能源系统与电气电力国际学术会议(ICESEP 2024)

第六届能源系统与电气电力国际学术会议&#xff08;ICESEP 2024) 2024 6th International Conference on Energy Systems and Electrical Power 随着ICESEP (2019-2023)前5届的成功举办&#xff0c;我们很荣幸地宣布&#xff0c;由华中科技大学主办的第六届能源系统与电气电力…

【npm】node包管理工具npm的介绍和基础使用

简言 npm 是 Node.js 的 包管理器&#xff08;Package Manager&#xff09;&#xff0c;它是专门用于管理 Node.js 项目中第三方库的工具。 本文介绍下npm和其使用方法。 npm介绍 npm 是世界上最大的软件注册中心。各大洲的开源开发者都使用 npm 共享和借用软件包&#xff…

一个数据库表格缺少自动增加的字段导致添加一条数据失败

一个数据库表格缺少自动增加的字段导致添加一条数据失败。最近要整理出一个cms网站源程序&#xff0c;因此新建了一个目录&#xff0c;将需要的文件复制到该目录。复制好以后&#xff0c;试用的时候发现添加留言失败。经过数小时的查找原因&#xff0c;最后找到原因&#xff0c…

互联网智慧工地源码,“互联网+建筑大数据”SaaS微服务架构,支持PC端、手机端、数据大屏端

智慧工地源码&#xff0c;支持多端展示&#xff08;PC端、手机端、平板端&#xff09;SaaS微服务架构&#xff0c;项目监管端&#xff0c;工地管理端源码 智能时代的风暴已经融入了我们生活的每个方面&#xff0c;智能手机、iPad等移动终端智能设备已经成为我们生活的必需品。智…

能耗数据采集网关在实际生产中的应用及其带来的能效提升-天拓四方

能耗数据采集网关是一种集成多种传感器和数据通信技术的智能化设备&#xff0c;它能够实现对生产现场各类能耗数据的实时采集、存储和传输。通过网关设备&#xff0c;企业可以构建一个全面、高效的能源管理系统&#xff0c;对生产过程中的能源消耗进行实时监控和精准控制&#…

flex布局(后端工程师快上手写前端)

本文更加适合后端同学需要上手写前端本人实习前后端都干&#xff0c;只能说工作越来越难找了 不知道大家前端掌握的怎么样&#xff0c;我是来重新复习了 css前置知识&#xff08;熟悉可以不看&#xff09;&#xff1a; 1.如果父标签不设置宽高&#xff0c;那么父标签的宽高会…

logback最全日志输出,你需要的这里都有,全是干货

有工作经历的都知道&#xff0c;日志打印非常重要&#xff0c;往往是定位生产问题的唯一方式。 如果不了解日志的配置&#xff0c;先查看我另一篇文章基于springboot的logback日志管理&#xff0c;文章里面日志输出&#xff0c;分级、分文件目录&#xff0c;还有各种配置以及说…

四面体单元悬臂梁的Matlab有限元编程 | 实体单元 | Matlab源码 | 理论文本

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

全面剖析一下ThreadLocal

什么是ThreadLocal&#xff1f; ThreadLocal英文翻译过来就是&#xff1a;线程本地量&#xff0c;它其实是一种线程的隔离机制&#xff0c;保障了多线程环境下对于共享变量访问的安全性。 看到上面的定义之后&#xff0c;那么问题就来了&#xff0c;ThreadLocal是如何解决共享…

Java 中创建线程多种方式介绍

在 Java 中&#xff0c;创建线程有多种方式&#xff0c;以下是最常见的四种&#xff1a; 1. **通过继承 Thread 类** 2. **通过实现 Runnable 接口** 3. **通过实现 Callable 接口** 4. **通过使用 Executor 框架** 每种方式都有其特点和适用场…

Go编译报错 link: running gcc failed: exit status 1(已解决)

背景 在对一个开源的Go程序二次开发 重新编译时 &#xff0c; 报错截图如下 报错文字如下&#xff1a;关键信息 link: running gcc failed: exit status 1 $ go build -o orchestrator-didi -i go/cmd/orchestrator/main.go go build: -i flag is deprecated # command-li…

客服提效工具:一键回复,效率翻倍

在快节奏的工作环境中&#xff0c;每一秒都是宝贵的。对于客服人员来说&#xff0c;每天面对的是海量的咨询和回复&#xff0c;如何在保证服务质量的同时&#xff0c;提高工作效率&#xff1f;最近&#xff0c;我被同事安利了一个神奇的工具——客服宝聊天助手。这是一款专为客…

基于单片机的天然气泄漏报警系统设计论文

目 录 摘 要 I Abstract II 1 引 言 1 2天然气泄露检测报警系统的方案设计 4 2.1 方案选择 4 2.2 天然气泄露报警系统的整体设计方案 5 2.2.1天然气泄漏报警器工作原理 5 2.2.2天然气泄漏报警器的结构 5 3天然气泄露报警的硬件部分设计 7 3.1 STC89C52单片机 7 3.2 传感器的选…

IJCAI23 - Continual Learning Tutorial

前言 如果你对这篇文章感兴趣&#xff0c;可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」&#xff0c;查看完整博客分类与对应链接。 本篇 Tutorial 主要介绍了 CL 中的一些基本概念以及一些过往的方法。 Problem Definition Continual Learning 和 Increm…

【MOMO_Tips】批量将word转换为PDF格式

批量将word转换为PDF格式 1.打开文件–>选项–>自定义功能区–>开发工具–>确定 2.点开开发工具&#xff0c;选择第一个visual basic 3.进入页面后找到插入–>模块&#xff0c;就可以看到这样的画面之后将下列vba代码复制粘贴到模块中 Sub ConvertWordsToPd…

进程的内存布局与进程的虚拟地址空间

进程的内存布局 历史沿袭至今&#xff0c;C 语言程序一直都是由以下几部分组成的&#xff1a; ⚫ 正文段。也可称为代码段&#xff0c;这是 CPU 执行的机器语言指令部分&#xff0c;文本段具有只读属性&#xff0c;以防止程序由于意外而修改其指令&#xff1b;正文段是可以共…

精读《React Conf 2019 - Day1》

1 引言 React Conf 2019 在今年 10 月份举办&#xff0c;内容质量还是一如既往的高&#xff0c;如果想进一步学习前端或者 React&#xff0c;这个大会一定不能错过。 希望前端精读成为你学习成长路上的布道者&#xff0c;所以本期精读就介绍 React Conf 2019 - Day1 的相关内…

2024主流测试工具测评,总有一款适合你!

大家好&#xff01;我是测试元宝~ 在软件开发周期中&#xff0c;测试是确保产品质量的关键环节。随着企业对于软件质量的要求日益提升&#xff0c;测试人员面临着前所未有的挑战&#xff0c;“工欲善其事必先利其器”&#xff0c;选择一款高效、实用的软件测试工具&#xff0c…