论文信息
论文标题:Explaining and Harnessing Adversarial Examples
论文作者:Ian J. Goodfellow, Jonathon Shlens, Christian Szegedy
论文来源:ICLR 2015
论文地址:download
论文代码:download
视屏讲解:click
1 介绍
对抗攻击
2 方法
扰动:
$\eta=\varepsilon \operatorname{sign}\left(\nabla_{x} J(\theta, x, y)\right)$
对抗样本:
$\tilde{x}=x+\eta$
3 代码
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 matplotlib.pyplot as plt # 这里的epsilon先设定为几个值,到时候后面可视化展示它的影响如何 epsilons = [0, .05, .1, .15, .2, .25, .3] # 这个预训练的模型需要提前下载,放在如下url的指定位置,下载链接如上 pretrained_model = "data/lenet_mnist_model.pth" use_cuda=True # 就是一个简单的模型结构 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(1, 10, kernel_size=5) self.conv2 = nn.Conv2d(10, 20, kernel_size=5) self.conv2_drop = nn.Dropout2d() self.fc1 = nn.Linear(320, 50) self.fc2 = nn.Linear(50, 10) def forward(self, x): x = F.relu(F.max_pool2d(self.conv1(x), 2)) x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2)) x = x.view(-1, 320) x = F.relu(self.fc1(x)) x = F.dropout(x, training=self.training) x = self.fc2(x) return F.log_softmax(x, dim=1) # 运行需要稍等,这里表示下载并加载数据集 test_loader = torch.utils.data.DataLoader( datasets.MNIST('../data', train=False, download=True, transform=transforms.Compose([ transforms.ToTensor(), ])), batch_size=1, shuffle=True) # 看看我们有没有配置GPU,没有就是使用cpu print("CUDA Available: ",torch.cuda.is_available()) device = torch.device("cuda" if (use_cuda and torch.cuda.is_available()) else "cpu") # Initialize the network model = Net().to(device) # 加载前面的预训练模型 model.load_state_dict(torch.load(pretrained_model, map_location='cpu')) # 设置为验证模式. model.eval()
# FGSM attack code def fgsm_attack(image, epsilon, data_grad): # 使用sign(符号)函数,将对x求了偏导的梯度进行符号化 sign_data_grad = data_grad.sign() # 通过epsilon生成对抗样本 perturbed_image = image + epsilon*sign_data_grad # 做一个剪裁的工作,将torch.clamp内部大于1的数值变为1,小于0的数值等于0,防止image越界 perturbed_image = torch.clamp(perturbed_image, 0, 1) # 返回对抗样本 return perturbed_image
def test( model, device, test_loader, epsilon ): # 准确度计数器 correct = 0 # 对抗样本 adv_examples = [] # 循环所有测试集 for data, target in test_loader: # Send the data and label to the device data, target = data.to(device), target.to(device) # Set requires_grad attribute of tensor. Important for Attack data.requires_grad = True # Forward pass the data through the model output = model(data) init_pred = output.max(1, keepdim=True)[1] # get the index of the max log-probability # If the initial prediction is wrong, dont bother attacking, just move on if init_pred.item() != target.item(): continue # Calculate the loss loss = F.nll_loss(output, target) # Zero all existing gradients model.zero_grad() # Calculate gradients of model in backward pass loss.backward() # Collect datagrad data_grad = data.grad.data # Call FGSM Attack perturbed_data = fgsm_attack(data, epsilon, data_grad) # Re-classify the perturbed image output = model(perturbed_data) # Check for success final_pred = output.max(1, keepdim=True)[1] # get the index of the max log-probability if final_pred.item() == target.item(): correct += 1 # 这里都是为后面的可视化做准备 if (epsilon == 0) and (len(adv_examples) < 5): adv_ex = perturbed_data.squeeze().detach().cpu().numpy() adv_examples.append( (init_pred.item(), final_pred.item(), adv_ex) ) else: # 这里都是为后面的可视化做准备 if len(adv_examples) < 5: adv_ex = perturbed_data.squeeze().detach().cpu().numpy() adv_examples.append( (init_pred.item(), final_pred.item(), adv_ex) ) # Calculate final accuracy for this epsilon final_acc = correct/float(len(test_loader)) print("Epsilon: {}\tTest Accuracy = {} / {} = {}".format(epsilon, correct, len(test_loader), final_acc)) # Return the accuracy and an adversarial example return final_acc, adv_examples
标签:adv,Explaining,grad,self,torch,FGSM,Adversarial,model,data From: https://www.cnblogs.com/BlairGrowing/p/17341714.html