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