前言
让我们来看一下,怎么从深度学习的基本过程到对抗样本的生成?回顾一下深度学习训练的过程,通过计算预测值与实际值之间的损失函数,通过梯度下降,反向传播,更新了参数,不断减小损失函数的值,过程如下图所示:
那对抗样本的生成也可以参考这样的过程。不同的是,对抗样本的生成过程中网络参数不变(一般是训练好的分类器),通过反向传播不断地更新调整对抗样本,也是不断的减小损失函数。关于loss函数这篇有讲到:来自人类的恶意:对抗攻击

基于优化的对抗样本
基于优化方法的对抗样本生成与深度学习训练过程类似,核心代码如下:
optimizer = torch.optim.Adam([img])(优化的对象是img)
代码参考自:AI安全之对抗样本
# 攻击的模型是alexnet
model = models.alexnet(pretrained=True).to(device).eval()
# 先预测出这张img的标签,需要先取他的数据再转移到cpu再转成numpy
label = np.argmax(model(img).data.cpu().numpy())
print("label={}".format(label))
# 图像数据梯度可以获取
img.requires_grad = True
# 设置为不保存梯度值 自然也无法修改
for param in model.parameters():
param.requires_grad = False
# 注意这里,和一般的深度学习训练不一样
optimizer = torch.optim.Adam([img],lr=0.01)
loss_func = torch.nn.CrossEntropyLoss()
epochs = 100
target = 288 # 定向攻击的标签
target = Variable(torch.Tensor([float(target)]).to(device).long())
for epoch in range(epochs):
# 梯度清零
optimizer.zero_grad()
# forward + backward
output = model(img)
loss = loss_func(output, target)
label = np.argmax(output.data.cpu().numpy())
print("epoch={} loss={} label={}".format(epoch, loss, label))
# 如果定向攻击成功
if label == target:
break
loss.backward()
optimizer.step()
FGSM
之前是用优化的方法,现在考虑的是用梯度来生成对抗样本——Fast Gradient Sign Method(FGSM)
论文链接:Explaining andHarnessing Adversarial Examples
论文笔记链接:click here
代码参考于pytorch官网:fgsm_tutoriall
1.首先导入相关包和参数设置:
预训练模型下载:lenet_mnist_model.pth
也可以通过训练文件重新训练模型:example-mnist
from __future__ import print_function
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
import numpy as np
import matp

最低0.47元/天 解锁文章
2386

被折叠的 条评论
为什么被折叠?



