Tutorial¶
This tutorial would walk through the basic usage of using USB to benchmark any provided algorithms, customize algorithms, customize dataset and the introduction of lighting version.
Get Started¶
Lighting in 15 mins¶
This tutorial will walk you through the basics of using the torchssl-lightning framework. Let’s get started by training a FixMatch model on CIFAR-10!
import sys
sys.path.append('../')
from src import get_dataset, get_data_loader, net_builder, get_algorithm, get_config, Trainer
Define Configs and Create Config
config = {
'algorithm': 'fixmatch',
'net': 'wrn_28_2',
'use_pretrain': False, # todo: add pretrain
'pretrain_path': None,
# optimization configs
'epoch': 3,
'num_train_iter': 150,
'num_eval_iter': 50,
'optim': 'SGD',
'lr': 0.03,
'momentum': 0.9,
'batch_size': 64,
'eval_batch_size': 64,
# dataset configs
'dataset': 'cifar10',
'num_labels': 40,
'num_classes': 10,
'input_size': 32,
'data_dir': './data',
# algorithm specific configs
'hard_label': True,
'uratio': 3,
'ulb_loss_ratio': 1.0,
# device configs
'gpu': 0,
'world_size': 1,
'distributed': False,
}
config = get_config(config)
Create Model and Specify Algorithm
algorithm = get_algorithm(config, net_builder(config.net, from_name=False), tb_log=None, logger=None)
Create Dataset and Dataloader
# create dataset
dataset_dict = get_dataset(config, config.algorithm, config.dataset, config.num_labels,
config.num_classes, data_dir=config.data_dir)
# create data loader for labeled training set
train_lb_loader = get_data_loader(config, dataset_dict['train_lb'], config.batch_size)
# create data loader for unlabeled training set
train_ulb_loader = get_data_loader(config, dataset_dict['train_ulb'], int(config.batch_size * config.uratio))
# create data loader for evaluation
eval_loader = get_data_loader(config, dataset_dict['eval'], config.eval_batch_size)
Train
trainer = Trainer(config, algorithm)
trainer.fit(train_lb_loader, train_ulb_loader, eval_loader)
Evaluate
trainer.evaluate(eval_loader)
Predict
y_pred, y_logits = trainer.predict(eval_loader)
Customized Usage¶
Customizing Dataset¶
In this tutorial, we provide an example of using custom dataset.
Specifiy configs and define the model
# define configs and create config
config = {
'algorithm': 'fixmatch',
'net': 'wrn_28_2',
'use_pretrain': False, # todo: add pretrain
# optimization configs
'epoch': 3,
'num_train_iter': 150,
'num_eval_iter': 50,
'optim': 'SGD',
'lr': 0.03,
'momentum': 0.9,
'batch_size': 64,
'eval_batch_size': 64,
# dataset configs
'dataset': 'none',
'num_labels': 40,
'num_classes': 10,
'input_size': 32,
'data_dir': './data',
# algorithm specific configs
'hard_label': True,
'uratio': 3,
'ulb_loss_ratio': 1.0,
# device configs
'gpu': 0,
'world_size': 1,
'distributed': False,
}
config = get_config(config)
# create model and specify algorithm
algorithm = get_algorithm(config, net_builder(config.net, from_name=False), tb_log=None, logger=None)
Create Dataset
# replace with your own code
data = np.random.randint(0, 255, size=3072 * 1000).reshape((-1, 32, 32, 3))
data = np.uint8(data)
target = np.random.randint(0, 10, size=1000)
lb_data, lb_target, ulb_data, ulb_target = split_ssl_data(config, data, target,
num_labels=config.num_labels,
num_classes=config.num_classes)
train_transform = transforms.Compose([transforms.RandomHorizontalFlip(),
transforms.RandomCrop(32, padding=int(32 * 0.125), padding_mode='reflect'),
transforms.ToTensor(),
transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])])
lb_dataset = BasicDataset(config.algorithm, lb_data, lb_target, config.num_classes, train_transform, is_ulb=False)
ulb_dataset = BasicDataset(config.algorithm, lb_data, lb_target, config.num_classes, train_transform, is_ulb=True)
# replace with your own code
eval_data = np.random.randint(0, 255, size=3072 * 100).reshape((-1, 32, 32, 3))
eval_data = np.uint8(eval_data)
eval_target = np.random.randint(0, 10, size=100)
eval_transform = transforms.Compose([transforms.Resize(32),
transforms.ToTensor(),
transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])])
eval_dataset = BasicDataset(config.algorithm, lb_data, lb_target, config.num_classes, eval_transform, is_ulb=False)
# define data loaders
train_lb_loader = get_data_loader(config, lb_dataset, config.batch_size)
train_ulb_loader = get_data_loader(config, ulb_dataset, int(config.batch_size * config.uratio))
eval_loader = get_data_loader(config, eval_dataset, config.eval_batch_size)
Training and Evaluation
# training and evaluation
trainer = Trainer(config, algorithm)
trainer.fit(train_lb_loader, train_ulb_loader, eval_loader)
trainer.evaluate(eval_loader)