首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在pytorch中实现对抗性示例?

如何在pytorch中实现对抗性示例?
EN

Stack Overflow用户
提问于 2018-04-21 09:20:46
回答 3查看 967关注 0票数 6

我想重现:

来自论文https://arxiv.org/pdf/1312.6199.pdf。我想知道,如何在pytorch中真正实现这一点?我的主要困惑是,例如,对于loss_f,我使用的是torch.nn.CrossEntropy()标准。我是否只需要从以下位置更改已有的代码:

代码语言:javascript
复制
loss = criterion(outputs+r, labels)
loss.backward()

至:

代码语言:javascript
复制
loss = criterion(outputs+r, labels)
loss = loss + c * r.norm(2)
loss.backward()

或者类似的东西(当然要在优化器中包括r!)。我知道这不太正确,因为我没有显式地展示我是如何实现x+r或超立方体约束的,但这些都是我需要弄清楚的部分。

我想现在我想先把焦点放在没有超立方体的约束下。如果我们假设我可以出去,那么上面的结论是正确的吗?我只想知道:

代码语言:javascript
复制
loss = loss + c * r.norm(2)

按其应有的方式工作。

现在,如果我们包含超立方体约束,我的解将如何改变?这是“惩罚函数法”的出现吗?

https://discuss.pytorch.org/t/how-does-one-implement-adversarial-examples-in-pytorch/15668

EN

回答 3

Stack Overflow用户

发布于 2018-05-04 21:11:40

我就是这么做的。希望这对你有帮助。

代码语言:javascript
复制
#!/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)
票数 7
EN

Stack Overflow用户

发布于 2018-04-21 22:49:35

我将尝试以一种简单的方式来谈论对抗性的例子。基本上,对于属于某个类C_1的给定示例,我们希望通过添加较小的值r来修改此输入,以使其在视觉上不会发生太大变化,但会以非常高的置信度将其归入另一个类C_2。

理想情况下,我们希望r非常小,这是通过对方程的第一部分r进行L1正则化得到的。第二项损失是将输入x+r分类到新目标类C_2的损失。对于每次迭代同时优化损失,

代码语言:javascript
复制
                        x_t = x_(t-1) + r

还要确保x+r在x的某个范围内,即允许x在某个非常小的范围内变化,即可能是0.0001。这将给出x_t,它是x的一个对抗性例子,我知道这很令人困惑,但这就是实现上面等式所需的全部。希望这能有所帮助。

票数 4
EN

Stack Overflow用户

发布于 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攻击。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49951492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档