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}
[ ]: