| | import json |
| | import argparse |
| | import sys |
| | import logging |
| | import copy |
| | import torch |
| | import os |
| |
|
| | from trainCIL import _set_random, _set_device, print_args |
| | from attacks.AIM.AIMAttack import AIM |
| | from attacks.BASEAttack import BASEAttack |
| | from attacks.Gaker.GAKERAttack import Gaker |
| | from attacks.CGNC.CGNCAttack import CGNC |
| | from attacks.CleanSheet.CleanSheetAttack import CleanSheet |
| | from attacks.UnivIntruder.UnivIntruderAttack import UnivIntruder |
| | from attacks.SAE.SAEAttack import SAE |
| |
|
| |
|
| | def main(): |
| | args = setup_parser().parse_args() |
| | param = load_json(args.config) |
| | args = vars(args) |
| | args.update(param) |
| |
|
| | evaluate(args) |
| |
|
| |
|
| | def evaluate(args): |
| | seed_list = copy.deepcopy(args["seed"]) |
| | device = copy.deepcopy(args["device"]) |
| |
|
| | for seed in seed_list: |
| | args["seed"] = seed |
| | args["device"] = device |
| | _evaluate(args) |
| |
|
| |
|
| | def _evaluate(args): |
| | |
| | args["attack"] = True |
| |
|
| | device = 'cuda' if torch.cuda.is_available() else 'cpu' |
| | init_cls = 0 if args["init_cls"] == args["increment"] else args["init_cls"] |
| | logs_name = "logs/{}/{}/init_cls_{}/per_classes_{}/{}".format(args["model_name"], args["dataset"], init_cls, |
| | args['increment'], args["convnet_type"]) |
| | if not os.path.exists(logs_name): |
| | raise "Model is not trained yet." |
| | logs_eval_name = "logs/{}/{}/init_cls_{}/per_classes_{}/{}/eval/{}".format(args["model_name"], args["dataset"], init_cls, |
| | args['increment'], args["convnet_type"], args['attack_method']) |
| | if not os.path.exists(logs_eval_name): |
| | os.makedirs(logs_eval_name) |
| |
|
| | logfilename = "logs/{}/{}/init_cls_{}/per_classes_{}/{}/eval/{}/adv_log".format( |
| | args["model_name"], |
| | args["dataset"], |
| | init_cls, |
| | args["increment"], |
| | args["convnet_type"], |
| | args['attack_method'] |
| | ) |
| | logging.basicConfig( |
| | level=logging.INFO, |
| | format="%(asctime)s [%(filename)s] => %(message)s", |
| | handlers=[ |
| | logging.FileHandler(filename=logfilename + ".log"), |
| | logging.StreamHandler(sys.stdout), |
| | ], |
| | ) |
| |
|
| | args['epsilons'] = [0.01, 0.015, 0.03, 0.06, 0.1, 0.2] |
| | args['logs_name'] = logs_name |
| | args['logs_eval_name'] = logs_eval_name |
| | _set_random() |
| | _set_device(args) |
| | print_args(args) |
| |
|
| | |
| | if args['attack_method'] in NEW_ATTACKS: |
| | adv = init_new_attack(args, device=device) |
| | if args['attack_method'] == 'AIM' or args['attack_method'] == 'Gaker' or args['attack_method'] == 'CGNC': |
| | adv.train_generator() |
| | elif args['attack_method'] == 'SAE' or args['attack_method'] == 'UnivIntruder' or args['attack_method'] == 'CleanSheet': |
| | adv.train_adv() |
| | else: |
| | adv = init_foolbox_attack(args, device=device) |
| |
|
| | |
| | adv.run_test() |
| |
|
| |
|
| | NEW_ATTACKS = ['AIM', 'Gaker', 'CGNC', 'CleanSheet', 'UnivIntruder', 'SAE'] |
| | FOOLBOX_ATTACKS = ['L2FGM', 'FGSM', 'MIFGSM', |
| | 'L1PGD', 'L2PGD', 'LinfPGD', |
| | 'L2DeepFool', 'LinfDeepFool', 'BoundaryAttack', |
| | 'CarliniWagnerL2', 'GaussianNoise', 'UniformNoise'] |
| |
|
| | def init_new_attack(args, device='cuda', **kwargs): |
| | attack_name = args['attack_method'] |
| | models = kwargs.get('models', None) |
| |
|
| | if attack_name == 'AIM': |
| | adv = AIM(args=args, device=device) |
| | elif attack_name == 'Gaker': |
| | adv = Gaker(args=args, device=device) |
| | elif attack_name == 'CGNC': |
| | adv = CGNC(args=args, device=device) |
| | elif attack_name == 'CleanSheet': |
| | adv = CleanSheet(args=args, device=device) |
| | elif attack_name == 'UnivIntruder': |
| | adv = UnivIntruder(args=args, device=device) |
| | elif attack_name == 'SAE': |
| | adv = SAE(args=args, device=device) |
| | else: |
| | raise ValueError(f"Unknown attack method: {attack_name}") |
| |
|
| | return adv |
| |
|
| | def init_foolbox_attack(args, device='cuda', **kwargs): |
| | attack = BASEAttack(args=args, device=device) |
| | return attack |
| |
|
| | def load_json(settings_path): |
| | with open(settings_path) as data_file: |
| | param = json.load(data_file) |
| |
|
| | return param |
| |
|
| |
|
| | def setup_parser(): |
| | parser = argparse.ArgumentParser(description='Reproduce of multiple continual learning algorithms.') |
| | parser.add_argument('--config', type=str, default='exps/finetune.json', help='Json file of settings.') |
| | parser.add_argument('--batch_size', type=int, default=128, help='set the batch size.') |
| | parser.add_argument('--attack_method', type=str, default='AIM', help='set the attack method, e.g., LinfPGD, MIFGSM, AIM, Gaker, CGNC, CleanSheet, UnivIntruder, SAE.') |
| | parser.add_argument('--target_class', type=int, default=0, help='the target class, None indicates untargeted attack.') |
| | parser.add_argument('--eval', action='store_true', help='evaluation only') |
| | return parser |
| |
|
| |
|
| | if __name__ == '__main__': |
| | main() |
| |
|