test_strategies_accuracy.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. ################################################################################
  2. # Copyright (c) 2021 ContinualAI. #
  3. # Copyrights licensed under the MIT License. #
  4. # See the accompanying LICENSE file for terms. #
  5. # #
  6. # Date: 12-05-2021 #
  7. # Author(s): Antonio #
  8. # E-mail: contact@continualai.org #
  9. # Website: avalanche.continualai.org #
  10. ################################################################################
  11. import unittest
  12. from torch import nn
  13. from torch.optim import SGD
  14. from torch.nn import CrossEntropyLoss
  15. from avalanche.models import MultiHeadClassifier
  16. from avalanche.models.dynamic_modules import MultiTaskModule
  17. from avalanche.training.plugins import EvaluationPlugin
  18. from avalanche.training.strategies.cumulative import Cumulative
  19. from avalanche.evaluation.metrics import StreamAccuracy, ExperienceAccuracy
  20. from avalanche.training.strategies.strategy_wrappers import PNNStrategy
  21. from tests.unit_tests_utils import get_fast_benchmark, get_device
  22. class TestMLP(nn.Module):
  23. def __init__(self, num_classes=10, input_size=6, hidden_size=50):
  24. super().__init__()
  25. self.layers = nn.Sequential(
  26. nn.Linear(input_size, hidden_size),
  27. nn.Tanh(),
  28. nn.Linear(hidden_size, hidden_size),
  29. nn.Tanh())
  30. self.classifier = nn.Linear(hidden_size, num_classes)
  31. self._hidden_size = hidden_size
  32. self._input_size = input_size
  33. def forward(self, x):
  34. x = x.contiguous()
  35. x = x.view(x.size(0), self._input_size)
  36. x = self.layers(x)
  37. x = self.classifier(x)
  38. return x
  39. class MHTestMLP(TestMLP, MultiTaskModule):
  40. def __init__(self, num_classes=10, input_size=6, hidden_size=50):
  41. super().__init__()
  42. self.classifier = MultiHeadClassifier(self._hidden_size, num_classes)
  43. def forward(self, x, task_labels):
  44. x = self.layers(x)
  45. x = self.classifier(x, task_labels)
  46. return x
  47. class StrategyTest(unittest.TestCase):
  48. def test_multihead_cumulative(self):
  49. # check that multi-head reaches high enough accuracy.
  50. # Ensure nothing weird is happening with the multiple heads.
  51. model = MHTestMLP(input_size=6, hidden_size=100)
  52. criterion = CrossEntropyLoss()
  53. optimizer = SGD(model.parameters(), lr=1)
  54. main_metric = StreamAccuracy()
  55. exp_acc = ExperienceAccuracy()
  56. evalp = EvaluationPlugin(main_metric, exp_acc, loggers=None)
  57. strategy = Cumulative(
  58. model, optimizer, criterion, train_mb_size=32, device=get_device(),
  59. eval_mb_size=512, train_epochs=1, evaluator=evalp)
  60. benchmark = get_fast_benchmark(use_task_labels=True)
  61. for train_batch_info in benchmark.train_stream:
  62. strategy.train(train_batch_info)
  63. strategy.eval(benchmark.train_stream[:])
  64. print("TRAIN STREAM ACC: ", main_metric.result())
  65. assert sum(main_metric.result().values()) / \
  66. float(len(main_metric.result().keys())) > 0.7
  67. def test_pnn(self):
  68. # check that pnn reaches high enough accuracy.
  69. # Ensure nothing weird is happening with the multiple heads.
  70. main_metric = StreamAccuracy()
  71. exp_acc = ExperienceAccuracy()
  72. evalp = EvaluationPlugin(main_metric, exp_acc, loggers=None)
  73. strategy = PNNStrategy(
  74. 1, 6, 50, 0.1, train_mb_size=32, device=get_device(),
  75. eval_mb_size=512, train_epochs=1, evaluator=evalp)
  76. benchmark = get_fast_benchmark(use_task_labels=True)
  77. for train_batch_info in benchmark.train_stream:
  78. strategy.train(train_batch_info)
  79. strategy.eval(benchmark.train_stream[:])
  80. print("TRAIN STREAM ACC: ", main_metric.result())
  81. assert sum(main_metric.result().values()) / \
  82. float(len(main_metric.result().keys())) > 0.5
  83. if __name__ == '__main__':
  84. unittest.main()