diff --git a/examples/mnist_example.py b/examples/mnist_example.py index e2f8b04..cbca03b 100644 --- a/examples/mnist_example.py +++ b/examples/mnist_example.py @@ -1,5 +1,5 @@ import os -from secml2.trackers.trackers import ( +from secmlt.trackers.trackers import ( LossTracker, PredictionTracker, PerturbationNormTracker, @@ -8,12 +8,12 @@ import torchvision.datasets from torch.utils.data import DataLoader, Subset from robustbench.utils import download_gdrive -from secml2.adv.backends import Backends -from secml2.adv.evasion.pgd import PGD -from secml2.adv.evasion.perturbation_models import PerturbationModels +from secmlt.adv.backends import Backends +from secmlt.adv.evasion.pgd import PGD +from secmlt.adv.evasion.perturbation_models import PerturbationModels -from secml2.metrics.classification import Accuracy -from secml2.models.pytorch.base_pytorch_nn import BasePytorchClassifier +from secmlt.metrics.classification import Accuracy +from secmlt.models.pytorch.base_pytorch_nn import BasePytorchClassifier class MNISTNet(torch.nn.Module): diff --git a/examples/mnist_example_tensorboard.py b/examples/mnist_example_tensorboard.py index f9e341f..3f14dd2 100644 --- a/examples/mnist_example_tensorboard.py +++ b/examples/mnist_example_tensorboard.py @@ -1,23 +1,24 @@ import os -from secml2.trackers.image_trackers import GradientsTracker, SampleTracker -from secml2.trackers.trackers import ( +from secmlt.trackers import ( GradientNormTracker, LossTracker, PredictionTracker, PerturbationNormTracker, TensorboardTracker, + GradientsTracker, + SampleTracker, ScoresTracker, ) import torch import torchvision.datasets from torch.utils.data import DataLoader, Subset from robustbench.utils import download_gdrive -from secml2.adv.backends import Backends -from secml2.adv.evasion.pgd import PGD -from secml2.adv.evasion.perturbation_models import PerturbationModels +from secmlt.adv.backends import Backends +from secmlt.adv.evasion.pgd import PGD +from secmlt.adv.evasion.perturbation_models import PerturbationModels -from secml2.metrics.classification import Accuracy -from secml2.models.pytorch.base_pytorch_nn import BasePytorchClassifier +from secmlt.metrics.classification import Accuracy +from secmlt.models.pytorch.base_pytorch_nn import BasePytorchClassifier class MNISTNet(torch.nn.Module): diff --git a/examples/run_evasion_attack.py b/examples/run_evasion_attack.py index 126d942..b36ef61 100644 --- a/examples/run_evasion_attack.py +++ b/examples/run_evasion_attack.py @@ -1,11 +1,11 @@ import torchvision.datasets from torch.utils.data import DataLoader, Subset -from secml2.adv.backends import Backends -from secml2.adv.evasion.pgd import PGD -from secml2.adv.evasion.perturbation_models import PerturbationModels +from secmlt.adv.backends import Backends +from secmlt.adv.evasion.pgd import PGD +from secmlt.adv.evasion.perturbation_models import PerturbationModels -from secml2.metrics.classification import Accuracy -from secml2.models.pytorch.base_pytorch_nn import BasePytorchClassifier +from secmlt.metrics.classification import Accuracy +from secmlt.models.pytorch.base_pytorch_nn import BasePytorchClassifier from robustbench.utils import load_model diff --git a/examples/train_model.py b/examples/train_model.py index 289d80f..2b40fce 100644 --- a/examples/train_model.py +++ b/examples/train_model.py @@ -3,9 +3,9 @@ from torch.optim import Adam from torch.utils.data import DataLoader -from secml2.metrics.classification import Accuracy -from secml2.models.pytorch.base_pytorch_nn import BasePytorchClassifier -from secml2.models.pytorch.base_pytorch_trainer import BasePyTorchTrainer +from secmlt.metrics.classification import Accuracy +from secmlt.models.pytorch.base_pytorch_nn import BasePytorchClassifier +from secmlt.models.pytorch.base_pytorch_trainer import BasePyTorchTrainer class MNISTNet(torch.nn.Module): diff --git a/setup.py b/setup.py index b4179f5..6036d43 100644 --- a/setup.py +++ b/setup.py @@ -24,9 +24,9 @@ """ setup( - name="secml2", + name="secml-torch", version="1.0.0", - description="SecML 2.0 Library", + description="SecML-Torch Library", classifiers=[_f for _f in CLASSIFIERS.split("\n") if _f], long_description=long_description, long_description_context_type="text/markdown", @@ -40,8 +40,6 @@ author="Maura Pintor, Luca Demetrio", author_email="maura.pintor@unica.it, luca.demetrio@unige.it", install_requires=["torch>=1.4,!=1.5.*", "torchvision>=0.5,!=0.6.*"], - extras_require={ - "foolbox": ["foolbox>=3.3.0"], - }, + extras_require={"foolbox": ["foolbox>=3.3.0"], "tensorboard": ["tensorboard"]}, python_requires=">=3.7", ) diff --git a/src/secml2/trackers/__init__.py b/src/secml2/trackers/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/secml2/__init__.py b/src/secmlt/__init__.py similarity index 100% rename from src/secml2/__init__.py rename to src/secmlt/__init__.py diff --git a/src/secml2/adv/__init__.py b/src/secmlt/adv/__init__.py similarity index 100% rename from src/secml2/adv/__init__.py rename to src/secmlt/adv/__init__.py diff --git a/src/secml2/adv/backends.py b/src/secmlt/adv/backends.py similarity index 100% rename from src/secml2/adv/backends.py rename to src/secmlt/adv/backends.py diff --git a/src/secml2/adv/evasion/__init__.py b/src/secmlt/adv/evasion/__init__.py similarity index 100% rename from src/secml2/adv/evasion/__init__.py rename to src/secmlt/adv/evasion/__init__.py diff --git a/src/secml2/adv/evasion/base_evasion_attack.py b/src/secmlt/adv/evasion/base_evasion_attack.py similarity index 95% rename from src/secml2/adv/evasion/base_evasion_attack.py rename to src/secmlt/adv/evasion/base_evasion_attack.py index b223b3b..7dc075f 100644 --- a/src/secml2/adv/evasion/base_evasion_attack.py +++ b/src/secmlt/adv/evasion/base_evasion_attack.py @@ -1,15 +1,15 @@ from abc import abstractmethod from typing import Callable, List, Type, Union -from secml2.adv.evasion.perturbation_models import PerturbationModels +from secmlt.adv.evasion.perturbation_models import PerturbationModels import torch from torch.utils.data import DataLoader, TensorDataset -from secml2.adv.backends import Backends -from secml2.models.base_model import BaseModel +from secmlt.adv.backends import Backends +from secmlt.models.base_model import BaseModel # lazy evaluation to avoid circular imports -TRACKER_TYPE = "secml2.trackers.tracker.Tracker" +TRACKER_TYPE = "secmlt.trackers.tracker.Tracker" class BaseEvasionAttackCreator: diff --git a/src/secml2/adv/evasion/composite_attack.py b/src/secmlt/adv/evasion/composite_attack.py similarity index 89% rename from src/secml2/adv/evasion/composite_attack.py rename to src/secmlt/adv/evasion/composite_attack.py index 4c6be9f..13eb45b 100644 --- a/src/secml2/adv/evasion/composite_attack.py +++ b/src/secmlt/adv/evasion/composite_attack.py @@ -1,18 +1,18 @@ from typing import Union, List, Type -from secml2.adv.evasion.perturbation_models import PerturbationModels +from secmlt.adv.evasion.perturbation_models import PerturbationModels import torch.nn from torch.nn import CrossEntropyLoss from torch.optim import Optimizer from functools import partial -from secml2.adv.evasion.base_evasion_attack import BaseEvasionAttack -from secml2.manipulations.manipulation import Manipulation -from secml2.models.base_model import BaseModel -from secml2.optimization.constraints import Constraint -from secml2.optimization.gradient_processing import GradientProcessing -from secml2.optimization.initializer import Initializer -from secml2.optimization.optimizer_factory import OptimizerFactory -from secml2.trackers.trackers import Tracker +from secmlt.adv.evasion.base_evasion_attack import BaseEvasionAttack +from secmlt.manipulations.manipulation import Manipulation +from secmlt.models.base_model import BaseModel +from secmlt.optimization.constraints import Constraint +from secmlt.optimization.gradient_processing import GradientProcessing +from secmlt.optimization.initializer import Initializer +from secmlt.optimization.optimizer_factory import OptimizerFactory +from secmlt.trackers.trackers import Tracker CE_LOSS = "ce_loss" LOGIT_LOSS = "logit_loss" diff --git a/src/secml2/adv/evasion/foolbox_attacks/__init__.py b/src/secmlt/adv/evasion/foolbox_attacks/__init__.py similarity index 100% rename from src/secml2/adv/evasion/foolbox_attacks/__init__.py rename to src/secmlt/adv/evasion/foolbox_attacks/__init__.py diff --git a/src/secml2/adv/evasion/foolbox_attacks/foolbox_base.py b/src/secmlt/adv/evasion/foolbox_attacks/foolbox_base.py similarity index 91% rename from src/secml2/adv/evasion/foolbox_attacks/foolbox_base.py rename to src/secmlt/adv/evasion/foolbox_attacks/foolbox_base.py index 896669f..45f2d78 100644 --- a/src/secml2/adv/evasion/foolbox_attacks/foolbox_base.py +++ b/src/secmlt/adv/evasion/foolbox_attacks/foolbox_base.py @@ -1,10 +1,10 @@ from typing import Optional, Type, Union -from secml2.models.pytorch.base_pytorch_nn import BasePytorchClassifier -from secml2.models.base_model import BaseModel +from secmlt.models.pytorch.base_pytorch_nn import BasePytorchClassifier +from secmlt.models.base_model import BaseModel from foolbox.attacks.base import Attack from foolbox.models.pytorch import PyTorchModel from foolbox.criteria import Misclassification, TargetedMisclassification -from secml2.adv.evasion.base_evasion_attack import BaseEvasionAttack, TRACKER_TYPE +from secmlt.adv.evasion.base_evasion_attack import BaseEvasionAttack, TRACKER_TYPE import torch diff --git a/src/secml2/adv/evasion/foolbox_attacks/foolbox_pgd.py b/src/secmlt/adv/evasion/foolbox_attacks/foolbox_pgd.py similarity index 91% rename from src/secml2/adv/evasion/foolbox_attacks/foolbox_pgd.py rename to src/secmlt/adv/evasion/foolbox_attacks/foolbox_pgd.py index 922ca2f..d67c8ef 100644 --- a/src/secml2/adv/evasion/foolbox_attacks/foolbox_pgd.py +++ b/src/secmlt/adv/evasion/foolbox_attacks/foolbox_pgd.py @@ -1,6 +1,6 @@ from typing import Optional -from secml2.adv.evasion.foolbox_attacks.foolbox_base import BaseFoolboxEvasionAttack -from secml2.adv.evasion.perturbation_models import PerturbationModels +from secmlt.adv.evasion.foolbox_attacks.foolbox_base import BaseFoolboxEvasionAttack +from secmlt.adv.evasion.perturbation_models import PerturbationModels from foolbox.attacks.projected_gradient_descent import ( L1ProjectedGradientDescentAttack, diff --git a/src/secml2/adv/evasion/perturbation_models.py b/src/secmlt/adv/evasion/perturbation_models.py similarity index 100% rename from src/secml2/adv/evasion/perturbation_models.py rename to src/secmlt/adv/evasion/perturbation_models.py diff --git a/src/secml2/adv/evasion/pgd.py b/src/secmlt/adv/evasion/pgd.py similarity index 88% rename from src/secml2/adv/evasion/pgd.py rename to src/secmlt/adv/evasion/pgd.py index 1a7a5ad..344f374 100644 --- a/src/secml2/adv/evasion/pgd.py +++ b/src/secmlt/adv/evasion/pgd.py @@ -6,24 +6,24 @@ LinfProjectedGradientDescentAttack, ) -from secml2.adv.backends import Backends -from secml2.adv.evasion import BaseFoolboxEvasionAttack -from secml2.adv.evasion.base_evasion_attack import ( +from secmlt.adv.backends import Backends +from secmlt.adv.evasion import BaseFoolboxEvasionAttack +from secmlt.adv.evasion.base_evasion_attack import ( BaseEvasionAttackCreator, ) -from secml2.adv.evasion.composite_attack import CompositeEvasionAttack, CE_LOSS -from secml2.adv.evasion.perturbation_models import PerturbationModels -from secml2.manipulations.manipulation import AdditiveManipulation -from secml2.optimization.constraints import ( +from secmlt.adv.evasion.composite_attack import CompositeEvasionAttack, CE_LOSS +from secmlt.adv.evasion.perturbation_models import PerturbationModels +from secmlt.manipulations.manipulation import AdditiveManipulation +from secmlt.optimization.constraints import ( ClipConstraint, L1Constraint, L2Constraint, LInfConstraint, ) -from secml2.optimization.gradient_processing import LinearProjectionGradientProcessing -from secml2.optimization.initializer import Initializer -from secml2.optimization.optimizer_factory import OptimizerFactory -from secml2.trackers.trackers import Tracker +from secmlt.optimization.gradient_processing import LinearProjectionGradientProcessing +from secmlt.optimization.initializer import Initializer +from secmlt.optimization.optimizer_factory import OptimizerFactory +from secmlt.trackers.trackers import Tracker class PGD(BaseEvasionAttackCreator): diff --git a/src/secml2/data/__init__.py b/src/secmlt/data/__init__.py similarity index 100% rename from src/secml2/data/__init__.py rename to src/secmlt/data/__init__.py diff --git a/src/secml2/data/sklearn_dataset.py b/src/secmlt/data/sklearn_dataset.py similarity index 100% rename from src/secml2/data/sklearn_dataset.py rename to src/secmlt/data/sklearn_dataset.py diff --git a/src/secml2/manipulations/__init__.py b/src/secmlt/manipulations/__init__.py similarity index 100% rename from src/secml2/manipulations/__init__.py rename to src/secmlt/manipulations/__init__.py diff --git a/src/secml2/manipulations/manipulation.py b/src/secmlt/manipulations/manipulation.py similarity index 96% rename from src/secml2/manipulations/manipulation.py rename to src/secmlt/manipulations/manipulation.py index 2af07d4..3027cca 100644 --- a/src/secml2/manipulations/manipulation.py +++ b/src/secmlt/manipulations/manipulation.py @@ -3,7 +3,7 @@ import torch -from secml2.optimization.constraints import Constraint +from secmlt.optimization.constraints import Constraint class Manipulation(ABC): diff --git a/src/secml2/metrics/__init__.py b/src/secmlt/metrics/__init__.py similarity index 100% rename from src/secml2/metrics/__init__.py rename to src/secmlt/metrics/__init__.py diff --git a/src/secml2/metrics/classification.py b/src/secmlt/metrics/classification.py similarity index 95% rename from src/secml2/metrics/classification.py rename to src/secmlt/metrics/classification.py index b2d51fd..954e876 100644 --- a/src/secml2/metrics/classification.py +++ b/src/secmlt/metrics/classification.py @@ -1,7 +1,7 @@ import torch from torch.utils.data import DataLoader -from secml2.models.base_model import BaseModel +from secmlt.models.base_model import BaseModel def accuracy(y_pred: torch.Tensor, y_true: torch.Tensor) -> torch.Tensor: diff --git a/src/secml2/metrics/test/__init__.py b/src/secmlt/metrics/test/__init__.py similarity index 100% rename from src/secml2/metrics/test/__init__.py rename to src/secmlt/metrics/test/__init__.py diff --git a/src/secml2/models/__init__.py b/src/secmlt/models/__init__.py similarity index 100% rename from src/secml2/models/__init__.py rename to src/secmlt/models/__init__.py diff --git a/src/secml2/models/base_model.py b/src/secmlt/models/base_model.py similarity index 91% rename from src/secml2/models/base_model.py rename to src/secmlt/models/base_model.py index f1cb06f..b1659ad 100644 --- a/src/secml2/models/base_model.py +++ b/src/secmlt/models/base_model.py @@ -4,10 +4,10 @@ import torch from torch.utils.data import DataLoader -from secml2.models.data_processing.identity_data_processing import ( +from secmlt.models.data_processing.identity_data_processing import ( IdentityDataProcessing, ) -from secml2.models.data_processing.data_processing import DataProcessing +from secmlt.models.data_processing.data_processing import DataProcessing class BaseModel(ABC): diff --git a/src/secml2/models/base_trainer.py b/src/secmlt/models/base_trainer.py similarity index 100% rename from src/secml2/models/base_trainer.py rename to src/secmlt/models/base_trainer.py diff --git a/src/secml2/models/data_processing/__init__.py b/src/secmlt/models/data_processing/__init__.py similarity index 100% rename from src/secml2/models/data_processing/__init__.py rename to src/secmlt/models/data_processing/__init__.py diff --git a/src/secml2/models/data_processing/data_processing.py b/src/secmlt/models/data_processing/data_processing.py similarity index 100% rename from src/secml2/models/data_processing/data_processing.py rename to src/secmlt/models/data_processing/data_processing.py diff --git a/src/secml2/models/data_processing/identity_data_processing.py b/src/secmlt/models/data_processing/identity_data_processing.py similarity index 77% rename from src/secml2/models/data_processing/identity_data_processing.py rename to src/secmlt/models/data_processing/identity_data_processing.py index 13452a6..c3005aa 100644 --- a/src/secml2/models/data_processing/identity_data_processing.py +++ b/src/secmlt/models/data_processing/identity_data_processing.py @@ -1,6 +1,6 @@ import torch -from secml2.models.data_processing.data_processing import DataProcessing +from secmlt.models.data_processing.data_processing import DataProcessing class IdentityDataProcessing(DataProcessing): diff --git a/src/secml2/models/data_processing/test/__init__.py b/src/secmlt/models/data_processing/test/__init__.py similarity index 100% rename from src/secml2/models/data_processing/test/__init__.py rename to src/secmlt/models/data_processing/test/__init__.py diff --git a/src/secml2/models/pytorch/__init__.py b/src/secmlt/models/pytorch/__init__.py similarity index 100% rename from src/secml2/models/pytorch/__init__.py rename to src/secmlt/models/pytorch/__init__.py diff --git a/src/secml2/models/pytorch/base_pytorch_nn.py b/src/secmlt/models/pytorch/base_pytorch_nn.py similarity index 91% rename from src/secml2/models/pytorch/base_pytorch_nn.py rename to src/secmlt/models/pytorch/base_pytorch_nn.py index e542038..54a5c20 100644 --- a/src/secml2/models/pytorch/base_pytorch_nn.py +++ b/src/secmlt/models/pytorch/base_pytorch_nn.py @@ -1,9 +1,9 @@ import torch from torch.utils.data import DataLoader -from secml2.models.base_model import BaseModel -from secml2.models.data_processing.data_processing import DataProcessing -from secml2.models.pytorch.base_pytorch_trainer import BasePyTorchTrainer +from secmlt.models.base_model import BaseModel +from secmlt.models.data_processing.data_processing import DataProcessing +from secmlt.models.pytorch.base_pytorch_trainer import BasePyTorchTrainer class BasePytorchClassifier(BaseModel): diff --git a/src/secml2/models/pytorch/base_pytorch_trainer.py b/src/secmlt/models/pytorch/base_pytorch_trainer.py similarity index 95% rename from src/secml2/models/pytorch/base_pytorch_trainer.py rename to src/secmlt/models/pytorch/base_pytorch_trainer.py index ad5aca5..5e89779 100644 --- a/src/secml2/models/pytorch/base_pytorch_trainer.py +++ b/src/secmlt/models/pytorch/base_pytorch_trainer.py @@ -2,7 +2,7 @@ from torch.optim.lr_scheduler import _LRScheduler # noqa from torch.utils.data import DataLoader -from secml2.models.base_trainer import BaseTrainer +from secmlt.models.base_trainer import BaseTrainer class BasePyTorchTrainer(BaseTrainer): diff --git a/src/secml2/models/pytorch/test/__init__.py b/src/secmlt/models/pytorch/test/__init__.py similarity index 100% rename from src/secml2/models/pytorch/test/__init__.py rename to src/secmlt/models/pytorch/test/__init__.py diff --git a/src/secml2/models/pytorch/test/base_pytorch.py b/src/secmlt/models/pytorch/test/base_pytorch.py similarity index 100% rename from src/secml2/models/pytorch/test/base_pytorch.py rename to src/secmlt/models/pytorch/test/base_pytorch.py diff --git a/src/secml2/models/pytorch/test/test_pytorch_nn.py b/src/secmlt/models/pytorch/test/test_pytorch_nn.py similarity index 100% rename from src/secml2/models/pytorch/test/test_pytorch_nn.py rename to src/secmlt/models/pytorch/test/test_pytorch_nn.py diff --git a/src/secml2/models/pytorch/test/test_pytorch_trainer.py b/src/secmlt/models/pytorch/test/test_pytorch_trainer.py similarity index 100% rename from src/secml2/models/pytorch/test/test_pytorch_trainer.py rename to src/secmlt/models/pytorch/test/test_pytorch_trainer.py diff --git a/src/secml2/models/sklearn/__init__.py b/src/secmlt/models/sklearn/__init__.py similarity index 100% rename from src/secml2/models/sklearn/__init__.py rename to src/secmlt/models/sklearn/__init__.py diff --git a/src/secml2/models/sklearn/base_sklearn_model.py b/src/secmlt/models/sklearn/base_sklearn_model.py similarity index 100% rename from src/secml2/models/sklearn/base_sklearn_model.py rename to src/secmlt/models/sklearn/base_sklearn_model.py diff --git a/src/secml2/models/sklearn/test/__init__.py b/src/secmlt/models/sklearn/test/__init__.py similarity index 100% rename from src/secml2/models/sklearn/test/__init__.py rename to src/secmlt/models/sklearn/test/__init__.py diff --git a/src/secml2/models/tensorflow/__init__.py b/src/secmlt/models/tensorflow/__init__.py similarity index 100% rename from src/secml2/models/tensorflow/__init__.py rename to src/secmlt/models/tensorflow/__init__.py diff --git a/src/secml2/models/tensorflow/base_tensorflow_nn.py b/src/secmlt/models/tensorflow/base_tensorflow_nn.py similarity index 100% rename from src/secml2/models/tensorflow/base_tensorflow_nn.py rename to src/secmlt/models/tensorflow/base_tensorflow_nn.py diff --git a/src/secml2/models/tensorflow/base_tensorflow_trainer.py b/src/secmlt/models/tensorflow/base_tensorflow_trainer.py similarity index 100% rename from src/secml2/models/tensorflow/base_tensorflow_trainer.py rename to src/secmlt/models/tensorflow/base_tensorflow_trainer.py diff --git a/src/secml2/models/test/__init__.py b/src/secmlt/models/test/__init__.py similarity index 100% rename from src/secml2/models/test/__init__.py rename to src/secmlt/models/test/__init__.py diff --git a/src/secml2/optimization/__init__.py b/src/secmlt/optimization/__init__.py similarity index 100% rename from src/secml2/optimization/__init__.py rename to src/secmlt/optimization/__init__.py diff --git a/src/secml2/optimization/constraints.py b/src/secmlt/optimization/constraints.py similarity index 100% rename from src/secml2/optimization/constraints.py rename to src/secmlt/optimization/constraints.py diff --git a/src/secml2/optimization/gradient_processing.py b/src/secmlt/optimization/gradient_processing.py similarity index 94% rename from src/secml2/optimization/gradient_processing.py rename to src/secmlt/optimization/gradient_processing.py index b4039b0..6875400 100644 --- a/src/secml2/optimization/gradient_processing.py +++ b/src/secmlt/optimization/gradient_processing.py @@ -1,7 +1,7 @@ import torch.linalg from torch.nn.functional import normalize -from secml2.adv.evasion.perturbation_models import PerturbationModels +from secmlt.adv.evasion.perturbation_models import PerturbationModels class GradientProcessing: diff --git a/src/secml2/optimization/initializer.py b/src/secmlt/optimization/initializer.py similarity index 88% rename from src/secml2/optimization/initializer.py rename to src/secmlt/optimization/initializer.py index 9fff9b3..c476b11 100644 --- a/src/secml2/optimization/initializer.py +++ b/src/secmlt/optimization/initializer.py @@ -1,6 +1,6 @@ import torch -from secml2.adv.evasion.perturbation_models import PerturbationModels +from secmlt.adv.evasion.perturbation_models import PerturbationModels class Initializer: diff --git a/src/secml2/optimization/optimizer_factory.py b/src/secmlt/optimization/optimizer_factory.py similarity index 100% rename from src/secml2/optimization/optimizer_factory.py rename to src/secmlt/optimization/optimizer_factory.py diff --git a/src/secmlt/trackers/__init__.py b/src/secmlt/trackers/__init__.py new file mode 100644 index 0000000..a51fbab --- /dev/null +++ b/src/secmlt/trackers/__init__.py @@ -0,0 +1,9 @@ +try: + import tensorboard +except ImportError: + pass # tensorboard is an extra +else: + from .tensorboard_tracker import TensorboardTracker + +from .trackers import * +from .image_trackers import * diff --git a/src/secml2/trackers/image_trackers.py b/src/secmlt/trackers/image_trackers.py similarity index 87% rename from src/secml2/trackers/image_trackers.py rename to src/secmlt/trackers/image_trackers.py index d0a526b..77ffa83 100644 --- a/src/secml2/trackers/image_trackers.py +++ b/src/secmlt/trackers/image_trackers.py @@ -1,5 +1,5 @@ -from secml2.adv.evasion.perturbation_models import PerturbationModels -from secml2.trackers.trackers import IMAGE, Tracker +from secmlt.adv.evasion.perturbation_models import PerturbationModels +from secmlt.trackers.trackers import IMAGE, Tracker import torch diff --git a/src/secmlt/trackers/tensorboard_tracker.py b/src/secmlt/trackers/tensorboard_tracker.py new file mode 100644 index 0000000..3840257 --- /dev/null +++ b/src/secmlt/trackers/tensorboard_tracker.py @@ -0,0 +1,59 @@ +from typing import List, Type +from secmlt.trackers.trackers import ( + IMAGE, + MULTI_SCALAR, + SCALAR, + GradientNormTracker, + LossTracker, + Tracker, +) +import torch +from torch.utils.tensorboard import SummaryWriter + + +class TensorboardTracker(Tracker): + def __init__(self, logdir: str, trackers: List[Type[Tracker]] = None): + super().__init__("Tensorboard") + if trackers is None: + trackers = [ + LossTracker(), + GradientNormTracker(), + ] + self.writer = SummaryWriter(log_dir=logdir) + self.trackers = trackers + + def track( + self, + iteration: int, + loss: torch.Tensor, + scores: torch.Tensor, + x_adv: torch.tensor, + delta: torch.Tensor, + grad: torch.Tensor, + ): + for tracker in self.trackers: + tracker.track(iteration, loss, scores, x_adv, delta, grad) + tracked_value = tracker.get_last_tracked() + for i, sample in enumerate(tracked_value): + if tracker.tracked_type == SCALAR: + self.writer.add_scalar( + f"Sample #{i}/{tracker.name}", sample, global_step=iteration + ) + elif tracker.tracked_type == MULTI_SCALAR: + self.writer.add_scalars( + main_tag=f"Sample #{i}/{tracker.name}", + tag_scalar_dict={ + f"Sample #{i}/{tracker.name}{j}": v + for j, v in enumerate(sample) + }, + global_step=iteration, + ) + elif tracker.tracked_type == IMAGE: + self.writer.add_image( + f"Sample #{i}/{tracker.name}", sample, global_step=iteration + ) + + def get_last_tracked(self): + return NotImplementedError( + "Last tracked value is not available for this tracker." + ) diff --git a/src/secml2/trackers/trackers.py b/src/secmlt/trackers/trackers.py similarity index 62% rename from src/secml2/trackers/trackers.py rename to src/secmlt/trackers/trackers.py index 3cabd52..d6accb1 100644 --- a/src/secml2/trackers/trackers.py +++ b/src/secmlt/trackers/trackers.py @@ -1,9 +1,8 @@ from abc import ABC -from typing import Union, List, Type -from secml2.adv.evasion.perturbation_models import PerturbationModels +from typing import Union +from secmlt.adv.evasion.perturbation_models import PerturbationModels import torch -from torch.utils.tensorboard import SummaryWriter SCALAR = "scalar" IMAGE = "image" @@ -129,51 +128,3 @@ def track( ) -> None: norm = grad.data.flatten(start_dim=1).norm(p=self.p, dim=1) self.tracked.append(norm) - - -class TensorboardTracker(Tracker): - def __init__(self, logdir: str, trackers: List[Type[Tracker]] = None): - super().__init__("Tensorboard") - if trackers is None: - trackers = [ - LossTracker(), - GradientNormTracker(), - ] - self.writer = SummaryWriter(log_dir=logdir) - self.trackers = trackers - - def track( - self, - iteration: int, - loss: torch.Tensor, - scores: torch.Tensor, - x_adv: torch.tensor, - delta: torch.Tensor, - grad: torch.Tensor, - ): - for tracker in self.trackers: - tracker.track(iteration, loss, scores, x_adv, delta, grad) - tracked_value = tracker.get_last_tracked() - for i, sample in enumerate(tracked_value): - if tracker.tracked_type == SCALAR: - self.writer.add_scalar( - f"Sample #{i}/{tracker.name}", sample, global_step=iteration - ) - elif tracker.tracked_type == MULTI_SCALAR: - self.writer.add_scalars( - main_tag=f"Sample #{i}/{tracker.name}", - tag_scalar_dict={ - f"Sample #{i}/{tracker.name}{j}": v - for j, v in enumerate(sample) - }, - global_step=iteration, - ) - elif tracker.tracked_type == IMAGE: - self.writer.add_image( - f"Sample #{i}/{tracker.name}", sample, global_step=iteration - ) - - def get_last_tracked(self): - return NotImplementedError( - "Last tracked value is not available for this tracker." - )