【对抗攻击代码实战】对抗样本的生成——FGSM

该文章已生成可运行项目,

前言

让我们来看一下,怎么从深度学习的基本过程到对抗样本的生成?回顾一下深度学习训练的过程,通过计算预测值与实际值之间的损失函数,通过梯度下降,反向传播,更新了参数,不断减小损失函数的值,过程如下图所示:

那对抗样本的生成也可以参考这样的过程。不同的是,对抗样本的生成过程中网络参数不变(一般是训练好的分类器),通过反向传播不断地更新调整对抗样本,也是不断的减小损失函数。关于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
本文章已经生成可运行项目
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值