Pytorch | 利用BIM/I-FGSM針對CIFAR10上的ResNet分類器進行對抗攻擊

Pytorch | 利用BIM/I-FGSM針對CIFAR10上的ResNet分類器進行對抗攻擊

  • CIFAR數據集
  • BIM介紹
    • 基本原理
    • 算法流程
  • BIM代碼實現
    • BIM算法實現
    • 攻擊效果
  • 代碼匯總
    • bim.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實現BIM/I-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個不同的類別,這些類別都是現實世界中常見的物體,具有一定的代表性。

下面是一些示例樣本:

在這里插入圖片描述

BIM介紹

BIM(Basic Iterative Method)算法,也稱為迭代快速梯度符號法(Iterative Fast Gradient Sign Method,I-FGSM),是一種基于梯度的對抗攻擊算法,以下是對它的詳細介紹:

基本原理

  • 利用模型梯度:與FGSM(Fast Gradient Sign Method)算法類似,BMI算法也是利用目標模型對輸入數據的梯度信息來生成對抗樣本。通過在原始輸入樣本上添加一個微小的擾動,使得模型對擾動后的樣本產生錯誤的分類結果。
  • 迭代更新擾動:不同于FGSM只進行一次梯度計算和擾動添加,BMI算法通過多次迭代來逐步調整擾動,每次迭代都根據當前模型對擾動后樣本的梯度來更新擾動,使得擾動更具針對性和有效性,從而增加攻擊的成功率。

算法流程

  1. 初始化:首先獲取原始的輸入圖像(x)和對應的真實標簽 y y y,并設置一些攻擊參數,如擾動量 ? \epsilon ?、步長 α \alpha α 和迭代次數 T T T 等。然后將原始圖像復制一份作為初始的對抗樣本 x a d v = x x^{adv}=x xadv=x
  2. 迭代攻擊:在每次迭代 t t t t = 1 , 2 , ? , T t = 1, 2, \cdots, T t=1,2,?,T)中,將當前的對抗樣本 x a d v x^{adv} xadv 輸入到目標模型 f f f 中,計算模型的輸出 f ( x a d v ) f(x^{adv}) f(xadv) 和損失 J ( x a d v , y ) J(x^{adv}, y) J(xadv,y),其中損失函數通常使用交叉熵損失等。接著計算損失關于對抗樣本的梯度 ? x a d v J ( x a d v , y ) \nabla_{x^{adv}}J(x^{adv}, y) ?xadv?J(xadv,y),并根據梯度的符號來更新對抗樣本: x a d v = x a d v + α ? sign ( ? x a d v J ( x a d v , y ) ) x^{adv}=x^{adv}+\alpha\cdot \text{sign}(\nabla_{x^{adv}}J(x^{adv}, y)) xadv=xadv+α?sign(?xadv?J(xadv,y))
  3. 裁剪擾動:為了確保擾動后的樣本與原始樣本在視覺上不會有太大差異,需要對更新后的對抗樣本進行裁剪,使其滿足 x a d v = clip ( x a d v , x ? ? , x + ? ) x^{adv}=\text{clip}(x^{adv}, x-\epsilon, x+\epsilon) xadv=clip(xadv,x??,x+?),即保證擾動后的樣本在原始樣本的 ? \epsilon ? 鄰域內。
  4. 終止條件判斷:經過(T)次迭代后,得到最終的對抗樣本(x^{adv}),此時將其輸入到目標模型中,若模型對其的預測結果與真實標簽不同,則攻擊成功,否則攻擊失敗。

BIM代碼實現

BIM算法實現

import torch
import torch.nn as nndef BIM(model, criterion, original_images, labels, epsilon, num_iterations=10):"""BIM (Basic Iterative Method)I-FGSM (Iterative Fast Gradient Sign Method)參數:model: 要攻擊的模型criterion: 損失函數original_images: 原始圖像labels: 原始圖像的標簽epsilon: 最大擾動幅度num_iterations: 迭代次數 """# alpha 每次迭代步長alpha = epsilon / num_iterationsperturbed_images = original_images.clone().detach().requires_grad_(True)for _ in range(num_iterations):# 計算損失outputs = model(perturbed_images)loss = criterion(outputs, labels)model.zero_grad()# 計算梯度loss.backward()# 更新對抗樣本perturbation = alpha * perturbed_images.grad.sign()perturbed_images = perturbed_images + perturbationperturbed_images = torch.clamp(perturbed_images, original_images - epsilon, original_images + epsilon)perturbed_images = perturbed_images.detach().requires_grad_(True)return perturbed_images

攻擊效果

在這里插入圖片描述

代碼匯總

