|
|
from abc import ABCMeta |
|
|
import torch |
|
|
|
|
|
class BaseAttack(object): |
|
|
""" |
|
|
Attack base class. |
|
|
""" |
|
|
|
|
|
__metaclass__ = ABCMeta |
|
|
|
|
|
def __init__(self, model, device = 'cuda'): |
|
|
self.model = model |
|
|
self.device = device |
|
|
|
|
|
def generate(self, image, label, **kwargs): |
|
|
""" |
|
|
Overide this function for the main body of attack algorithm. |
|
|
|
|
|
Parameters |
|
|
---------- |
|
|
image : |
|
|
original image |
|
|
label : |
|
|
original label |
|
|
kwargs : |
|
|
user defined parameters |
|
|
""" |
|
|
return input |
|
|
|
|
|
def parse_params(self, **kwargs): |
|
|
""" |
|
|
Parse user defined parameters. |
|
|
""" |
|
|
return True |
|
|
|
|
|
def check_type_device(self, image, label): |
|
|
""" |
|
|
Check device, match variable type to device type. |
|
|
|
|
|
Parameters |
|
|
---------- |
|
|
image : |
|
|
image |
|
|
label : |
|
|
label |
|
|
""" |
|
|
|
|
|
|
|
|
if self.device == 'cuda': |
|
|
image = image.cuda() |
|
|
label = label.cuda() |
|
|
self.model = self.model.cuda() |
|
|
elif self.device == 'cpu': |
|
|
image = image.cpu() |
|
|
label = label.cpu() |
|
|
self.model = self.model.cpu() |
|
|
else: |
|
|
raise ValueError('Please input cpu or cuda') |
|
|
|
|
|
|
|
|
if type(image).__name__ == 'Tensor': |
|
|
image = image.float() |
|
|
image = image.float().clone().detach().requires_grad_(True) |
|
|
elif type(image).__name__ == 'ndarray': |
|
|
image = image.astype('float') |
|
|
image = torch.tensor(image, requires_grad=True) |
|
|
else: |
|
|
raise ValueError('Input values only take numpy arrays or torch tensors') |
|
|
|
|
|
if type(label).__name__ == 'Tensor': |
|
|
label = label.long() |
|
|
elif type(label).__name__ == 'ndarray': |
|
|
label = label.astype('long') |
|
|
label = torch.tensor(y) |
|
|
else: |
|
|
raise ValueError('Input labels only take numpy arrays or torch tensors') |
|
|
|
|
|
|
|
|
|
|
|
self.image = image |
|
|
self.label = label |
|
|
|
|
|
return True |
|
|
|
|
|
def get_or_predict_lable(self, image): |
|
|
output = self.model(image) |
|
|
pred = output.argmax(dim=1, keepdim=True) |
|
|
return(pred) |
|
|
|