用PyTorch实战FGSM攻击:5步教你如何让AI把卡车认成猫
对抗样本(Adversarial Examples)是深度学习领域一个令人着迷又警惕的现象——它们就像AI的"视觉错觉",通过精心设计的微小扰动就能让最先进的神经网络产生荒谬的误判。想象一下,只需对像素做些人类难以察觉的调整,就能让模型把卡车认成猫,或者把停车标志看成限速标志。这种特性不仅揭示了神经网络的脆弱性,也为模型安全研究提供了重要视角。
本文将带您用PyTorch实现经典的FGSM(Fast Gradient Sign Method)攻击,通过CIFAR-10数据集演示如何让ResNet模型将卡车图像误分类为猫。不同于理论推导为主的教程,我们聚焦实战操作,从数据加载到扰动生成,步步拆解攻击原理,并可视化攻击前后的对比效果。无论您是安全研究员、AI开发者还是好奇的技术爱好者,都能从中获得对抗攻击的第一手经验。
1. 环境准备与模型加载
在开始生成对抗样本之前,我们需要搭建实验环境。这里选择PyTorch作为深度学习框架,它不仅提供便捷的自动微分功能,还内置了常用的预训练模型和数据集接口。以下是基础配置步骤:
python复制import torch
import torch.nn as nn
import torchvision
from torchvision import models, transforms, datasets
import matplotlib.pyplot as plt
import numpy as np
# 设置计算设备(优先使用GPU)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"Using device: {device}")
# 加载CIFAR-10测试集
transform = transforms.Compose([
transforms.ToTensor(),
])
test_dataset = datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=1, shuffle=True)
# 类别标签映射
cifar10_classes = ['airplane', 'automobile', 'bird', 'cat', 'deer',
'dog', 'frog', 'horse', 'ship', 'truck']
我们使用ResNet-18作为目标模型,这个中等规模的卷积神经网络在图像分类任务上表现良好。虽然原始ResNet是为ImageNet设计的,但我们可以调整最后一层使其适配CIFAR-10的10类别分类:
python复制# 加载并修改ResNet-18
model = models.resnet18(pretrained=False, num_classes=10).to(device)
model.eval() # 设置为评估模式
# 注意:实际使用时应该加载在CIFAR-10上训练好的权重
# 这里为演示简化流程,随机初始化模型参数
关键细节:模型必须处于
eval()模式,这会关闭Dropout和BatchNorm等训练特有的层,确保攻击过程中的
