123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- ################################################################################
- # Copyright (c) 2021 ContinualAI. #
- # Copyrights licensed under the MIT License. #
- # See the accompanying LICENSE file for terms. #
- # #
- # Date: 06-04-2021 #
- # Author(s): Tyler Hayes #
- # E-mail: contact@continualai.org #
- # Website: avalanche.continualai.org #
- ################################################################################
- """
- This is a simple example on how to use the Deep SLDA strategy.
- """
- from __future__ import absolute_import
- from __future__ import division
- from __future__ import print_function
- import argparse
- import torch
- import warnings
- from torchvision import transforms
- from avalanche.training.plugins import EvaluationPlugin
- from avalanche.evaluation.metrics import accuracy_metrics, loss_metrics, \
- forgetting_metrics
- from avalanche.logging import InteractiveLogger
- from avalanche.benchmarks.classic import CORe50
- from avalanche.training.strategies.deep_slda import StreamingLDA
- from avalanche.models import SLDAResNetModel
- def main(args):
- # Device config
- device = torch.device(f"cuda:{args.cuda}"
- if torch.cuda.is_available() and
- args.cuda >= 0 else "cpu")
- print('device ', device)
- # ---------
- # --- TRANSFORMATIONS
- _mu = [0.485, 0.456, 0.406] # imagenet normalization
- _std = [0.229, 0.224, 0.225]
- transform = transforms.Compose([
- transforms.Resize((224, 224)),
- transforms.ToTensor(),
- transforms.Normalize(mean=_mu,
- std=_std)
- ])
- # ---------
- # --- BENCHMARK CREATION
- benchmark = CORe50(scenario=args.scenario, train_transform=transform,
- eval_transform=transform)
- # ---------
- eval_plugin = EvaluationPlugin(
- loss_metrics(epoch=True, experience=True, stream=True),
- accuracy_metrics(epoch=True, experience=True, stream=True),
- forgetting_metrics(experience=True, stream=True),
- loggers=[InteractiveLogger()]
- )
- criterion = torch.nn.CrossEntropyLoss()
- model = SLDAResNetModel(device=device, arch='resnet18',
- imagenet_pretrained=args.imagenet_pretrained)
- # CREATE THE STRATEGY INSTANCE
- cl_strategy = StreamingLDA(model, criterion,
- args.feature_size, args.n_classes,
- eval_mb_size=args.batch_size,
- train_mb_size=args.batch_size,
- train_epochs=1,
- shrinkage_param=args.shrinkage,
- streaming_update_sigma=args.plastic_cov,
- device=device, evaluator=eval_plugin)
- warnings.warn(
- "The Deep SLDA example is not perfectly aligned with "
- "the paper implementation since it does not use a base "
- "initialization phase and instead starts streming from "
- "pre-trained weights.")
- # TRAINING LOOP
- print('Starting experiment...')
- for i, exp in enumerate(benchmark.train_stream):
- # fit SLDA model to batch (one sample at a time)
- cl_strategy.train(exp)
- # evaluate model on test data
- cl_strategy.eval(benchmark.test_stream)
- if __name__ == '__main__':
- parser = argparse.ArgumentParser('SLDA Example with ResNet-18 on CORe50')
- parser.add_argument('--cuda', type=int, default=0,
- help='Select zero-indexed cuda device. -1 to use CPU.')
- parser.add_argument('--n_classes', type=int, default=50)
- parser.add_argument('--scenario', type=str, default="nc",
- choices=['ni', 'nc', 'nic', 'nicv2_79', 'nicv2_196',
- 'nicv2_391'])
- # deep slda model parameters
- parser.add_argument('--imagenet_pretrained', type=bool,
- default=True) # initialize backbone with
- # imagenet pre-trained weights
- parser.add_argument('--feature_size', type=int,
- default=512) # feature size before output layer
- # (512 for resnet-18)
- parser.add_argument('--shrinkage', type=float,
- default=1e-4) # shrinkage value
- parser.add_argument('--plastic_cov', type=bool,
- default=True) # plastic covariance matrix
- parser.add_argument('--batch_size', type=int, default=512)
- args = parser.parse_args()
- main(args)
|