# -*- 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