| from .base import Attack | |
| from .fgsm import FGMAttack | |
| from .fgsm import FGSMAttack | |
| from .fgsm import L2FastGradientAttack | |
| from .fgsm import LinfFastGradientAttack | |
| from .pgd import PGDAttack | |
| from .pgd import L2PGDAttack | |
| from .pgd import LinfPGDAttack | |
| from .deepfool import DeepFoolAttack | |
| from .deepfool import LinfDeepFoolAttack | |
| from .deepfool import L2DeepFoolAttack | |
| from .utils import CWLoss | |
| from .autoattack import AutoAttacks | |
| from .apgd_ce import Autoattack_apgd_ce | |
| from .squred import Squre_Attack | |
| ATTACKS = ['fgsm', 'linf-pgd', 'fgm', 'l2-pgd', 'linf-df', 'l2-df', 'linf-apgd', 'l2-apgd','squar_attack','autoattack','apgd_ce'] | |
| def create_attack(model, criterion, attack_type, attack_eps, attack_iter, attack_step, rand_init_type='uniform', | |
| clip_min=0., clip_max=1.): | |
| """ | |
| Initialize adversary. | |
| Arguments: | |
| model (nn.Module): forward pass function. | |
| criterion (nn.Module): loss function. | |
| attack_type (str): name of the attack. | |
| attack_eps (float): attack radius. | |
| attack_iter (int): number of attack iterations. | |
| attack_step (float): step size for the attack. | |
| rand_init_type (str): random initialization type for PGD (default: uniform). | |
| clip_min (float): mininum value per input dimension. | |
| clip_max (float): maximum value per input dimension. | |
| Returns: | |
| Attack | |
| """ | |
| if attack_type == 'fgsm': | |
| attack = FGSMAttack(model, criterion, eps=attack_eps, clip_min=clip_min, clip_max=clip_max) | |
| elif attack_type == 'fgm': | |
| attack = FGMAttack(model, criterion, eps=attack_eps, clip_min=clip_min, clip_max=clip_max) | |
| elif attack_type == 'linf-pgd': | |
| attack = LinfPGDAttack(model, criterion, eps=attack_eps, nb_iter=attack_iter, eps_iter=attack_step, | |
| rand_init_type=rand_init_type, clip_min=clip_min, clip_max=clip_max) | |
| elif attack_type == 'l2-pgd': | |
| attack = L2PGDAttack(model, criterion, eps=attack_eps, nb_iter=attack_iter, eps_iter=attack_step, | |
| rand_init_type=rand_init_type, clip_min=clip_min, clip_max=clip_max) | |
| elif attack_type == 'linf-df': | |
| attack = LinfDeepFoolAttack(model, overshoot=0.02, nb_iter=attack_iter, search_iter=0, clip_min=clip_min, | |
| clip_max=clip_max) | |
| elif attack_type == 'l2-df': | |
| attack = L2DeepFoolAttack(model, overshoot=0.02, nb_iter=attack_iter, search_iter=0, clip_min=clip_min, | |
| clip_max=clip_max) | |
| elif attack_type == 'squar_attack': | |
| attack = Squre_Attack(model, criterion, nb_iter=attack_iter, eps_iter=attack_step, | |
| rand_init_type=rand_init_type, clip_min=clip_min, clip_max=clip_max) | |
| elif attack_type == "autoattack": | |
| attack = AutoAttacks(model, nb_iter=attack_iter, eps=attack_eps, eps_iter=attack_step, | |
| rand_init_type=rand_init_type, clip_min=clip_min, clip_max=clip_max) | |
| elif attack_type == "apgd_ce": | |
| attack = Autoattack_apgd_ce (model, nb_iter=attack_iter, eps_iter=attack_step, | |
| rand_init_type=rand_init_type, clip_min=clip_min, clip_max=clip_max) | |
| else: | |
| raise NotImplementedError('{} is not yet implemented!'.format(attack_type)) | |
| return attack |