Skip to content

Commit

Permalink
Merge pull request #47 from pralab/46-rename-library-to-secml-torch
Browse files Browse the repository at this point in the history
Massive refactoring
  • Loading branch information
zangobot authored Mar 4, 2024
2 parents a8ac658 + cb83152 commit 2a9a452
Show file tree
Hide file tree
Showing 54 changed files with 137 additions and 119 deletions.
12 changes: 6 additions & 6 deletions examples/mnist_example.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import os
from secml2.trackers.trackers import (
from secmlt.trackers.trackers import (
LossTracker,
PredictionTracker,
PerturbationNormTracker,
Expand All @@ -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):
Expand Down
15 changes: 8 additions & 7 deletions examples/mnist_example_tensorboard.py
Original file line number Diff line number Diff line change
@@ -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):
Expand Down
10 changes: 5 additions & 5 deletions examples/run_evasion_attack.py
Original file line number Diff line number Diff line change
@@ -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

Expand Down
6 changes: 3 additions & 3 deletions examples/train_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
8 changes: 3 additions & 5 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -40,8 +40,6 @@
author="Maura Pintor, Luca Demetrio",
author_email="[email protected], [email protected]",
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",
)
Empty file removed src/secml2/trackers/__init__.py
Empty file.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -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:
Expand Down
Original file line number Diff line number Diff line change
@@ -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"
Expand Down
Original file line number Diff line number Diff line change
@@ -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


Expand Down
Original file line number Diff line number Diff line change
@@ -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,
Expand Down
22 changes: 11 additions & 11 deletions src/secml2/adv/evasion/pgd.py → src/secmlt/adv/evasion/pgd.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

import torch

from secml2.optimization.constraints import Constraint
from secmlt.optimization.constraints import Constraint


class Manipulation(ABC):
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -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:
Expand Down
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -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):
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -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):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -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:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import torch

from secml2.adv.evasion.perturbation_models import PerturbationModels
from secmlt.adv.evasion.perturbation_models import PerturbationModels


class Initializer:
Expand Down
9 changes: 9 additions & 0 deletions src/secmlt/trackers/__init__.py
Original file line number Diff line number Diff line change
@@ -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 *
Original file line number Diff line number Diff line change
@@ -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


Expand Down
59 changes: 59 additions & 0 deletions src/secmlt/trackers/tensorboard_tracker.py
Original file line number Diff line number Diff line change
@@ -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."
)
Loading

0 comments on commit 2a9a452

Please sign in to comment.