Example of using the advertrain library

[1]:
import torch
from torch import nn, optim
from pathlib import Path
import data_all
from robustML.advertrain.models import ConvNet, ResNet, ConvNetDropblock, ResNetDropblock
from robustML.advertrain.training.classical_training import ClassicalTraining
from robustML.advertrain.training.adversarial_training import AdversarialTraining
from robustML.advertrain.training.autoattack_training import AutoAttackTraining
from robustML.advertrain.training.fire_training import FIRETraining
from robustML.advertrain.training.trades_training import TRADESTraining
from robustML.advertrain.transforms import DataTransformations
import sys
import os
import argparse
/home/jovyan/Maturation/env-robustml/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
  from .autonotebook import tqdm as notebook_tqdm
[2]:
# Set here the path to the directory containing the folder c00 of the example dataset. it can be downloaded
# here http://minio-storage.apps.confianceai-public.irtsysx.fr/ml-models/robust-ml-dataset.zip

ROOT_DIR = "/home/jovyan/Maturation/as434_robustness_platform/examples/dataset/c00"

DEVICE = "cuda:1"
ARCHITECTURE = "resnetdropblock"
LEARNING_RATE = 1e-4
MODELS_PATH = "results/"
[3]:
transformer = DataTransformations()
train_transform = transformer.get_train_transforms()
test_transform = transformer.get_test_transforms()
[4]:
path_data = "learning_data/"

train_dataloader1, val_dataloader1 = data_all.get_train_dataloader(
    ROOT_DIR,
    path_data+"train_dataset_all.csv",
    path_data+"val_dataset_all.csv",
    batch_size=16,
    train_transform=train_transform,
    test_transform=test_transform,
)
[5]:
if ARCHITECTURE == "convnet":
    model = ConvNet(DEVICE)
elif ARCHITECTURE == "resnet":
    model = ResNet(DEVICE)
elif ARCHITECTURE == "convnetdropblock":
    model = ConvNetDropblock(DEVICE)
elif ARCHITECTURE == "resnetdropblock":
    model = ResNetDropblock(DEVICE)
else:
    raise ValueError("Unknown architecture")
[6]:
optimizer = optim.Adam(model.parameters(), lr=LEARNING_RATE)
criterion = nn.CrossEntropyLoss(weight=torch.Tensor([1, 1]).to(DEVICE))
[7]:
if not torch.cuda.is_available() or DEVICE =="cpu":
        print("ERROR : Learning should be done on a system with GPU")
        sys.exit()

print(torch.cuda.current_device())
print("GPU device used ", DEVICE)
0
GPU device used  cuda:1

Train class

ClassicalTraining

[8]:
METHODE="vanilla"
[9]:
trainer = ClassicalTraining(model, optimizer, criterion, DEVICE)

AdversarialTraining

[10]:
METHODE = "adversarial_training"
EPSILON = 8 / 255
[11]:
trainer = AdversarialTraining(model, optimizer, criterion, DEVICE, EPSILON)

AutoAttackTraining

[12]:
METHODE = "autoattack_training"
EPSILON = 8 / 255
[13]:
trainer = AutoAttackTraining(model, optimizer, criterion, DEVICE, "ce", EPSILON)

FireTraining

[14]:
METHODE = "fire_training"
EPSILON = 8 / 255
BETA = 1
[15]:
trainer = FIRETraining(model, optimizer, DEVICE, EPSILON, BETA)

TradesTraining

[16]:
METHODE = "trades_training"
EPSILON = 8 / 255
BETA = 1
[17]:
trainer = TRADESTraining(model, optimizer, DEVICE, EPSILON, BETA)

Fit the model

[18]:
path = os.path.join(MODELS_PATH,
                    f"{ARCHITECTURE}"+"_"+f"{METHODE}")

if not os.path.exists(path):
    try:
        os.makedirs(path)
    except FileExistsError:
        pass

print(f"Using '{path}' directory")

trainer.fit(epochs=2, train_dataloader=train_dataloader1, val_dataloader=val_dataloader1, patience=2, checkpoint=path)
Using 'results/resnetdropblock_trades_training' directory
/home/jovyan/Maturation/env-robustml/lib/python3.10/site-packages/torch/nn/_reduction.py:42: UserWarning: size_average and reduce args will be deprecated, please use reduction='sum' instead.
  warnings.warn(warning.format(ret))
Epochs 1/2 : Training: 100%|██████████| 750/750 [02:43<00:00,  4.59it/s]
Validation: 100%|██████████| 33/33 [00:08<00:00,  3.93it/s]
Epoch 1/2
Train Loss:  0.690, Acc:  0.673, Recall:  0.617, Precision:  0.685,F1 Score:  0.649
Validation Loss:  0.566, Acc:  0.773, Recall:  0.776, Precision:  0.739,F1 Score:  0.757
Validation loss decreased (inf --> 0.566105). Saving model ...
Epochs 2/2 : Training: 100%|██████████| 750/750 [02:45<00:00,  4.54it/s]
Validation: 100%|██████████| 33/33 [00:08<00:00,  4.12it/s]
Epoch 2/2
Train Loss:  0.538, Acc:  0.797, Recall:  0.795, Precision:  0.799,F1 Score:  0.797
Validation Loss:  0.514, Acc:  0.837, Recall:  0.867, Precision:  0.795,F1 Score:  0.829
Validation loss decreased (0.566105 --> 0.514262). Saving model ...
[18]:
{'loss': [0.6897706389427185, 0.5378051996231079],
 'acc': [0.6733333468437195, 0.79666668176651],
 'val_loss': [0.5661050081253052, 0.5142622590065002],
 'val_acc': [0.7727272510528564, 0.8371211886405945],
 'optimizer': 'Adam (\nParameter Group 0\n    amsgrad: False\n    betas: (0.9, 0.999)\n    capturable: False\n    differentiable: False\n    eps: 1e-08\n    foreach: None\n    fused: False\n    lr: 0.0001\n    maximize: False\n    weight_decay: 0\n)',
 'loss_func': 'None',
 'epochs': 2,
 'patience': 2}
[ ]: