# -*- coding: utf-8 -*-
import torch
from torch.autograd import Variable
def fgsm(model, x, t, loss_func, eps, min=0, max=1):
if not isinstance(x, Variable):
x, t = Variable(x.cuda(), requires_grad=True), Variable(t.cuda())
x.requires_grad = True
y = model(x)
loss = loss_func(y, t)
model.zero_grad()
loss.backward(retain_graph=True)
return Variable(torch.clamp(x.data + eps * torch.sign(x.grad.data), min=min, max=max))
def accuracy(y, t):
pred = y.data.max(1, keepdim=True)[1]
acc = pred.eq(t.data.view_as(pred)).cpu().sum()
return acc