bim.py

import torch
import torch.nn as nndef BIM(model, criterion, original_images, labels, epsilon, num_iterations=10):"""BIM (Basic Iterative Method)I-FGSM (Iterative Fast Gradient Sign Method)參數:model: 要攻擊的模型criterion: 損失函數original_images: 原始圖像labels: 原始圖像的標簽epsilon: 最大擾動幅度num_iterations: 迭代次數 """# alpha 每次迭代步長alpha = epsilon / num_iterationsperturbed_images = original_images.clone().detach().requires_grad_(True)for _ in range(num_iterations):# 計算損失outputs = model(perturbed_images)loss = criterion(outputs, labels)model.zero_grad()# 計算梯度loss.backward()# 更新對抗樣本perturbation = alpha * perturbed_images.grad.sign()perturbed_images = perturbed_images + perturbationperturbed_images = torch.clamp(perturbed_images, original_images - epsilon, original_images + epsilon)perturbed_images = perturbed_images.detach().requires_grad_(True)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 = 'BIM'if attack_name == 'FGSM':perturbed_images = FGSM(model, criterion, original_images, labels, epsilon)elif attack_name == 'BIM':perturbed_images = BIM(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}%')

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63905.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63905.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63905.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何更好的進行時間管理

先想一下我們想要做的事情,然后拿出Excel表格將這些事情記錄下來,我們把它叫做任務對這些任務按照重要性,緊急程度進行排序,拿出表格中的前六個任務,就是今天要做的任務新建另一張excel表格,表格的一列為時…

OpenGL —— 2.6.1、繪制一個正方體并貼圖渲染顏色(附源碼,glfw+glad)

源碼效果 C++源碼 紋理圖片 需下載stb_image.h這個解碼圖片的庫,該庫只有一個頭文件。 具體代碼: vertexShader.glsl #version

ubuntu開機進入initramfs狀態

虛擬機卡死成功起后進入了initramfs狀態,可能是跟文件系統有問題或者檢索不到根文件系統,或者是配置錯誤,系統磁盤等硬件問題導致 開機后進入如下圖的界面, 文中有一條提示 要手動fsck 命令修復 /dev/sda1 命令如下 fsck /de…

java根據Word模板實現動態填充導出

最近項目中需要導出Word&#xff0c;根據不同的信息導出不同的內容&#xff0c;包含文本、列表、圖片等&#xff0c;本文使用poi-tl實現在次做以記錄。 添加依賴 <!-- word導出 --> <dependency><groupId>com.deepoove</groupId><artifactId>po…

mindie推理大語言模型問題及解決方法匯總

問題說明 使用功能mindie 1.0 RC2推理大語言模型&#xff0c;遇到不少問題&#xff0c;記錄下解決思路。 我的硬件是910B4。 問題及解決 問題1 在docker內啟動mindie時終端報錯 Fatal Python error: PyThreadState_Get: the function must be called with the GIL held, …

Selenium 全面指南

Selenium 是一個強大的 Web 自動化工具&#xff0c;支持多種瀏覽器和語言綁定。 1. Selenium 的基本概念 WebDriver&#xff1a;Selenium 提供的核心接口&#xff0c;用于控制瀏覽器操作。顯式等待&#xff1a;等待特定條件滿足后再執行操作。隱式等待&#xff1a;全局設置一個…

Go框架比較:goframe、beego、iris和gin

由于工作需要&#xff0c;這些年來也接觸了不少的開發框架&#xff0c;Golang的開發框架比較多&#xff0c;不過基本都是Web"框架"為主。這里稍微打了個引號&#xff0c;因為大部分"框架"從設計和功能定位上來講&#xff0c;充其量都只能算是一個組件&…

【華為OD-E卷-木板 100分(python、java、c++、js、c)】

【華為OD-E卷-木板 100分&#xff08;python、java、c、js、c&#xff09;】 題目 小明有 n 塊木板&#xff0c;第 i ( 1 ≤ i ≤ n ) 塊木板長度為 ai。 小明買了一塊長度為 m 的木料&#xff0c;這塊木料可以切割成任意塊&#xff0c;拼接到已有的木板上&#xff0c;用來加…

sqlserver臨時表來做表聯查復雜查詢

使用臨時表&#xff0c;先查詢出結果&#xff0c;在用于后面表的子查詢或者聯查 -- 刪除表1if EXISTS ( SELECT 1 FROM tempdb.sys.objects where name like #temp_PublishRecord% ) beginDROP TABLE #temp_PublishRecordprint 已刪除臨時表 #temp_PublishRecordend--創…

OMG DDS 規范漫談:分布式數據交互的演進之路

