test_nc_sit_scenario.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. import unittest
  2. from os.path import expanduser
  3. import random
  4. from PIL.Image import Image
  5. from torch import Tensor
  6. from torchvision.datasets import MNIST
  7. from torchvision.transforms import ToTensor
  8. from avalanche.benchmarks.datasets import CIFAR100, default_dataset_location
  9. from avalanche.benchmarks.scenarios.new_classes import NCExperience
  10. from avalanche.benchmarks.utils import AvalancheSubset, AvalancheDataset
  11. from avalanche.benchmarks.scenarios.new_classes.nc_utils import \
  12. make_nc_transformation_subset
  13. from avalanche.benchmarks import nc_benchmark, GenericScenarioStream
  14. class SITTests(unittest.TestCase):
  15. def test_sit_single_dataset(self):
  16. mnist_train = MNIST(
  17. root=expanduser("~") + "/.avalanche/data/mnist/",
  18. train=True, download=True)
  19. mnist_test = MNIST(
  20. root=expanduser("~") + "/.avalanche/data/mnist/",
  21. train=False, download=True)
  22. my_nc_benchmark = nc_benchmark(
  23. mnist_train, mnist_test, 5, task_labels=False, shuffle=True,
  24. seed=1234)
  25. self.assertEqual(5, my_nc_benchmark.n_experiences)
  26. self.assertEqual(10, my_nc_benchmark.n_classes)
  27. for batch_id in range(my_nc_benchmark.n_experiences):
  28. self.assertEqual(
  29. 2,
  30. len(my_nc_benchmark.classes_in_experience['train'][batch_id]))
  31. all_classes = set()
  32. for batch_id in range(5):
  33. all_classes.update(
  34. my_nc_benchmark.classes_in_experience['train'][batch_id])
  35. self.assertEqual(10, len(all_classes))
  36. def test_sit_single_dataset_fixed_order(self):
  37. order = [2, 3, 5, 7, 8, 9, 0, 1, 4, 6]
  38. mnist_train = MNIST(root=expanduser("~") + "/.avalanche/data/mnist/",
  39. train=True, download=True)
  40. mnist_test = MNIST(root=expanduser("~") + "/.avalanche/data/mnist/",
  41. train=False, download=True)
  42. my_nc_benchmark = nc_benchmark(
  43. mnist_train, mnist_test, 5, task_labels=False,
  44. fixed_class_order=order)
  45. all_classes = []
  46. for batch_id in range(5):
  47. all_classes.extend(
  48. my_nc_benchmark.classes_in_experience['train'][batch_id])
  49. self.assertEqual(order, all_classes)
  50. def test_sit_single_dataset_fixed_order_subset(self):
  51. order = [2, 3, 5, 8, 9, 1, 4, 6]
  52. mnist_train = MNIST(root=expanduser("~") + "/.avalanche/data/mnist/",
  53. train=True, download=True)
  54. mnist_test = MNIST(root=expanduser("~") + "/.avalanche/data/mnist/",
  55. train=False, download=True)
  56. my_nc_benchmark = nc_benchmark(
  57. mnist_train, mnist_test, 4, task_labels=False,
  58. fixed_class_order=order)
  59. self.assertEqual(4, len(my_nc_benchmark.classes_in_experience['train']))
  60. all_classes = set()
  61. for batch_id in range(4):
  62. self.assertEqual(
  63. 2,
  64. len(my_nc_benchmark.classes_in_experience['train'][batch_id]))
  65. all_classes.update(
  66. my_nc_benchmark.classes_in_experience['train'][batch_id])
  67. self.assertEqual(set(order), all_classes)
  68. def test_sit_single_dataset_remap_indexes(self):
  69. order = [2, 3, 5, 8, 9, 1, 4, 6]
  70. mnist_train = MNIST(root=expanduser("~") + "/.avalanche/data/mnist/",
  71. train=True, download=True)
  72. mnist_test = MNIST(root=expanduser("~") + "/.avalanche/data/mnist/",
  73. train=False, download=True)
  74. my_nc_benchmark = nc_benchmark(
  75. mnist_train, mnist_test, 4, task_labels=False,
  76. fixed_class_order=order, class_ids_from_zero_from_first_exp=True)
  77. self.assertEqual(4, len(my_nc_benchmark.classes_in_experience['train']))
  78. all_classes = []
  79. for batch_id in range(4):
  80. self.assertEqual(
  81. 2,
  82. len(my_nc_benchmark.classes_in_experience['train'][batch_id]))
  83. all_classes.extend(
  84. my_nc_benchmark.classes_in_experience['train'][batch_id])
  85. self.assertEqual(list(range(8)), all_classes)
  86. # Regression test for issue #258
  87. for i, experience in enumerate(my_nc_benchmark.train_stream):
  88. unique_dataset_classes = sorted(set(experience.dataset.targets))
  89. expected_dataset_classes = list(range(2 * i, 2 * (i+1)))
  90. self.assertListEqual(expected_dataset_classes,
  91. unique_dataset_classes)
  92. self.assertListEqual(
  93. sorted(order[2 * i:2 * (i+1)]),
  94. sorted(my_nc_benchmark.original_classes_in_exp[i]))
  95. # End regression test for issue #258
  96. def test_sit_single_dataset_remap_indexes_each_exp(self):
  97. order = [2, 3, 5, 8, 9, 1, 4, 6]
  98. mnist_train = MNIST(root=expanduser("~") + "/.avalanche/data/mnist/",
  99. train=True, download=True)
  100. mnist_test = MNIST(root=expanduser("~") + "/.avalanche/data/mnist/",
  101. train=False, download=True)
  102. with self.assertRaises(ValueError):
  103. # class_ids_from_zero_* are mutually exclusive
  104. nc_benchmark(
  105. mnist_train, mnist_test, 4, task_labels=False,
  106. fixed_class_order=order,
  107. class_ids_from_zero_from_first_exp=True,
  108. class_ids_from_zero_in_each_exp=True)
  109. my_nc_benchmark = nc_benchmark(
  110. mnist_train, mnist_test, 4, task_labels=False,
  111. fixed_class_order=order,
  112. class_ids_from_zero_in_each_exp=True)
  113. self.assertEqual(4, len(my_nc_benchmark.classes_in_experience['train']))
  114. all_classes = []
  115. for batch_id in range(4):
  116. self.assertEqual(
  117. 2,
  118. len(my_nc_benchmark.classes_in_experience['train'][batch_id]))
  119. all_classes.extend(
  120. my_nc_benchmark.classes_in_experience['train'][batch_id])
  121. self.assertEqual(8, len(all_classes))
  122. self.assertListEqual([0, 1], sorted(set(all_classes)))
  123. # Regression test for issue #258
  124. for i, experience in enumerate(my_nc_benchmark.train_stream):
  125. unique_dataset_classes = sorted(set(experience.dataset.targets))
  126. expected_dataset_classes = [0, 1]
  127. self.assertListEqual(expected_dataset_classes,
  128. unique_dataset_classes)
  129. self.assertListEqual(
  130. sorted(order[2 * i:2 * (i + 1)]),
  131. sorted(my_nc_benchmark.original_classes_in_exp[i]))
  132. # End regression test for issue #258
  133. def test_sit_single_dataset_reproducibility_data(self):
  134. mnist_train = MNIST(root=expanduser("~") + "/.avalanche/data/mnist/",
  135. train=True, download=True)
  136. mnist_test = MNIST(root=expanduser("~") + "/.avalanche/data/mnist/",
  137. train=False, download=True)
  138. nc_benchmark_ref = nc_benchmark(
  139. mnist_train, mnist_test, 5, task_labels=False, shuffle=True,
  140. seed=5678)
  141. my_nc_benchmark = nc_benchmark(
  142. mnist_train, mnist_test, -1, task_labels=False,
  143. reproducibility_data=nc_benchmark_ref.get_reproducibility_data())
  144. self.assertEqual(nc_benchmark_ref.train_exps_patterns_assignment,
  145. my_nc_benchmark.train_exps_patterns_assignment)
  146. self.assertEqual(nc_benchmark_ref.test_exps_patterns_assignment,
  147. my_nc_benchmark.test_exps_patterns_assignment)
  148. def test_sit_single_dataset_batch_size(self):
  149. mnist_train = MNIST(root=expanduser("~") + "/.avalanche/data/mnist/",
  150. train=True, download=True)
  151. mnist_test = MNIST(root=expanduser("~") + "/.avalanche/data/mnist/",
  152. train=False, download=True)
  153. my_nc_benchmark = nc_benchmark(
  154. mnist_train, mnist_test, 3, task_labels=False,
  155. per_exp_classes={0: 5, 2: 2})
  156. self.assertEqual(3, my_nc_benchmark.n_experiences)
  157. self.assertEqual(10, my_nc_benchmark.n_classes)
  158. all_classes = set()
  159. for batch_id in range(3):
  160. all_classes.update(
  161. my_nc_benchmark.classes_in_experience['train'][batch_id])
  162. self.assertEqual(10, len(all_classes))
  163. self.assertEqual(
  164. 5, len(my_nc_benchmark.classes_in_experience['train'][0]))
  165. self.assertEqual(
  166. 3, len(my_nc_benchmark.classes_in_experience['train'][1]))
  167. self.assertEqual(
  168. 2, len(my_nc_benchmark.classes_in_experience['train'][2]))
  169. def test_sit_multi_dataset_one_batch_per_set(self):
  170. split_mapping = [0, 1, 2, 0, 1, 2, 3, 4, 5, 6]
  171. mnist_train = MNIST(root=expanduser("~") + "/.avalanche/data/mnist/",
  172. train=True, download=True)
  173. mnist_test = MNIST(root=expanduser("~") + "/.avalanche/data/mnist/",
  174. train=False, download=True)
  175. train_part1 = make_nc_transformation_subset(
  176. mnist_train, None, None, range(3))
  177. train_part2 = make_nc_transformation_subset(
  178. mnist_train, None, None, range(3, 10))
  179. train_part2 = AvalancheSubset(
  180. train_part2, class_mapping=split_mapping)
  181. test_part1 = make_nc_transformation_subset(
  182. mnist_test, None, None, range(3))
  183. test_part2 = make_nc_transformation_subset(
  184. mnist_test, None, None, range(3, 10))
  185. test_part2 = AvalancheSubset(test_part2,
  186. class_mapping=split_mapping)
  187. my_nc_benchmark = nc_benchmark(
  188. [train_part1, train_part2], [test_part1, test_part2], 2,
  189. task_labels=False, shuffle=True, seed=1234,
  190. one_dataset_per_exp=True)
  191. self.assertEqual(2, my_nc_benchmark.n_experiences)
  192. self.assertEqual(10, my_nc_benchmark.n_classes)
  193. all_classes = set()
  194. for batch_id in range(2):
  195. all_classes.update(
  196. my_nc_benchmark.classes_in_experience['train'][batch_id])
  197. self.assertEqual(10, len(all_classes))
  198. self.assertTrue(
  199. (my_nc_benchmark.classes_in_experience['train'][0] == {0, 1, 2} and
  200. my_nc_benchmark.classes_in_experience['train'][1] ==
  201. set(range(3, 10))) or
  202. (my_nc_benchmark.classes_in_experience['train'][0] ==
  203. set(range(3, 10)) and
  204. my_nc_benchmark.classes_in_experience['train'][1] == {0, 1, 2}))
  205. def test_sit_multi_dataset_merge(self):
  206. split_mapping = [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]
  207. mnist_train = MNIST(root=expanduser("~") + "/.avalanche/data/mnist/",
  208. train=True, download=True)
  209. mnist_test = MNIST(root=expanduser("~") + "/.avalanche/data/mnist/",
  210. train=False, download=True)
  211. train_part1 = make_nc_transformation_subset(
  212. mnist_train, None, None, range(5))
  213. train_part2 = make_nc_transformation_subset(
  214. mnist_train, None, None, range(5, 10))
  215. train_part2 = AvalancheSubset(
  216. train_part2, class_mapping=split_mapping)
  217. test_part1 = make_nc_transformation_subset(
  218. mnist_test, None, None, range(5))
  219. test_part2 = make_nc_transformation_subset(
  220. mnist_test, None, None, range(5, 10))
  221. test_part2 = AvalancheSubset(test_part2,
  222. class_mapping=split_mapping)
  223. my_nc_benchmark = nc_benchmark(
  224. [train_part1, train_part2], [test_part1, test_part2], 5,
  225. task_labels=False, shuffle=True, seed=1234)
  226. self.assertEqual(5, my_nc_benchmark.n_experiences)
  227. self.assertEqual(10, my_nc_benchmark.n_classes)
  228. for batch_id in range(5):
  229. self.assertEqual(
  230. 2,
  231. len(my_nc_benchmark.classes_in_experience['train'][batch_id]))
  232. all_classes = set()
  233. for batch_id in range(5):
  234. all_classes.update(
  235. my_nc_benchmark.classes_in_experience['train'][batch_id])
  236. self.assertEqual(10, len(all_classes))
  237. def test_nc_sit_slicing(self):
  238. mnist_train = MNIST(root=expanduser("~") + "/.avalanche/data/mnist/",
  239. train=True, download=True)
  240. mnist_test = MNIST(root=expanduser("~") + "/.avalanche/data/mnist/",
  241. train=False, download=True)
  242. my_nc_benchmark = nc_benchmark(
  243. mnist_train, mnist_test, 5, task_labels=False, shuffle=True,
  244. seed=1234)
  245. experience: NCExperience
  246. for batch_id, experience in enumerate(my_nc_benchmark.train_stream):
  247. self.assertEqual(batch_id, experience.current_experience)
  248. self.assertIsInstance(experience, NCExperience)
  249. for batch_id, experience in enumerate(my_nc_benchmark.test_stream):
  250. self.assertEqual(batch_id, experience.current_experience)
  251. self.assertIsInstance(experience, NCExperience)
  252. iterable_slice = [3, 4, 1]
  253. sliced_stream = my_nc_benchmark.train_stream[iterable_slice]
  254. self.assertIsInstance(sliced_stream, GenericScenarioStream)
  255. self.assertEqual(len(iterable_slice), len(sliced_stream))
  256. self.assertEqual('train', sliced_stream.name)
  257. for batch_id, experience in enumerate(sliced_stream):
  258. self.assertEqual(iterable_slice[batch_id],
  259. experience.current_experience)
  260. self.assertIsInstance(experience, NCExperience)
  261. sliced_stream = my_nc_benchmark.test_stream[iterable_slice]
  262. self.assertIsInstance(sliced_stream, GenericScenarioStream)
  263. self.assertEqual(len(iterable_slice), len(sliced_stream))
  264. self.assertEqual('test', sliced_stream.name)
  265. for batch_id, experience in enumerate(sliced_stream):
  266. self.assertEqual(iterable_slice[batch_id],
  267. experience.current_experience)
  268. self.assertIsInstance(experience, NCExperience)
  269. def test_nc_benchmark_transformations_basic(self):
  270. # Regression for #577
  271. ds = CIFAR100(root=expanduser("~") + "/.avalanche/data/cifar100/",
  272. train=True, download=True)
  273. ds = AvalancheDataset(ds, transform=ToTensor())
  274. benchmark = nc_benchmark(
  275. ds, ds, n_experiences=10, shuffle=True, seed=1234,
  276. task_labels=False
  277. )
  278. exp_0_dataset = benchmark.train_stream[0].dataset
  279. self.assertIsInstance(exp_0_dataset[0][0], Tensor)
  280. def test_nc_benchmark_transformations_advanced(self):
  281. # Regression for #577
  282. ds = CIFAR100(root=expanduser("~") + "/.avalanche/data/cifar100/",
  283. train=True, download=True)
  284. benchmark = nc_benchmark(
  285. ds, ds, n_experiences=10, shuffle=True, seed=1234,
  286. task_labels=False, train_transform=ToTensor(),
  287. eval_transform=None
  288. )
  289. ds_train_train = benchmark.train_stream[0].dataset
  290. self.assertIsInstance(ds_train_train[0][0], Tensor)
  291. ds_train_eval = benchmark.train_stream[0].dataset.eval()
  292. self.assertIsInstance(ds_train_eval[0][0], Image)
  293. ds_test_eval = benchmark.test_stream[0].dataset
  294. self.assertIsInstance(ds_test_eval[0][0], Image)
  295. ds_test_train = benchmark.test_stream[0].dataset.train()
  296. self.assertIsInstance(ds_test_train[0][0], Tensor)
  297. def test_nc_benchmark_classes_in_exp_range(self):
  298. train_set = CIFAR100(default_dataset_location('cifar100'),
  299. train=True, download=True)
  300. test_set = CIFAR100(default_dataset_location('cifar100'),
  301. train=False, download=True)
  302. benchmark_instance = nc_benchmark(
  303. train_dataset=train_set,
  304. test_dataset=test_set,
  305. n_experiences=5,
  306. task_labels=False,
  307. seed=1234,
  308. shuffle=False)
  309. cie_data = benchmark_instance.classes_in_exp_range(0, None)
  310. self.assertEqual(5, len(cie_data))
  311. for i in range(5):
  312. expected = set(range(i*20, (i+1)*20))
  313. self.assertSetEqual(expected, set(cie_data[i]))
  314. cie_data = benchmark_instance.classes_in_exp_range(1, 4)
  315. self.assertEqual(3, len(cie_data))
  316. for i in range(1, 3):
  317. expected = set(range(i * 20, (i + 1) * 20))
  318. self.assertSetEqual(expected, set(cie_data[i-1]))
  319. random_class_order = list(range(100))
  320. random.shuffle(random_class_order)
  321. benchmark_instance = nc_benchmark(
  322. train_dataset=train_set,
  323. test_dataset=test_set,
  324. n_experiences=5,
  325. task_labels=False,
  326. seed=1234,
  327. fixed_class_order=random_class_order,
  328. shuffle=False)
  329. cie_data = benchmark_instance.classes_in_exp_range(0, None)
  330. self.assertEqual(5, len(cie_data))
  331. for i in range(5):
  332. expected = set(random_class_order[i * 20: (i + 1) * 20])
  333. self.assertSetEqual(expected, set(cie_data[i]))
  334. if __name__ == '__main__':
  335. unittest.main()