我想重现:
来自论文https://arxiv.org/pdf/1312.6199.pdf。我想知道,如何在pytorch中真正实现这一点?我的主要困惑是,例如,对于loss_f
,我使用的是torch.nn.CrossEntropy()
标准。我是否只需要从以下位置更改已有的代码:
loss = criterion(outputs+r, labels)
loss.backward()
至:
loss = criterion(outputs+r, labels)
loss = loss + c * r.norm(2)
loss.backward()
或者类似的东西(当然要在优化器中包括r!)。我知道这不太正确,因为我没有显式地展示我是如何实现x+r
或超立方体约束的,但这些都是我需要弄清楚的部分。
我想现在我想先把焦点放在没有超立方体的约束下。如果我们假设我可以出去,那么上面的结论是正确的吗?我只想知道:
loss = loss + c * r.norm(2)
按其应有的方式工作。
现在,如果我们包含超立方体约束,我的解将如何改变?这是“惩罚函数法”的出现吗?
https://discuss.pytorch.org/t/how-does-one-implement-adversarial-examples-in-pytorch/15668
发布于 2018-05-04 21:11:40
我就是这么做的。希望这对你有帮助。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat Nov 18 12:39:16 2016
@author: manojacharya
"""
import torch
import torch.nn as nn
from torch.autograd import Variable
from torchvision import models,transforms
import numpy as np
from scipy.misc import imread, imresize
import os
import matplotlib.pyplot as plt
import torch.nn.functional as F
import json
normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
transform = transforms.Compose(
[transforms.ToTensor(),
normalize])
def imshow(inp, title=None):
"""Imshow for Tensor."""
plt.figure()
inp = inp.data[0]
inp = inp.numpy().transpose((1, 2, 0))
mean = np.array([0.485, 0.456, 0.406])
std = np.array([0.229, 0.224, 0.225])
inp = std * inp + mean
plt.imshow(inp)
plt.axis('off')
if title is not None:
plt.title(title)
with open('imagenet.json') as f:
imagenet_labels = json.load(f)
# In[model]:
model = models.vgg16(pretrained=True)
for param in model.parameters():
param.requires_grad = False
def predict(img):
pred_raw = model(img)
pred = F.softmax(pred_raw)
_,indices = torch.topk(pred,k=1)
for ind in indices.data.numpy().ravel():
print ("%.2f%% , class: %s , %s" %(100*pred.data[0][ind],str(ind),imagenet_labels[ind]))
# In[image ]:
peppers = imread("dog.jpg")
img = imresize(peppers,(224,224))
imgtensor = transform(img)
imgvar = Variable(imgtensor.unsqueeze(0),requires_grad=False)
imgvard = Variable(imgtensor.unsqueeze(0),requires_grad=True)
optimizer = torch.optim.Adam([imgvard], lr = 0.1)
loss_fn = nn.CrossEntropyLoss()
label = torch.LongTensor(1)
#classify the object as this label
label[0] = 80
label = Variable(label)
eps = 2/255.0
#%%
Nepochs = 50
print ("Starting ...........",predict(imgvar))
for epoch in range(Nepochs):
optimizer.zero_grad()
pred_raw = model(imgvard)
loss = loss_fn(pred_raw,label)
diff = imgvard.data - imgvar.data
imgvard.data = torch.clamp(torch.abs(diff),max=eps) + imgvar.data
loss.backward()
optimizer.step()
print('epoch: {}/{}, loss: {}'.format(
epoch + 1,Nepochs, loss.data[0]))
predict(imgvard)
print('Finished Training')
#%%
imshow(imgvard)
#%%
plt.figure()
diffimg = diff[0].numpy()
diffimg = diffimg.transpose((1,2,0))
plt.imshow(diffimg)
发布于 2018-04-21 22:49:35
我将尝试以一种简单的方式来谈论对抗性的例子。基本上,对于属于某个类C_1的给定示例,我们希望通过添加较小的值r来修改此输入,以使其在视觉上不会发生太大变化,但会以非常高的置信度将其归入另一个类C_2。
理想情况下,我们希望r非常小,这是通过对方程的第一部分r进行L1正则化得到的。第二项损失是将输入x+r分类到新目标类C_2的损失。对于每次迭代同时优化损失,
x_t = x_(t-1) + r
还要确保x+r在x的某个范围内,即允许x在某个非常小的范围内变化,即可能是0.0001。这将给出x_t,它是x的一个对抗性例子,我知道这很令人困惑,但这就是实现上面等式所需的全部。希望这能有所帮助。
发布于 2019-02-28 04:38:05
我们在https://github.com/BorealisAI/advertorch上开放了(并正在积极维护) AdverTorch工具箱,这是一个基于PyTorch的对抗性健壮性工具箱
如果有兴趣,请看一看。
https://github.com/BorealisAI/advertorch/blob/master/advertorch/attacks/lbfgs.py在那篇论文中实现了LBFGS攻击。
https://stackoverflow.com/questions/49951492
复制相似问题