一、由來與起源脈絡 OMG DDS&#xff08;Object Management Group Data Distribution Service&#xff09;的發展是計算機科學和技術進步的一個縮影&#xff0c;它反映了對高效、可靠的數據共享需求的響應。DDS 的概念萌生于20世紀90年代末&#xff0c;當時分布式計算已經從理…

1.使用 Couchbase 數倉和 Temporal(一個分布式任務調度和編排框架)實現每 5 分鐘的增量任務

在使用 Couchbase 數倉和 Temporal&#xff08;一個分布式任務調度和編排框架&#xff09;實現每 5 分鐘的增量任務時&#xff0c;可以按照以下步驟實現&#xff0c;同時需要注意關鍵點。 實現方案 1. 數據層設計&#xff08;Couchbase 增量存儲與標記&#xff09; 在 Couchb…

Spring源碼分析之AOP-@EnableAspectJAutoProxy

前言 這篇文章之前我們說了Springboot的啟動流程,Bean對象怎么實現從無到有的一個過程還有一些接口的拓展的實現等等那么從這一篇文章開始的話我們就會開始說一說我們的常用的AOP它的底層實現原理所以大家一起加油加油&#xff01;&#xff01;&#xff01; AOP: 1.簡介: AOP的…

Linux(Centos 7.6)基本信息查看

1.服務器硬件信息查看 1.1.服務器廠商、產品名稱查看 dmidecode -s system-manufacturer&#xff1a;查看服務器廠商信息 dmidecode -s system-product-name&#xff1a;查看服務器產品名稱信息 1.Windows使用VMware安裝的Linux(Centos 7.6)后&#xff0c;服務器廠商、產品名…

多個圖片轉換為PDF文件

將多個圖片轉換為PDF文件在Python中可以通過多個庫來實現&#xff0c;其中最常用的庫之一是Pillow&#xff08;用于圖像處理&#xff09;和reportlab&#xff08;用于生成PDF&#xff09;。不過&#xff0c;對于直接圖片轉PDF的操作&#xff0c;更推薦使用Pillow配合PyMuPDF&am…

小程序app封裝公用頂部篩選區uv-drop-down

參考ui:DropDown 下拉篩選 | 我的資料管理-uv-ui 是全面兼容vue32、nvue、app、h5、小程序等多端的uni-app生態框架 樣式示例&#xff1a; 封裝公用文件代碼 dropDownTemplete <template><!-- 頂部下拉篩選區封裝公用組件 --><view><uv-drop-down ref&…

LeetCode:101. 對稱二叉樹

跟著carl學算法&#xff0c;本系列博客僅做個人記錄&#xff0c;建議大家都去看carl本人的博客&#xff0c;寫的真的很好的&#xff01; 代碼隨想錄 LeetCode&#xff1a;101. 對稱二叉樹 給你一個二叉樹的根節點 root &#xff0c; 檢查它是否軸對稱。 示例 1&#xff1a; 輸…

Docker-如何啟動docker

作者介紹&#xff1a;簡歷上沒有一個精通的運維工程師。希望大家多多關注作者&#xff0c;下面的思維導圖也是預計更新的內容和當前進度(不定時更新)。 我們在上一章&#xff0c;講了虛擬化&#xff0c;虛擬化是把硬件虛擬化&#xff0c;然后創建出來的虛擬機完全隔離&#xff…

COMSOL with Matlab

文章目錄 基本介紹COMSOL with MatlabCOMSOL主Matlab輔Matlab為主Comsol為輔 操作步驟常用指令mphopenmphgeommghmeshmphmeshstatsmphnavigatormphplot常用指令mphsavemphlaunchModelUtil.clear 實例教學自動另存新檔**把語法套用到邊界條件**把語法套用到另存新檔 函數及其微分…

游戲關卡設計方法的雜感

1、正規思路是&#xff1a;先寫設計文檔&#xff0c;畫平面圖&#xff0c;再做白模關卡&#xff0c;再做正規模型的關卡。 一步步擴大。 當然是有道理的&#xff0c;從小到大&#xff0c; 但實際上這需要很強的想象力&#xff0c;很多細節靠腦補&#xff0c;初學者很難做好。…

JVM系列(十二) -常用調優命令匯總

最近對 JVM 技術知識進行了重新整理&#xff0c;再次獻上 JVM系列文章合集索引&#xff0c;感興趣的小伙伴可以直接點擊如下地址快速閱讀。 JVM系列(一) -什么是虛擬機JVM系列(二) -類的加載過程JVM系列(三) -內存布局詳解JVM系列(四) -對象的創建過程JVM系列(五) -對象的內存分…