├── solo_learn ├── src │ └── pytorch_utils │ │ └── __init__.py ├── scripts │ ├── pretrain │ │ ├── cifar │ │ │ ├── wandb │ │ │ │ ├── mhug.yaml │ │ │ │ └── private.yaml │ │ │ ├── augmentations │ │ │ │ ├── reconstruction.yaml │ │ │ │ ├── symmetric.yaml │ │ │ │ ├── symmetric_weak.yaml │ │ │ │ ├── symmetric_auto_augment.yaml │ │ │ │ ├── ressl.yaml │ │ │ │ └── asymmetric.yaml │ │ │ └── base.yaml │ │ └── minet │ │ │ ├── wandb │ │ │ ├── mhug.yaml │ │ │ └── private.yaml │ │ │ ├── augmentations │ │ │ ├── reconstruction.yaml │ │ │ ├── symmetric.yaml │ │ │ ├── symmetric_224.yaml │ │ │ ├── symmetric_strong.yaml │ │ │ ├── symmetric_weak.yaml │ │ │ ├── symmetric_stronger.yaml │ │ │ ├── single.yaml │ │ │ ├── symmetric_auto_augment.yaml │ │ │ ├── ressl.yaml │ │ │ └── asymmetric.yaml │ │ │ └── base.yaml │ └── utils │ │ ├── convert_imgfolder_to_h5.py │ │ └── make_imagenet100.py ├── README.md ├── datasets │ └── fscil_data │ │ └── index_list │ │ ├── cifar100 │ │ ├── session_2.txt │ │ ├── session_3.txt │ │ ├── session_4.txt │ │ ├── session_5.txt │ │ ├── session_6.txt │ │ ├── session_7.txt │ │ ├── session_8.txt │ │ └── session_9.txt │ │ ├── README.md │ │ ├── mini_imagenet │ │ ├── session_2.txt │ │ ├── session_3.txt │ │ ├── session_4.txt │ │ ├── session_5.txt │ │ ├── session_6.txt │ │ ├── session_7.txt │ │ ├── session_8.txt │ │ └── session_9.txt │ │ └── cub200 │ │ ├── session_6.txt │ │ ├── session_11.txt │ │ ├── session_2.txt │ │ ├── session_5.txt │ │ ├── session_3.txt │ │ ├── session_9.txt │ │ └── session_4.txt ├── solo │ ├── args │ │ ├── umap.py │ │ ├── knn.py │ │ └── __init__.py │ ├── data │ │ ├── dataset_subset │ │ │ └── imagenet100_classes.txt │ │ ├── __init__.py │ │ └── fscil_dataloader │ │ │ └── sampler.py │ ├── backbones │ │ ├── resnet │ │ │ ├── resnet.py │ │ │ └── __init__.py │ │ ├── nueralcollapse │ │ │ └── __init__.py │ │ ├── alice │ │ │ └── __init__.py │ │ ├── wide_resnet │ │ │ └── __init__.py │ │ ├── swin │ │ │ ├── __init__.py │ │ │ └── swin.py │ │ ├── convnext │ │ │ ├── __init__.py │ │ │ └── convnext.py │ │ ├── poolformer │ │ │ └── __init__.py │ │ ├── __init__.py │ │ └── vit │ │ │ ├── vit.py │ │ │ └── __init__.py │ ├── __init__.py │ ├── methods │ │ └── __init__.py │ ├── utils │ │ ├── __init__.py │ │ ├── metrics.py │ │ ├── cos_scheduler.py │ │ ├── momentum.py │ │ └── sinkhorn_knopp.py │ └── losses │ │ ├── wmse.py │ │ ├── simsiam.py │ │ ├── byol.py │ │ ├── swav.py │ │ ├── mocov2plus.py │ │ ├── deepclusterv2.py │ │ ├── nnclr.py │ │ ├── __init__.py │ │ ├── mocov3.py │ │ ├── ressl.py │ │ ├── barlow.py │ │ ├── mae.py │ │ ├── vibcreg.py │ │ └── simclr.py └── trained_models │ └── supcon │ └── xvb15qr4 │ └── args.json ├── figures ├── OrCo-pipeline.jpg └── sota_fig_all.png ├── models ├── orco │ ├── __pycache__ │ │ ├── base.cpython-39.pyc │ │ ├── helper.cpython-39.pyc │ │ ├── mixup.cpython-39.pyc │ │ ├── supcon.cpython-39.pyc │ │ ├── Network.cpython-39.pyc │ │ ├── fscil_trainer.cpython-39.pyc │ │ ├── gaussian_utils.cpython-39.pyc │ │ └── knn_classifier.cpython-39.pyc │ ├── base.py │ └── helper.py └── cec │ ├── __pycache__ │ ├── Network.cpython-39.pyc │ ├── helper.cpython-39.pyc │ ├── BaseNetwork.cpython-39.pyc │ └── fscil_trainer.cpython-39.pyc │ └── helper.py ├── scripts ├── base_session │ ├── run_cifar.sh │ └── run_minet.sh └── incremental_session │ ├── run_minet.sh │ ├── run_cub.sh │ └── run_cifar.sh ├── dataloader ├── __pycache__ │ ├── sampler.cpython-39.pyc │ ├── data_utils.cpython-39.pyc │ └── autoaugment.cpython-39.pyc ├── cifar100 │ └── __pycache__ │ │ └── cifar.cpython-39.pyc ├── cub200 │ └── __pycache__ │ │ └── cub200.cpython-39.pyc ├── miniimagenet │ └── __pycache__ │ │ └── miniimagenet.cpython-39.pyc └── sampler.py ├── scheduler └── __pycache__ │ └── lr_scheduler.cpython-39.pyc ├── .gitignore ├── data └── index_list │ ├── cifar100 │ ├── session_2.txt │ ├── session_3.txt │ ├── session_4.txt │ ├── session_5.txt │ ├── session_6.txt │ ├── session_7.txt │ ├── session_8.txt │ └── session_9.txt │ ├── README.md │ ├── mini_imagenet │ ├── session_2.txt │ ├── session_3.txt │ ├── session_4.txt │ ├── session_5.txt │ ├── session_6.txt │ ├── session_7.txt │ ├── session_8.txt │ └── session_9.txt │ └── cub200 │ ├── session_6.txt │ ├── session_11.txt │ ├── session_2.txt │ ├── session_5.txt │ ├── session_3.txt │ ├── session_9.txt │ ├── session_4.txt │ └── session_8.txt └── params └── OrCo └── cifar100 └── args.json /solo_learn/src/pytorch_utils/__init__.py: -------------------------------------------------------------------------------- 1 | from .utils import * 2 | from .checkpoint import * 3 | -------------------------------------------------------------------------------- /figures/OrCo-pipeline.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noorahmedds/OrCo/HEAD/figures/OrCo-pipeline.jpg -------------------------------------------------------------------------------- /figures/sota_fig_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noorahmedds/OrCo/HEAD/figures/sota_fig_all.png -------------------------------------------------------------------------------- /solo_learn/scripts/pretrain/cifar/wandb/mhug.yaml: -------------------------------------------------------------------------------- 1 | enabled: True 2 | entity: unitn-mhug 3 | project: "solo-learn" 4 | -------------------------------------------------------------------------------- /solo_learn/scripts/pretrain/minet/wandb/mhug.yaml: -------------------------------------------------------------------------------- 1 | enabled: True 2 | entity: unitn-mhug 3 | project: "solo-learn" 4 | -------------------------------------------------------------------------------- /solo_learn/scripts/pretrain/minet/wandb/private.yaml: -------------------------------------------------------------------------------- 1 | enabled: True 2 | entity: None 3 | project: "Group MINET Supcon" 4 | -------------------------------------------------------------------------------- /solo_learn/scripts/pretrain/cifar/wandb/private.yaml: -------------------------------------------------------------------------------- 1 | enabled: True 2 | entity: None 3 | project: "Group CIFAR Supcon (new)" 4 | -------------------------------------------------------------------------------- /models/orco/__pycache__/base.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noorahmedds/OrCo/HEAD/models/orco/__pycache__/base.cpython-39.pyc -------------------------------------------------------------------------------- /scripts/base_session/run_cifar.sh: -------------------------------------------------------------------------------- 1 | cd solo_learn && python main_pretrain.py --config-path ./scripts/pretrain/cifar --config-name base.yaml -------------------------------------------------------------------------------- /scripts/base_session/run_minet.sh: -------------------------------------------------------------------------------- 1 | cd solo_learn && python main_pretrain.py --config-path ./scripts/pretrain/minet --config-name base.yaml -------------------------------------------------------------------------------- /dataloader/__pycache__/sampler.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noorahmedds/OrCo/HEAD/dataloader/__pycache__/sampler.cpython-39.pyc -------------------------------------------------------------------------------- /models/cec/__pycache__/Network.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noorahmedds/OrCo/HEAD/models/cec/__pycache__/Network.cpython-39.pyc -------------------------------------------------------------------------------- /models/cec/__pycache__/helper.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noorahmedds/OrCo/HEAD/models/cec/__pycache__/helper.cpython-39.pyc -------------------------------------------------------------------------------- /models/orco/__pycache__/helper.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noorahmedds/OrCo/HEAD/models/orco/__pycache__/helper.cpython-39.pyc -------------------------------------------------------------------------------- /models/orco/__pycache__/mixup.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noorahmedds/OrCo/HEAD/models/orco/__pycache__/mixup.cpython-39.pyc -------------------------------------------------------------------------------- /models/orco/__pycache__/supcon.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noorahmedds/OrCo/HEAD/models/orco/__pycache__/supcon.cpython-39.pyc -------------------------------------------------------------------------------- /dataloader/__pycache__/data_utils.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noorahmedds/OrCo/HEAD/dataloader/__pycache__/data_utils.cpython-39.pyc -------------------------------------------------------------------------------- /models/orco/__pycache__/Network.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noorahmedds/OrCo/HEAD/models/orco/__pycache__/Network.cpython-39.pyc -------------------------------------------------------------------------------- /dataloader/__pycache__/autoaugment.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noorahmedds/OrCo/HEAD/dataloader/__pycache__/autoaugment.cpython-39.pyc -------------------------------------------------------------------------------- /models/cec/__pycache__/BaseNetwork.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noorahmedds/OrCo/HEAD/models/cec/__pycache__/BaseNetwork.cpython-39.pyc -------------------------------------------------------------------------------- /scheduler/__pycache__/lr_scheduler.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noorahmedds/OrCo/HEAD/scheduler/__pycache__/lr_scheduler.cpython-39.pyc -------------------------------------------------------------------------------- /dataloader/cifar100/__pycache__/cifar.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noorahmedds/OrCo/HEAD/dataloader/cifar100/__pycache__/cifar.cpython-39.pyc -------------------------------------------------------------------------------- /dataloader/cub200/__pycache__/cub200.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noorahmedds/OrCo/HEAD/dataloader/cub200/__pycache__/cub200.cpython-39.pyc -------------------------------------------------------------------------------- /models/cec/__pycache__/fscil_trainer.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noorahmedds/OrCo/HEAD/models/cec/__pycache__/fscil_trainer.cpython-39.pyc -------------------------------------------------------------------------------- /models/orco/__pycache__/fscil_trainer.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noorahmedds/OrCo/HEAD/models/orco/__pycache__/fscil_trainer.cpython-39.pyc -------------------------------------------------------------------------------- /models/orco/__pycache__/gaussian_utils.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noorahmedds/OrCo/HEAD/models/orco/__pycache__/gaussian_utils.cpython-39.pyc -------------------------------------------------------------------------------- /models/orco/__pycache__/knn_classifier.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noorahmedds/OrCo/HEAD/models/orco/__pycache__/knn_classifier.cpython-39.pyc -------------------------------------------------------------------------------- /dataloader/miniimagenet/__pycache__/miniimagenet.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noorahmedds/OrCo/HEAD/dataloader/miniimagenet/__pycache__/miniimagenet.cpython-39.pyc -------------------------------------------------------------------------------- /solo_learn/README.md: -------------------------------------------------------------------------------- 1 | ## MINIMAL SOLO-LEARN 2 | This is the minimal repo from solo-learn. The reduced repo has not been completely tested. Please write to us if you find some issues in running the code. -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | __archive__/ 2 | *.ckpt 3 | 4 | checkpoint/*/ 5 | 6 | __pycache__ 7 | 8 | params/OrCo 9 | 10 | models/__archive__/ 11 | models/__pycache__/ 12 | 13 | solo_learn/solo/datasets/* 14 | solo_learn/wandb/* -------------------------------------------------------------------------------- /data/index_list/cifar100/session_2.txt: -------------------------------------------------------------------------------- 1 | 29774 2 | 33344 3 | 4815 4 | 6772 5 | 48317 6 | 29918 7 | 33262 8 | 5138 9 | 7342 10 | 47874 11 | 28864 12 | 32471 13 | 4316 14 | 6436 15 | 47498 16 | 29802 17 | 33159 18 | 3730 19 | 5093 20 | 47740 21 | 30548 22 | 34549 23 | 2845 24 | 4996 25 | 47866 26 | -------------------------------------------------------------------------------- /data/index_list/cifar100/session_3.txt: -------------------------------------------------------------------------------- 1 | 28855 2 | 32834 3 | 4603 4 | 6914 5 | 48126 6 | 29932 7 | 33300 8 | 3860 9 | 5424 10 | 47055 11 | 29434 12 | 32604 13 | 4609 14 | 6380 15 | 47844 16 | 30456 17 | 34217 18 | 4361 19 | 6550 20 | 46896 21 | 29664 22 | 32857 23 | 4923 24 | 7502 25 | 47270 26 | -------------------------------------------------------------------------------- /data/index_list/cifar100/session_4.txt: -------------------------------------------------------------------------------- 1 | 31267 2 | 34427 3 | 4799 4 | 6611 5 | 47404 6 | 28509 7 | 31687 8 | 3477 9 | 5563 10 | 48003 11 | 29545 12 | 33412 13 | 5114 14 | 6808 15 | 47692 16 | 29209 17 | 33265 18 | 4131 19 | 6401 20 | 48102 21 | 31290 22 | 34432 23 | 6060 24 | 8451 25 | 48279 26 | -------------------------------------------------------------------------------- /data/index_list/cifar100/session_5.txt: -------------------------------------------------------------------------------- 1 | 32337 2 | 35646 3 | 6022 4 | 9048 5 | 48584 6 | 30768 7 | 34394 8 | 5091 9 | 6510 10 | 48023 11 | 30310 12 | 33230 13 | 5098 14 | 6671 15 | 48349 16 | 29690 17 | 33490 18 | 4260 19 | 5916 20 | 47371 21 | 31173 22 | 34943 23 | 4517 24 | 6494 25 | 47689 26 | -------------------------------------------------------------------------------- /data/index_list/cifar100/session_6.txt: -------------------------------------------------------------------------------- 1 | 30281 2 | 33894 3 | 3768 4 | 6113 5 | 48095 6 | 28913 7 | 32821 8 | 6172 9 | 8276 10 | 48004 11 | 31249 12 | 34088 13 | 5257 14 | 6961 15 | 47534 16 | 30404 17 | 34101 18 | 4985 19 | 6899 20 | 48115 21 | 31823 22 | 35148 23 | 3922 24 | 6548 25 | 48127 26 | -------------------------------------------------------------------------------- /data/index_list/cifar100/session_7.txt: -------------------------------------------------------------------------------- 1 | 30815 2 | 34450 3 | 3481 4 | 5089 5 | 47913 6 | 31683 7 | 34591 8 | 5251 9 | 7608 10 | 47984 11 | 29837 12 | 33823 13 | 4615 14 | 6448 15 | 47752 16 | 31222 17 | 34079 18 | 5686 19 | 7919 20 | 48675 21 | 28567 22 | 32964 23 | 5009 24 | 6201 25 | 47039 26 | -------------------------------------------------------------------------------- /data/index_list/cifar100/session_8.txt: -------------------------------------------------------------------------------- 1 | 29355 2 | 33909 3 | 3982 4 | 5389 5 | 47166 6 | 31058 7 | 35180 8 | 5177 9 | 6890 10 | 48032 11 | 31176 12 | 35098 13 | 5235 14 | 7861 15 | 47830 16 | 30874 17 | 34639 18 | 5266 19 | 7489 20 | 47323 21 | 29960 22 | 34050 23 | 4988 24 | 7434 25 | 48208 26 | -------------------------------------------------------------------------------- /data/index_list/cifar100/session_9.txt: -------------------------------------------------------------------------------- 1 | 30463 2 | 34580 3 | 5230 4 | 6813 5 | 48605 6 | 31702 7 | 35249 8 | 5854 9 | 7765 10 | 48444 11 | 30380 12 | 34028 13 | 5211 14 | 7433 15 | 47988 16 | 31348 17 | 34021 18 | 4929 19 | 7033 20 | 47904 21 | 30627 22 | 33728 23 | 4895 24 | 6299 25 | 47507 26 | -------------------------------------------------------------------------------- /solo_learn/datasets/fscil_data/index_list/cifar100/session_2.txt: -------------------------------------------------------------------------------- 1 | 29774 2 | 33344 3 | 4815 4 | 6772 5 | 48317 6 | 29918 7 | 33262 8 | 5138 9 | 7342 10 | 47874 11 | 28864 12 | 32471 13 | 4316 14 | 6436 15 | 47498 16 | 29802 17 | 33159 18 | 3730 19 | 5093 20 | 47740 21 | 30548 22 | 34549 23 | 2845 24 | 4996 25 | 47866 26 | -------------------------------------------------------------------------------- /solo_learn/datasets/fscil_data/index_list/cifar100/session_3.txt: -------------------------------------------------------------------------------- 1 | 28855 2 | 32834 3 | 4603 4 | 6914 5 | 48126 6 | 29932 7 | 33300 8 | 3860 9 | 5424 10 | 47055 11 | 29434 12 | 32604 13 | 4609 14 | 6380 15 | 47844 16 | 30456 17 | 34217 18 | 4361 19 | 6550 20 | 46896 21 | 29664 22 | 32857 23 | 4923 24 | 7502 25 | 47270 26 | -------------------------------------------------------------------------------- /solo_learn/datasets/fscil_data/index_list/cifar100/session_4.txt: -------------------------------------------------------------------------------- 1 | 31267 2 | 34427 3 | 4799 4 | 6611 5 | 47404 6 | 28509 7 | 31687 8 | 3477 9 | 5563 10 | 48003 11 | 29545 12 | 33412 13 | 5114 14 | 6808 15 | 47692 16 | 29209 17 | 33265 18 | 4131 19 | 6401 20 | 48102 21 | 31290 22 | 34432 23 | 6060 24 | 8451 25 | 48279 26 | -------------------------------------------------------------------------------- /solo_learn/datasets/fscil_data/index_list/cifar100/session_5.txt: -------------------------------------------------------------------------------- 1 | 32337 2 | 35646 3 | 6022 4 | 9048 5 | 48584 6 | 30768 7 | 34394 8 | 5091 9 | 6510 10 | 48023 11 | 30310 12 | 33230 13 | 5098 14 | 6671 15 | 48349 16 | 29690 17 | 33490 18 | 4260 19 | 5916 20 | 47371 21 | 31173 22 | 34943 23 | 4517 24 | 6494 25 | 47689 26 | -------------------------------------------------------------------------------- /solo_learn/datasets/fscil_data/index_list/cifar100/session_6.txt: -------------------------------------------------------------------------------- 1 | 30281 2 | 33894 3 | 3768 4 | 6113 5 | 48095 6 | 28913 7 | 32821 8 | 6172 9 | 8276 10 | 48004 11 | 31249 12 | 34088 13 | 5257 14 | 6961 15 | 47534 16 | 30404 17 | 34101 18 | 4985 19 | 6899 20 | 48115 21 | 31823 22 | 35148 23 | 3922 24 | 6548 25 | 48127 26 | -------------------------------------------------------------------------------- /solo_learn/datasets/fscil_data/index_list/cifar100/session_7.txt: -------------------------------------------------------------------------------- 1 | 30815 2 | 34450 3 | 3481 4 | 5089 5 | 47913 6 | 31683 7 | 34591 8 | 5251 9 | 7608 10 | 47984 11 | 29837 12 | 33823 13 | 4615 14 | 6448 15 | 47752 16 | 31222 17 | 34079 18 | 5686 19 | 7919 20 | 48675 21 | 28567 22 | 32964 23 | 5009 24 | 6201 25 | 47039 26 | -------------------------------------------------------------------------------- /solo_learn/datasets/fscil_data/index_list/cifar100/session_8.txt: -------------------------------------------------------------------------------- 1 | 29355 2 | 33909 3 | 3982 4 | 5389 5 | 47166 6 | 31058 7 | 35180 8 | 5177 9 | 6890 10 | 48032 11 | 31176 12 | 35098 13 | 5235 14 | 7861 15 | 47830 16 | 30874 17 | 34639 18 | 5266 19 | 7489 20 | 47323 21 | 29960 22 | 34050 23 | 4988 24 | 7434 25 | 48208 26 | -------------------------------------------------------------------------------- /solo_learn/datasets/fscil_data/index_list/cifar100/session_9.txt: -------------------------------------------------------------------------------- 1 | 30463 2 | 34580 3 | 5230 4 | 6813 5 | 48605 6 | 31702 7 | 35249 8 | 5854 9 | 7765 10 | 48444 11 | 30380 12 | 34028 13 | 5211 14 | 7433 15 | 47988 16 | 31348 17 | 34021 18 | 4929 19 | 7033 20 | 47904 21 | 30627 22 | 33728 23 | 4895 24 | 6299 25 | 47507 26 | -------------------------------------------------------------------------------- /solo_learn/scripts/pretrain/cifar/augmentations/reconstruction.yaml: -------------------------------------------------------------------------------- 1 | - rrc: 2 | enabled: True 3 | crop_min_scale: 0.08 4 | crop_max_scale: 1.0 5 | color_jitter: 6 | prob: 0.0 7 | grayscale: 8 | prob: 0.0 9 | gaussian_blur: 10 | prob: 0.0 11 | solarization: 12 | prob: 0.0 13 | equalization: 14 | prob: 0.0 15 | horizontal_flip: 16 | prob: 0.5 17 | crop_size: 32 18 | num_crops: 1 19 | -------------------------------------------------------------------------------- /solo_learn/scripts/pretrain/minet/augmentations/reconstruction.yaml: -------------------------------------------------------------------------------- 1 | - rrc: 2 | enabled: True 3 | crop_min_scale: 0.08 4 | crop_max_scale: 1.0 5 | color_jitter: 6 | prob: 0.0 7 | grayscale: 8 | prob: 0.0 9 | gaussian_blur: 10 | prob: 0.0 11 | solarization: 12 | prob: 0.0 13 | equalization: 14 | prob: 0.0 15 | horizontal_flip: 16 | prob: 0.5 17 | crop_size: 32 18 | num_crops: 1 19 | -------------------------------------------------------------------------------- /scripts/incremental_session/run_minet.sh: -------------------------------------------------------------------------------- 1 | model_dir="./params/OrCo/minet/minet_e380_01simclr_acc85_95.ckpt" 2 | 3 | python "train.py" \ 4 | -project orco \ 5 | -dataset mini_imagenet \ 6 | -save_path_prefix best \ 7 | -gpu 0 \ 8 | -model_dir ${model_dir} \ 9 | -epochs_base 10 \ 10 | -epochs_joint 100 \ 11 | -batch_size_joint 64 \ 12 | -joint_schedule Cosine \ 13 | -decay_new 1e-4 \ 14 | -decay 1e-4 \ 15 | -cos_b_lam 0 \ -------------------------------------------------------------------------------- /solo_learn/scripts/pretrain/cifar/augmentations/symmetric.yaml: -------------------------------------------------------------------------------- 1 | - rrc: 2 | enabled: True 3 | crop_min_scale: 0.08 4 | crop_max_scale: 1.0 5 | color_jitter: 6 | prob: 0.8 7 | brightness: 0.8 8 | contrast: 0.8 9 | saturation: 0.8 10 | hue: 0.2 11 | grayscale: 12 | prob: 0.2 13 | gaussian_blur: 14 | prob: 0.0 15 | solarization: 16 | prob: 0.0 17 | equalization: 18 | prob: 0.0 19 | horizontal_flip: 20 | prob: 0.5 21 | crop_size: 32 22 | num_crops: 2 23 | -------------------------------------------------------------------------------- /solo_learn/scripts/pretrain/minet/augmentations/symmetric.yaml: -------------------------------------------------------------------------------- 1 | - rrc: 2 | enabled: True 3 | crop_min_scale: 0.08 4 | crop_max_scale: 1.0 5 | color_jitter: 6 | prob: 0.8 7 | brightness: 0.8 8 | contrast: 0.8 9 | saturation: 0.8 10 | hue: 0.2 11 | grayscale: 12 | prob: 0.2 13 | gaussian_blur: 14 | prob: 0.5 15 | solarization: 16 | prob: 0.0 17 | equalization: 18 | prob: 0.0 19 | horizontal_flip: 20 | prob: 0.5 21 | crop_size: 84 22 | num_crops: 2 23 | -------------------------------------------------------------------------------- /solo_learn/scripts/pretrain/cifar/augmentations/symmetric_weak.yaml: -------------------------------------------------------------------------------- 1 | - rrc: 2 | enabled: True 3 | crop_min_scale: 0.08 4 | crop_max_scale: 1.0 5 | color_jitter: 6 | prob: 0.8 7 | brightness: 0.4 8 | contrast: 0.4 9 | saturation: 0.4 10 | hue: 0.1 11 | grayscale: 12 | prob: 0.2 13 | gaussian_blur: 14 | prob: 0.5 15 | solarization: 16 | prob: 0.0 17 | equalization: 18 | prob: 0.0 19 | horizontal_flip: 20 | prob: 0.5 21 | crop_size: 32 22 | num_crops: 2 23 | -------------------------------------------------------------------------------- /solo_learn/scripts/pretrain/minet/augmentations/symmetric_224.yaml: -------------------------------------------------------------------------------- 1 | - rrc: 2 | enabled: True 3 | crop_min_scale: 0.08 4 | crop_max_scale: 1.0 5 | color_jitter: 6 | prob: 0.8 7 | brightness: 0.8 8 | contrast: 0.8 9 | saturation: 0.8 10 | hue: 0.2 11 | grayscale: 12 | prob: 0.2 13 | gaussian_blur: 14 | prob: 0.5 15 | solarization: 16 | prob: 0.0 17 | equalization: 18 | prob: 0.0 19 | horizontal_flip: 20 | prob: 0.5 21 | crop_size: 224 22 | num_crops: 2 23 | -------------------------------------------------------------------------------- /solo_learn/scripts/pretrain/minet/augmentations/symmetric_strong.yaml: -------------------------------------------------------------------------------- 1 | - rrc: 2 | enabled: True 3 | crop_min_scale: 0.08 4 | crop_max_scale: 1.0 5 | color_jitter: 6 | prob: 0.8 7 | brightness: 0.8 8 | contrast: 0.8 9 | saturation: 0.8 10 | hue: 0.2 11 | grayscale: 12 | prob: 0.2 13 | gaussian_blur: 14 | prob: 0.5 15 | solarization: 16 | prob: 0.0 17 | equalization: 18 | prob: 0.0 19 | horizontal_flip: 20 | prob: 0.5 21 | crop_size: 84 22 | num_crops: 4 23 | -------------------------------------------------------------------------------- /solo_learn/scripts/pretrain/minet/augmentations/symmetric_weak.yaml: -------------------------------------------------------------------------------- 1 | - rrc: 2 | enabled: True 3 | crop_min_scale: 0.08 4 | crop_max_scale: 1.0 5 | color_jitter: 6 | prob: 0.8 7 | brightness: 0.4 8 | contrast: 0.4 9 | saturation: 0.4 10 | hue: 0.1 11 | grayscale: 12 | prob: 0.2 13 | gaussian_blur: 14 | prob: 0.5 15 | solarization: 16 | prob: 0.0 17 | equalization: 18 | prob: 0.0 19 | horizontal_flip: 20 | prob: 0.5 21 | crop_size: 32 22 | num_crops: 2 23 | -------------------------------------------------------------------------------- /solo_learn/scripts/pretrain/minet/augmentations/symmetric_stronger.yaml: -------------------------------------------------------------------------------- 1 | - rrc: 2 | enabled: True 3 | crop_min_scale: 0.08 4 | crop_max_scale: 1.0 5 | color_jitter: 6 | prob: 0.8 7 | brightness: 0.8 8 | contrast: 0.8 9 | saturation: 0.8 10 | hue: 0.2 11 | grayscale: 12 | prob: 0.3 13 | gaussian_blur: 14 | prob: 0.5 15 | solarization: 16 | prob: 0.2 17 | equalization: 18 | prob: 0.1 19 | horizontal_flip: 20 | prob: 0.5 21 | crop_size: 84 22 | num_crops: 4 23 | -------------------------------------------------------------------------------- /solo_learn/scripts/pretrain/minet/augmentations/single.yaml: -------------------------------------------------------------------------------- 1 | - rrc: 2 | enabled: True 3 | crop_min_scale: 0.08 4 | crop_max_scale: 1.0 5 | color_jitter: 6 | prob: 0.8 7 | brightness: 0.8 8 | contrast: 0.8 9 | saturation: 0.8 10 | hue: 0.2 11 | grayscale: 12 | prob: 0.2 13 | gaussian_blur: 14 | prob: 0.5 15 | solarization: 16 | prob: 0.0 17 | equalization: 18 | prob: 0.0 19 | horizontal_flip: 20 | prob: 0.5 21 | crop_size: 84 22 | num_crops: 1 23 | auto_augment: True 24 | -------------------------------------------------------------------------------- /solo_learn/scripts/pretrain/cifar/augmentations/symmetric_auto_augment.yaml: -------------------------------------------------------------------------------- 1 | - rrc: 2 | enabled: True 3 | crop_min_scale: 0.2 4 | crop_max_scale: 1.0 5 | color_jitter: 6 | prob: 0.8 7 | brightness: 0.8 8 | contrast: 0.8 9 | saturation: 0.8 10 | hue: 0.2 11 | grayscale: 12 | prob: 0.2 13 | gaussian_blur: 14 | prob: 0.5 15 | solarization: 16 | prob: 0.0 17 | equalization: 18 | prob: 0.0 19 | horizontal_flip: 20 | prob: 0.5 21 | crop_size: 32 22 | num_crops: 4 #< 23 | auto_augment: True 24 | -------------------------------------------------------------------------------- /solo_learn/scripts/pretrain/minet/augmentations/symmetric_auto_augment.yaml: -------------------------------------------------------------------------------- 1 | - rrc: 2 | enabled: True 3 | crop_min_scale: 0.08 4 | crop_max_scale: 1.0 5 | color_jitter: 6 | prob: 0.8 7 | brightness: 0.8 8 | contrast: 0.8 9 | saturation: 0.8 10 | hue: 0.2 11 | grayscale: 12 | prob: 0.2 13 | gaussian_blur: 14 | prob: 0.5 15 | solarization: 16 | prob: 0.0 17 | equalization: 18 | prob: 0.0 19 | horizontal_flip: 20 | prob: 0.5 21 | crop_size: 84 22 | num_crops: 2 23 | auto_augment: True 24 | -------------------------------------------------------------------------------- /scripts/incremental_session/run_cub.sh: -------------------------------------------------------------------------------- 1 | python train.py \ 2 | -project orco \ 3 | -dataset cub200 \ 4 | -save_path_prefix best \ 5 | -gpu 0 \ 6 | -epochs_base 100 \ 7 | -epochs_joint 100 \ 8 | -epochs_target_gen 5000 \ 9 | -batch_size_joint 32 \ 10 | -base_schedule Cosine \ 11 | -joint_schedule Cosine \ 12 | -reserve_mode full \ 13 | -decay 5e-4 \ 14 | -decay_new 1e-5 \ 15 | -cos_b_lam 0.6 \ 16 | -lr_base 0.025 \ 17 | -lr_base_encoder 0.025 \ 18 | -lr_new 0.05 \ 19 | -fine_tune_backbone_base \ -------------------------------------------------------------------------------- /scripts/incremental_session/run_cifar.sh: -------------------------------------------------------------------------------- 1 | model_dir="./params/OrCo/cifar100/cifar_e280_01simclr_acc80_22.ckpt" 2 | 3 | python "train.py" \ 4 | -project orco \ 5 | -dataset cifar100 \ 6 | -save_path_prefix best \ 7 | -gpu 0 \ 8 | -model_dir ${model_dir} \ 9 | -epochs_base 10 \ 10 | -epochs_joint 100 \ 11 | -batch_size_joint 64 \ 12 | -joint_schedule Cosine \ 13 | -decay 5e-4 \ 14 | -decay_new 1e-4 \ 15 | -cos_b_lam 0 \ 16 | -lr_base 0.25 \ 17 | -perturb_epsilon_base 9e-05 \ 18 | -perturb_epsilon_inc 9e-05 \ 19 | -rand_aug_sup_con -------------------------------------------------------------------------------- /solo_learn/solo/args/umap.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | 3 | from solo.args.dataset import custom_dataset_args, dataset_args 4 | 5 | 6 | def parse_args_umap() -> argparse.Namespace: 7 | """Parses arguments for offline UMAP. 8 | 9 | Returns: 10 | argparse.Namespace: a namespace containing all args needed for pretraining. 11 | """ 12 | 13 | parser = argparse.ArgumentParser() 14 | 15 | # add knn args 16 | parser.add_argument("--pretrained_checkpoint_dir", type=str) 17 | parser.add_argument("--batch_size", type=int, default=16) 18 | parser.add_argument("--num_workers", type=int, default=10) 19 | 20 | # add shared arguments 21 | dataset_args(parser) 22 | custom_dataset_args(parser) 23 | 24 | # parse args 25 | args = parser.parse_args() 26 | 27 | return args 28 | -------------------------------------------------------------------------------- /solo_learn/scripts/pretrain/cifar/augmentations/ressl.yaml: -------------------------------------------------------------------------------- 1 | - rrc: 2 | enabled: True 3 | crop_min_scale: 0.08 4 | crop_max_scale: 1.0 5 | color_jitter: 6 | prob: 0.8 7 | brightness: 0.4 8 | contrast: 0.4 9 | saturation: 0.2 10 | hue: 0.1 11 | grayscale: 12 | prob: 0.2 13 | gaussian_blur: 14 | prob: 0.5 15 | solarization: 16 | prob: 0.0 17 | equalization: 18 | prob: 0.0 19 | horizontal_flip: 20 | prob: 0.5 21 | crop_size: 32 22 | num_crops: 1 23 | 24 | - rrc: 25 | enabled: True 26 | crop_min_scale: 0.08 27 | crop_max_scale: 1.0 28 | color_jitter: 29 | prob: 0.0 30 | grayscale: 31 | prob: 0.0 32 | gaussian_blur: 33 | prob: 0.0 34 | solarization: 35 | prob: 0.0 36 | equalization: 37 | prob: 0.0 38 | horizontal_flip: 39 | prob: 0.5 40 | crop_size: 32 41 | num_crops: 1 42 | -------------------------------------------------------------------------------- /solo_learn/scripts/pretrain/minet/augmentations/ressl.yaml: -------------------------------------------------------------------------------- 1 | - rrc: 2 | enabled: True 3 | crop_min_scale: 0.08 4 | crop_max_scale: 1.0 5 | color_jitter: 6 | prob: 0.8 7 | brightness: 0.4 8 | contrast: 0.4 9 | saturation: 0.2 10 | hue: 0.1 11 | grayscale: 12 | prob: 0.2 13 | gaussian_blur: 14 | prob: 0.5 15 | solarization: 16 | prob: 0.0 17 | equalization: 18 | prob: 0.0 19 | horizontal_flip: 20 | prob: 0.5 21 | crop_size: 32 22 | num_crops: 1 23 | 24 | - rrc: 25 | enabled: True 26 | crop_min_scale: 0.08 27 | crop_max_scale: 1.0 28 | color_jitter: 29 | prob: 0.0 30 | grayscale: 31 | prob: 0.0 32 | gaussian_blur: 33 | prob: 0.0 34 | solarization: 35 | prob: 0.0 36 | equalization: 37 | prob: 0.0 38 | horizontal_flip: 39 | prob: 0.5 40 | crop_size: 32 41 | num_crops: 1 42 | -------------------------------------------------------------------------------- /data/index_list/README.md: -------------------------------------------------------------------------------- 1 | ### How to use the index files for the experiments ? 2 | 3 | The index files are named like "session_x.txt", where x indicates the session number. Each index file stores the indexes of the images that are selected for the session. 4 | "session_1.txt" stores all the base class training images. Each "session_t.txt" (t>1) stores the 25 (5 classes and 5 shots per class) few-shot new class training images. 5 | You may adopt the following steps to perform the experiments. 6 | 7 | First, at session 1, train a base model using the images in session_1.txt; 8 | 9 | Then, at session t (t>1), finetune the model trained at the previous session (t-1), only using the images in session_t.txt. 10 | 11 | For evaluating the model at session t, first joint all the encountered test sets as a single test set. Then test the current model using all the test images and compute the recognition accuracy. 12 | -------------------------------------------------------------------------------- /solo_learn/datasets/fscil_data/index_list/README.md: -------------------------------------------------------------------------------- 1 | ### How to use the index files for the experiments ? 2 | 3 | The index files are named like "session_x.txt", where x indicates the session number. Each index file stores the indexes of the images that are selected for the session. 4 | "session_1.txt" stores all the base class training images. Each "session_t.txt" (t>1) stores the 25 (5 classes and 5 shots per class) few-shot new class training images. 5 | You may adopt the following steps to perform the experiments. 6 | 7 | First, at session 1, train a base model using the images in session_1.txt; 8 | 9 | Then, at session t (t>1), finetune the model trained at the previous session (t-1), only using the images in session_t.txt. 10 | 11 | For evaluating the model at session t, first joint all the encountered test sets as a single test set. Then test the current model using all the test images and compute the recognition accuracy. 12 | -------------------------------------------------------------------------------- /solo_learn/scripts/pretrain/cifar/augmentations/asymmetric.yaml: -------------------------------------------------------------------------------- 1 | - rrc: 2 | enabled: True 3 | crop_min_scale: 0.08 4 | crop_max_scale: 1.0 5 | color_jitter: 6 | prob: 0.8 7 | brightness: 0.4 8 | contrast: 0.4 9 | saturation: 0.2 10 | hue: 0.1 11 | grayscale: 12 | prob: 0.2 13 | gaussian_blur: 14 | prob: 0.0 15 | solarization: 16 | prob: 0.0 17 | equalization: 18 | prob: 0.0 19 | horizontal_flip: 20 | prob: 0.5 21 | crop_size: 32 22 | num_crops: 1 23 | 24 | - rrc: 25 | enabled: True 26 | crop_min_scale: 0.08 27 | crop_max_scale: 1.0 28 | color_jitter: 29 | prob: 0.8 30 | brightness: 0.4 31 | contrast: 0.4 32 | saturation: 0.2 33 | hue: 0.1 34 | grayscale: 35 | prob: 0.2 36 | gaussian_blur: 37 | prob: 0.0 38 | solarization: 39 | prob: 0.2 40 | equalization: 41 | prob: 0.0 42 | horizontal_flip: 43 | prob: 0.5 44 | crop_size: 32 45 | num_crops: 1 46 | -------------------------------------------------------------------------------- /solo_learn/scripts/pretrain/minet/augmentations/asymmetric.yaml: -------------------------------------------------------------------------------- 1 | - rrc: 2 | enabled: True 3 | crop_min_scale: 0.08 4 | crop_max_scale: 1.0 5 | color_jitter: 6 | prob: 0.8 7 | brightness: 0.4 8 | contrast: 0.4 9 | saturation: 0.2 10 | hue: 0.1 11 | grayscale: 12 | prob: 0.2 13 | gaussian_blur: 14 | prob: 0.0 15 | solarization: 16 | prob: 0.0 17 | equalization: 18 | prob: 0.0 19 | horizontal_flip: 20 | prob: 0.5 21 | crop_size: 32 22 | num_crops: 1 23 | 24 | - rrc: 25 | enabled: True 26 | crop_min_scale: 0.08 27 | crop_max_scale: 1.0 28 | color_jitter: 29 | prob: 0.8 30 | brightness: 0.4 31 | contrast: 0.4 32 | saturation: 0.2 33 | hue: 0.1 34 | grayscale: 35 | prob: 0.2 36 | gaussian_blur: 37 | prob: 0.0 38 | solarization: 39 | prob: 0.2 40 | equalization: 41 | prob: 0.0 42 | horizontal_flip: 43 | prob: 0.5 44 | crop_size: 32 45 | num_crops: 1 46 | -------------------------------------------------------------------------------- /solo_learn/solo/data/dataset_subset/imagenet100_classes.txt: -------------------------------------------------------------------------------- 1 | n02869837 n01749939 n02488291 n02107142 n13037406 n02091831 n04517823 n04589890 n03062245 n01773797 n01735189 n07831146 n07753275 n03085013 n04485082 n02105505 n01983481 n02788148 n03530642 n04435653 n02086910 n02859443 n13040303 n03594734 n02085620 n02099849 n01558993 n04493381 n02109047 n04111531 n02877765 n04429376 n02009229 n01978455 n02106550 n01820546 n01692333 n07714571 n02974003 n02114855 n03785016 n03764736 n03775546 n02087046 n07836838 n04099969 n04592741 n03891251 n02701002 n03379051 n02259212 n07715103 n03947888 n04026417 n02326432 n03637318 n01980166 n02113799 n02086240 n03903868 n02483362 n04127249 n02089973 n03017168 n02093428 n02804414 n02396427 n04418357 n02172182 n01729322 n02113978 n03787032 n02089867 n02119022 n03777754 n04238763 n02231487 n03032252 n02138441 n02104029 n03837869 n03494278 n04136333 n03794056 n03492542 n02018207 n04067472 n03930630 n03584829 n02123045 n04229816 n02100583 n03642806 n04336792 n03259280 n02116738 n02108089 n03424325 n01855672 n02090622 2 | -------------------------------------------------------------------------------- /solo_learn/solo/args/knn.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | 3 | from solo.args.dataset import custom_dataset_args, dataset_args 4 | 5 | 6 | def parse_args_knn() -> argparse.Namespace: 7 | """Parses arguments for offline K-NN. 8 | 9 | Returns: 10 | argparse.Namespace: a namespace containing all args needed for pretraining. 11 | """ 12 | 13 | parser = argparse.ArgumentParser() 14 | 15 | # add knn args 16 | parser.add_argument("--pretrained_checkpoint_dir", type=str) 17 | parser.add_argument("--pretrained_checkpoint_file", type=str) 18 | parser.add_argument("--version", type=str) 19 | parser.add_argument("--epoch", type=str, default='-1') 20 | parser.add_argument("--batch_size", type=int, default=16) 21 | parser.add_argument("--num_workers", type=int, default=10) 22 | parser.add_argument("--k", type=int, nargs="+") 23 | parser.add_argument("--temperature", type=float, nargs="+") 24 | parser.add_argument("--distance_function", type=str, nargs="+") 25 | parser.add_argument("--feature_type", type=str, nargs="+") 26 | 27 | # add shared arguments 28 | dataset_args(parser) 29 | custom_dataset_args(parser) 30 | 31 | # parse args 32 | args = parser.parse_args() 33 | 34 | return args 35 | -------------------------------------------------------------------------------- /solo_learn/solo/args/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | from solo.args import dataset, knn, linear, pretrain 21 | 22 | __all__ = ["dataset", "knn", "linear", "pretrain"] 23 | -------------------------------------------------------------------------------- /solo_learn/solo/backbones/resnet/resnet.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | from torchvision.models import resnet18 21 | from torchvision.models import resnet50 22 | 23 | __all__ = ["resnet18", "resnet50"] 24 | -------------------------------------------------------------------------------- /solo_learn/solo/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | 21 | from solo import args, backbones, data, losses, methods, utils 22 | 23 | __all__ = ["args", "backbones", "data", "losses", "methods", "utils"] 24 | -------------------------------------------------------------------------------- /solo_learn/solo/backbones/nueralcollapse/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | from .resnet12 import resnet12_nc as default_resnet12_nc 21 | 22 | def resnet12_nc(method, *args, **kwargs): 23 | return default_resnet12_nc(*args, **kwargs) 24 | 25 | __all__ = ["resnet12_nc"] 26 | -------------------------------------------------------------------------------- /data/index_list/mini_imagenet/session_2.txt: -------------------------------------------------------------------------------- 1 | MINI-ImageNet/train/n03544143/n0354414300000811.jpg 2 | MINI-ImageNet/train/n03544143/n0354414300000906.jpg 3 | MINI-ImageNet/train/n03544143/n0354414300000122.jpg 4 | MINI-ImageNet/train/n03544143/n0354414300000185.jpg 5 | MINI-ImageNet/train/n03544143/n0354414300001258.jpg 6 | MINI-ImageNet/train/n03584254/n0358425400000818.jpg 7 | MINI-ImageNet/train/n03584254/n0358425400000891.jpg 8 | MINI-ImageNet/train/n03584254/n0358425400000145.jpg 9 | MINI-ImageNet/train/n03584254/n0358425400000186.jpg 10 | MINI-ImageNet/train/n03584254/n0358425400001254.jpg 11 | MINI-ImageNet/train/n03676483/n0367648300000772.jpg 12 | MINI-ImageNet/train/n03676483/n0367648300000864.jpg 13 | MINI-ImageNet/train/n03676483/n0367648300000108.jpg 14 | MINI-ImageNet/train/n03676483/n0367648300000164.jpg 15 | MINI-ImageNet/train/n03676483/n0367648300001236.jpg 16 | MINI-ImageNet/train/n03770439/n0377043900000738.jpg 17 | MINI-ImageNet/train/n03770439/n0377043900000835.jpg 18 | MINI-ImageNet/train/n03770439/n0377043900000111.jpg 19 | MINI-ImageNet/train/n03770439/n0377043900000154.jpg 20 | MINI-ImageNet/train/n03770439/n0377043900001238.jpg 21 | MINI-ImageNet/train/n03773504/n0377350400000781.jpg 22 | MINI-ImageNet/train/n03773504/n0377350400000880.jpg 23 | MINI-ImageNet/train/n03773504/n0377350400000132.jpg 24 | MINI-ImageNet/train/n03773504/n0377350400000177.jpg 25 | MINI-ImageNet/train/n03773504/n0377350400001237.jpg 26 | -------------------------------------------------------------------------------- /data/index_list/mini_imagenet/session_3.txt: -------------------------------------------------------------------------------- 1 | MINI-ImageNet/train/n03775546/n0377554600000808.jpg 2 | MINI-ImageNet/train/n03775546/n0377554600000891.jpg 3 | MINI-ImageNet/train/n03775546/n0377554600000123.jpg 4 | MINI-ImageNet/train/n03775546/n0377554600000179.jpg 5 | MINI-ImageNet/train/n03775546/n0377554600001241.jpg 6 | MINI-ImageNet/train/n03838899/n0383889900000800.jpg 7 | MINI-ImageNet/train/n03838899/n0383889900000881.jpg 8 | MINI-ImageNet/train/n03838899/n0383889900000124.jpg 9 | MINI-ImageNet/train/n03838899/n0383889900000165.jpg 10 | MINI-ImageNet/train/n03838899/n0383889900001242.jpg 11 | MINI-ImageNet/train/n03854065/n0385406500000796.jpg 12 | MINI-ImageNet/train/n03854065/n0385406500000899.jpg 13 | MINI-ImageNet/train/n03854065/n0385406500000103.jpg 14 | MINI-ImageNet/train/n03854065/n0385406500000146.jpg 15 | MINI-ImageNet/train/n03854065/n0385406500001249.jpg 16 | MINI-ImageNet/train/n03888605/n0388860500000783.jpg 17 | MINI-ImageNet/train/n03888605/n0388860500000875.jpg 18 | MINI-ImageNet/train/n03888605/n0388860500000124.jpg 19 | MINI-ImageNet/train/n03888605/n0388860500000184.jpg 20 | MINI-ImageNet/train/n03888605/n0388860500001245.jpg 21 | MINI-ImageNet/train/n03908618/n0390861800000778.jpg 22 | MINI-ImageNet/train/n03908618/n0390861800000855.jpg 23 | MINI-ImageNet/train/n03908618/n0390861800000127.jpg 24 | MINI-ImageNet/train/n03908618/n0390861800000175.jpg 25 | MINI-ImageNet/train/n03908618/n0390861800001243.jpg 26 | -------------------------------------------------------------------------------- /data/index_list/mini_imagenet/session_4.txt: -------------------------------------------------------------------------------- 1 | MINI-ImageNet/train/n03924679/n0392467900000785.jpg 2 | MINI-ImageNet/train/n03924679/n0392467900000871.jpg 3 | MINI-ImageNet/train/n03924679/n0392467900000115.jpg 4 | MINI-ImageNet/train/n03924679/n0392467900000164.jpg 5 | MINI-ImageNet/train/n03924679/n0392467900001240.jpg 6 | MINI-ImageNet/train/n03980874/n0398087400000794.jpg 7 | MINI-ImageNet/train/n03980874/n0398087400000911.jpg 8 | MINI-ImageNet/train/n03980874/n0398087400000124.jpg 9 | MINI-ImageNet/train/n03980874/n0398087400000184.jpg 10 | MINI-ImageNet/train/n03980874/n0398087400001229.jpg 11 | MINI-ImageNet/train/n03998194/n0399819400000790.jpg 12 | MINI-ImageNet/train/n03998194/n0399819400000876.jpg 13 | MINI-ImageNet/train/n03998194/n0399819400000116.jpg 14 | MINI-ImageNet/train/n03998194/n0399819400000164.jpg 15 | MINI-ImageNet/train/n03998194/n0399819400001248.jpg 16 | MINI-ImageNet/train/n04067472/n0406747200000802.jpg 17 | MINI-ImageNet/train/n04067472/n0406747200000904.jpg 18 | MINI-ImageNet/train/n04067472/n0406747200000130.jpg 19 | MINI-ImageNet/train/n04067472/n0406747200000175.jpg 20 | MINI-ImageNet/train/n04067472/n0406747200001257.jpg 21 | MINI-ImageNet/train/n04146614/n0414661400000809.jpg 22 | MINI-ImageNet/train/n04146614/n0414661400000921.jpg 23 | MINI-ImageNet/train/n04146614/n0414661400000132.jpg 24 | MINI-ImageNet/train/n04146614/n0414661400000204.jpg 25 | MINI-ImageNet/train/n04146614/n0414661400001243.jpg 26 | -------------------------------------------------------------------------------- /data/index_list/mini_imagenet/session_5.txt: -------------------------------------------------------------------------------- 1 | MINI-ImageNet/train/n04149813/n0414981300000789.jpg 2 | MINI-ImageNet/train/n04149813/n0414981300000879.jpg 3 | MINI-ImageNet/train/n04149813/n0414981300000152.jpg 4 | MINI-ImageNet/train/n04149813/n0414981300000196.jpg 5 | MINI-ImageNet/train/n04149813/n0414981300001229.jpg 6 | MINI-ImageNet/train/n04243546/n0424354600000785.jpg 7 | MINI-ImageNet/train/n04243546/n0424354600000868.jpg 8 | MINI-ImageNet/train/n04243546/n0424354600000109.jpg 9 | MINI-ImageNet/train/n04243546/n0424354600000159.jpg 10 | MINI-ImageNet/train/n04243546/n0424354600001243.jpg 11 | MINI-ImageNet/train/n04251144/n0425114400000797.jpg 12 | MINI-ImageNet/train/n04251144/n0425114400000891.jpg 13 | MINI-ImageNet/train/n04251144/n0425114400000123.jpg 14 | MINI-ImageNet/train/n04251144/n0425114400000170.jpg 15 | MINI-ImageNet/train/n04251144/n0425114400001244.jpg 16 | MINI-ImageNet/train/n04258138/n0425813800000807.jpg 17 | MINI-ImageNet/train/n04258138/n0425813800000900.jpg 18 | MINI-ImageNet/train/n04258138/n0425813800000135.jpg 19 | MINI-ImageNet/train/n04258138/n0425813800000193.jpg 20 | MINI-ImageNet/train/n04258138/n0425813800001252.jpg 21 | MINI-ImageNet/train/n04275548/n0427554800000755.jpg 22 | MINI-ImageNet/train/n04275548/n0427554800000854.jpg 23 | MINI-ImageNet/train/n04275548/n0427554800000127.jpg 24 | MINI-ImageNet/train/n04275548/n0427554800000168.jpg 25 | MINI-ImageNet/train/n04275548/n0427554800001238.jpg 26 | -------------------------------------------------------------------------------- /data/index_list/mini_imagenet/session_6.txt: -------------------------------------------------------------------------------- 1 | MINI-ImageNet/train/n04296562/n0429656200000772.jpg 2 | MINI-ImageNet/train/n04296562/n0429656200000862.jpg 3 | MINI-ImageNet/train/n04296562/n0429656200000119.jpg 4 | MINI-ImageNet/train/n04296562/n0429656200000158.jpg 5 | MINI-ImageNet/train/n04296562/n0429656200001223.jpg 6 | MINI-ImageNet/train/n04389033/n0438903300000802.jpg 7 | MINI-ImageNet/train/n04389033/n0438903300000912.jpg 8 | MINI-ImageNet/train/n04389033/n0438903300000157.jpg 9 | MINI-ImageNet/train/n04389033/n0438903300000202.jpg 10 | MINI-ImageNet/train/n04389033/n0438903300001261.jpg 11 | MINI-ImageNet/train/n04418357/n0441835700000746.jpg 12 | MINI-ImageNet/train/n04418357/n0441835700000848.jpg 13 | MINI-ImageNet/train/n04418357/n0441835700000111.jpg 14 | MINI-ImageNet/train/n04418357/n0441835700000163.jpg 15 | MINI-ImageNet/train/n04418357/n0441835700001226.jpg 16 | MINI-ImageNet/train/n04435653/n0443565300000828.jpg 17 | MINI-ImageNet/train/n04435653/n0443565300000932.jpg 18 | MINI-ImageNet/train/n04435653/n0443565300000139.jpg 19 | MINI-ImageNet/train/n04435653/n0443565300000203.jpg 20 | MINI-ImageNet/train/n04435653/n0443565300001245.jpg 21 | MINI-ImageNet/train/n04443257/n0444325700000764.jpg 22 | MINI-ImageNet/train/n04443257/n0444325700000852.jpg 23 | MINI-ImageNet/train/n04443257/n0444325700000125.jpg 24 | MINI-ImageNet/train/n04443257/n0444325700000183.jpg 25 | MINI-ImageNet/train/n04443257/n0444325700001216.jpg 26 | -------------------------------------------------------------------------------- /data/index_list/mini_imagenet/session_7.txt: -------------------------------------------------------------------------------- 1 | MINI-ImageNet/train/n04509417/n0450941700000801.jpg 2 | MINI-ImageNet/train/n04509417/n0450941700000882.jpg 3 | MINI-ImageNet/train/n04509417/n0450941700000149.jpg 4 | MINI-ImageNet/train/n04509417/n0450941700000201.jpg 5 | MINI-ImageNet/train/n04509417/n0450941700001242.jpg 6 | MINI-ImageNet/train/n04515003/n0451500300000791.jpg 7 | MINI-ImageNet/train/n04515003/n0451500300000893.jpg 8 | MINI-ImageNet/train/n04515003/n0451500300000112.jpg 9 | MINI-ImageNet/train/n04515003/n0451500300000161.jpg 10 | MINI-ImageNet/train/n04515003/n0451500300001259.jpg 11 | MINI-ImageNet/train/n04522168/n0452216800000790.jpg 12 | MINI-ImageNet/train/n04522168/n0452216800000894.jpg 13 | MINI-ImageNet/train/n04522168/n0452216800000124.jpg 14 | MINI-ImageNet/train/n04522168/n0452216800000180.jpg 15 | MINI-ImageNet/train/n04522168/n0452216800001258.jpg 16 | MINI-ImageNet/train/n04596742/n0459674200000809.jpg 17 | MINI-ImageNet/train/n04596742/n0459674200000897.jpg 18 | MINI-ImageNet/train/n04596742/n0459674200000132.jpg 19 | MINI-ImageNet/train/n04596742/n0459674200000189.jpg 20 | MINI-ImageNet/train/n04596742/n0459674200001241.jpg 21 | MINI-ImageNet/train/n04604644/n0460464400000828.jpg 22 | MINI-ImageNet/train/n04604644/n0460464400000904.jpg 23 | MINI-ImageNet/train/n04604644/n0460464400000124.jpg 24 | MINI-ImageNet/train/n04604644/n0460464400000175.jpg 25 | MINI-ImageNet/train/n04604644/n0460464400001256.jpg 26 | -------------------------------------------------------------------------------- /data/index_list/mini_imagenet/session_8.txt: -------------------------------------------------------------------------------- 1 | MINI-ImageNet/train/n04612504/n0461250400000737.jpg 2 | MINI-ImageNet/train/n04612504/n0461250400000810.jpg 3 | MINI-ImageNet/train/n04612504/n0461250400000149.jpg 4 | MINI-ImageNet/train/n04612504/n0461250400000194.jpg 5 | MINI-ImageNet/train/n04612504/n0461250400001160.jpg 6 | MINI-ImageNet/train/n06794110/n0679411000000773.jpg 7 | MINI-ImageNet/train/n06794110/n0679411000000882.jpg 8 | MINI-ImageNet/train/n06794110/n0679411000000124.jpg 9 | MINI-ImageNet/train/n06794110/n0679411000000199.jpg 10 | MINI-ImageNet/train/n06794110/n0679411000001256.jpg 11 | MINI-ImageNet/train/n07584110/n0758411000000764.jpg 12 | MINI-ImageNet/train/n07584110/n0758411000000855.jpg 13 | MINI-ImageNet/train/n07584110/n0758411000000133.jpg 14 | MINI-ImageNet/train/n07584110/n0758411000000180.jpg 15 | MINI-ImageNet/train/n07584110/n0758411000001154.jpg 16 | MINI-ImageNet/train/n07613480/n0761348000000770.jpg 17 | MINI-ImageNet/train/n07613480/n0761348000000868.jpg 18 | MINI-ImageNet/train/n07613480/n0761348000000140.jpg 19 | MINI-ImageNet/train/n07613480/n0761348000000183.jpg 20 | MINI-ImageNet/train/n07613480/n0761348000001254.jpg 21 | MINI-ImageNet/train/n07697537/n0769753700000774.jpg 22 | MINI-ImageNet/train/n07697537/n0769753700000862.jpg 23 | MINI-ImageNet/train/n07697537/n0769753700000142.jpg 24 | MINI-ImageNet/train/n07697537/n0769753700000181.jpg 25 | MINI-ImageNet/train/n07697537/n0769753700001231.jpg 26 | -------------------------------------------------------------------------------- /data/index_list/mini_imagenet/session_9.txt: -------------------------------------------------------------------------------- 1 | MINI-ImageNet/train/n07747607/n0774760700000787.jpg 2 | MINI-ImageNet/train/n07747607/n0774760700000894.jpg 3 | MINI-ImageNet/train/n07747607/n0774760700000140.jpg 4 | MINI-ImageNet/train/n07747607/n0774760700000190.jpg 5 | MINI-ImageNet/train/n07747607/n0774760700001253.jpg 6 | MINI-ImageNet/train/n09246464/n0924646400000794.jpg 7 | MINI-ImageNet/train/n09246464/n0924646400000885.jpg 8 | MINI-ImageNet/train/n09246464/n0924646400000107.jpg 9 | MINI-ImageNet/train/n09246464/n0924646400000145.jpg 10 | MINI-ImageNet/train/n09246464/n0924646400001250.jpg 11 | MINI-ImageNet/train/n09256479/n0925647900000823.jpg 12 | MINI-ImageNet/train/n09256479/n0925647900000899.jpg 13 | MINI-ImageNet/train/n09256479/n0925647900000154.jpg 14 | MINI-ImageNet/train/n09256479/n0925647900000208.jpg 15 | MINI-ImageNet/train/n09256479/n0925647900001246.jpg 16 | MINI-ImageNet/train/n13054560/n1305456000000771.jpg 17 | MINI-ImageNet/train/n13054560/n1305456000000856.jpg 18 | MINI-ImageNet/train/n13054560/n1305456000000102.jpg 19 | MINI-ImageNet/train/n13054560/n1305456000000159.jpg 20 | MINI-ImageNet/train/n13054560/n1305456000001230.jpg 21 | MINI-ImageNet/train/n13133613/n1313361300000758.jpg 22 | MINI-ImageNet/train/n13133613/n1313361300000871.jpg 23 | MINI-ImageNet/train/n13133613/n1313361300000106.jpg 24 | MINI-ImageNet/train/n13133613/n1313361300000160.jpg 25 | MINI-ImageNet/train/n13133613/n1313361300001231.jpg 26 | -------------------------------------------------------------------------------- /solo_learn/datasets/fscil_data/index_list/mini_imagenet/session_2.txt: -------------------------------------------------------------------------------- 1 | MINI-ImageNet/train/n03544143/n0354414300000811.jpg 2 | MINI-ImageNet/train/n03544143/n0354414300000906.jpg 3 | MINI-ImageNet/train/n03544143/n0354414300000122.jpg 4 | MINI-ImageNet/train/n03544143/n0354414300000185.jpg 5 | MINI-ImageNet/train/n03544143/n0354414300001258.jpg 6 | MINI-ImageNet/train/n03584254/n0358425400000818.jpg 7 | MINI-ImageNet/train/n03584254/n0358425400000891.jpg 8 | MINI-ImageNet/train/n03584254/n0358425400000145.jpg 9 | MINI-ImageNet/train/n03584254/n0358425400000186.jpg 10 | MINI-ImageNet/train/n03584254/n0358425400001254.jpg 11 | MINI-ImageNet/train/n03676483/n0367648300000772.jpg 12 | MINI-ImageNet/train/n03676483/n0367648300000864.jpg 13 | MINI-ImageNet/train/n03676483/n0367648300000108.jpg 14 | MINI-ImageNet/train/n03676483/n0367648300000164.jpg 15 | MINI-ImageNet/train/n03676483/n0367648300001236.jpg 16 | MINI-ImageNet/train/n03770439/n0377043900000738.jpg 17 | MINI-ImageNet/train/n03770439/n0377043900000835.jpg 18 | MINI-ImageNet/train/n03770439/n0377043900000111.jpg 19 | MINI-ImageNet/train/n03770439/n0377043900000154.jpg 20 | MINI-ImageNet/train/n03770439/n0377043900001238.jpg 21 | MINI-ImageNet/train/n03773504/n0377350400000781.jpg 22 | MINI-ImageNet/train/n03773504/n0377350400000880.jpg 23 | MINI-ImageNet/train/n03773504/n0377350400000132.jpg 24 | MINI-ImageNet/train/n03773504/n0377350400000177.jpg 25 | MINI-ImageNet/train/n03773504/n0377350400001237.jpg 26 | -------------------------------------------------------------------------------- /solo_learn/datasets/fscil_data/index_list/mini_imagenet/session_3.txt: -------------------------------------------------------------------------------- 1 | MINI-ImageNet/train/n03775546/n0377554600000808.jpg 2 | MINI-ImageNet/train/n03775546/n0377554600000891.jpg 3 | MINI-ImageNet/train/n03775546/n0377554600000123.jpg 4 | MINI-ImageNet/train/n03775546/n0377554600000179.jpg 5 | MINI-ImageNet/train/n03775546/n0377554600001241.jpg 6 | MINI-ImageNet/train/n03838899/n0383889900000800.jpg 7 | MINI-ImageNet/train/n03838899/n0383889900000881.jpg 8 | MINI-ImageNet/train/n03838899/n0383889900000124.jpg 9 | MINI-ImageNet/train/n03838899/n0383889900000165.jpg 10 | MINI-ImageNet/train/n03838899/n0383889900001242.jpg 11 | MINI-ImageNet/train/n03854065/n0385406500000796.jpg 12 | MINI-ImageNet/train/n03854065/n0385406500000899.jpg 13 | MINI-ImageNet/train/n03854065/n0385406500000103.jpg 14 | MINI-ImageNet/train/n03854065/n0385406500000146.jpg 15 | MINI-ImageNet/train/n03854065/n0385406500001249.jpg 16 | MINI-ImageNet/train/n03888605/n0388860500000783.jpg 17 | MINI-ImageNet/train/n03888605/n0388860500000875.jpg 18 | MINI-ImageNet/train/n03888605/n0388860500000124.jpg 19 | MINI-ImageNet/train/n03888605/n0388860500000184.jpg 20 | MINI-ImageNet/train/n03888605/n0388860500001245.jpg 21 | MINI-ImageNet/train/n03908618/n0390861800000778.jpg 22 | MINI-ImageNet/train/n03908618/n0390861800000855.jpg 23 | MINI-ImageNet/train/n03908618/n0390861800000127.jpg 24 | MINI-ImageNet/train/n03908618/n0390861800000175.jpg 25 | MINI-ImageNet/train/n03908618/n0390861800001243.jpg 26 | -------------------------------------------------------------------------------- /solo_learn/datasets/fscil_data/index_list/mini_imagenet/session_4.txt: -------------------------------------------------------------------------------- 1 | MINI-ImageNet/train/n03924679/n0392467900000785.jpg 2 | MINI-ImageNet/train/n03924679/n0392467900000871.jpg 3 | MINI-ImageNet/train/n03924679/n0392467900000115.jpg 4 | MINI-ImageNet/train/n03924679/n0392467900000164.jpg 5 | MINI-ImageNet/train/n03924679/n0392467900001240.jpg 6 | MINI-ImageNet/train/n03980874/n0398087400000794.jpg 7 | MINI-ImageNet/train/n03980874/n0398087400000911.jpg 8 | MINI-ImageNet/train/n03980874/n0398087400000124.jpg 9 | MINI-ImageNet/train/n03980874/n0398087400000184.jpg 10 | MINI-ImageNet/train/n03980874/n0398087400001229.jpg 11 | MINI-ImageNet/train/n03998194/n0399819400000790.jpg 12 | MINI-ImageNet/train/n03998194/n0399819400000876.jpg 13 | MINI-ImageNet/train/n03998194/n0399819400000116.jpg 14 | MINI-ImageNet/train/n03998194/n0399819400000164.jpg 15 | MINI-ImageNet/train/n03998194/n0399819400001248.jpg 16 | MINI-ImageNet/train/n04067472/n0406747200000802.jpg 17 | MINI-ImageNet/train/n04067472/n0406747200000904.jpg 18 | MINI-ImageNet/train/n04067472/n0406747200000130.jpg 19 | MINI-ImageNet/train/n04067472/n0406747200000175.jpg 20 | MINI-ImageNet/train/n04067472/n0406747200001257.jpg 21 | MINI-ImageNet/train/n04146614/n0414661400000809.jpg 22 | MINI-ImageNet/train/n04146614/n0414661400000921.jpg 23 | MINI-ImageNet/train/n04146614/n0414661400000132.jpg 24 | MINI-ImageNet/train/n04146614/n0414661400000204.jpg 25 | MINI-ImageNet/train/n04146614/n0414661400001243.jpg 26 | -------------------------------------------------------------------------------- /solo_learn/datasets/fscil_data/index_list/mini_imagenet/session_5.txt: -------------------------------------------------------------------------------- 1 | MINI-ImageNet/train/n04149813/n0414981300000789.jpg 2 | MINI-ImageNet/train/n04149813/n0414981300000879.jpg 3 | MINI-ImageNet/train/n04149813/n0414981300000152.jpg 4 | MINI-ImageNet/train/n04149813/n0414981300000196.jpg 5 | MINI-ImageNet/train/n04149813/n0414981300001229.jpg 6 | MINI-ImageNet/train/n04243546/n0424354600000785.jpg 7 | MINI-ImageNet/train/n04243546/n0424354600000868.jpg 8 | MINI-ImageNet/train/n04243546/n0424354600000109.jpg 9 | MINI-ImageNet/train/n04243546/n0424354600000159.jpg 10 | MINI-ImageNet/train/n04243546/n0424354600001243.jpg 11 | MINI-ImageNet/train/n04251144/n0425114400000797.jpg 12 | MINI-ImageNet/train/n04251144/n0425114400000891.jpg 13 | MINI-ImageNet/train/n04251144/n0425114400000123.jpg 14 | MINI-ImageNet/train/n04251144/n0425114400000170.jpg 15 | MINI-ImageNet/train/n04251144/n0425114400001244.jpg 16 | MINI-ImageNet/train/n04258138/n0425813800000807.jpg 17 | MINI-ImageNet/train/n04258138/n0425813800000900.jpg 18 | MINI-ImageNet/train/n04258138/n0425813800000135.jpg 19 | MINI-ImageNet/train/n04258138/n0425813800000193.jpg 20 | MINI-ImageNet/train/n04258138/n0425813800001252.jpg 21 | MINI-ImageNet/train/n04275548/n0427554800000755.jpg 22 | MINI-ImageNet/train/n04275548/n0427554800000854.jpg 23 | MINI-ImageNet/train/n04275548/n0427554800000127.jpg 24 | MINI-ImageNet/train/n04275548/n0427554800000168.jpg 25 | MINI-ImageNet/train/n04275548/n0427554800001238.jpg 26 | -------------------------------------------------------------------------------- /solo_learn/datasets/fscil_data/index_list/mini_imagenet/session_6.txt: -------------------------------------------------------------------------------- 1 | MINI-ImageNet/train/n04296562/n0429656200000772.jpg 2 | MINI-ImageNet/train/n04296562/n0429656200000862.jpg 3 | MINI-ImageNet/train/n04296562/n0429656200000119.jpg 4 | MINI-ImageNet/train/n04296562/n0429656200000158.jpg 5 | MINI-ImageNet/train/n04296562/n0429656200001223.jpg 6 | MINI-ImageNet/train/n04389033/n0438903300000802.jpg 7 | MINI-ImageNet/train/n04389033/n0438903300000912.jpg 8 | MINI-ImageNet/train/n04389033/n0438903300000157.jpg 9 | MINI-ImageNet/train/n04389033/n0438903300000202.jpg 10 | MINI-ImageNet/train/n04389033/n0438903300001261.jpg 11 | MINI-ImageNet/train/n04418357/n0441835700000746.jpg 12 | MINI-ImageNet/train/n04418357/n0441835700000848.jpg 13 | MINI-ImageNet/train/n04418357/n0441835700000111.jpg 14 | MINI-ImageNet/train/n04418357/n0441835700000163.jpg 15 | MINI-ImageNet/train/n04418357/n0441835700001226.jpg 16 | MINI-ImageNet/train/n04435653/n0443565300000828.jpg 17 | MINI-ImageNet/train/n04435653/n0443565300000932.jpg 18 | MINI-ImageNet/train/n04435653/n0443565300000139.jpg 19 | MINI-ImageNet/train/n04435653/n0443565300000203.jpg 20 | MINI-ImageNet/train/n04435653/n0443565300001245.jpg 21 | MINI-ImageNet/train/n04443257/n0444325700000764.jpg 22 | MINI-ImageNet/train/n04443257/n0444325700000852.jpg 23 | MINI-ImageNet/train/n04443257/n0444325700000125.jpg 24 | MINI-ImageNet/train/n04443257/n0444325700000183.jpg 25 | MINI-ImageNet/train/n04443257/n0444325700001216.jpg 26 | -------------------------------------------------------------------------------- /solo_learn/datasets/fscil_data/index_list/mini_imagenet/session_7.txt: -------------------------------------------------------------------------------- 1 | MINI-ImageNet/train/n04509417/n0450941700000801.jpg 2 | MINI-ImageNet/train/n04509417/n0450941700000882.jpg 3 | MINI-ImageNet/train/n04509417/n0450941700000149.jpg 4 | MINI-ImageNet/train/n04509417/n0450941700000201.jpg 5 | MINI-ImageNet/train/n04509417/n0450941700001242.jpg 6 | MINI-ImageNet/train/n04515003/n0451500300000791.jpg 7 | MINI-ImageNet/train/n04515003/n0451500300000893.jpg 8 | MINI-ImageNet/train/n04515003/n0451500300000112.jpg 9 | MINI-ImageNet/train/n04515003/n0451500300000161.jpg 10 | MINI-ImageNet/train/n04515003/n0451500300001259.jpg 11 | MINI-ImageNet/train/n04522168/n0452216800000790.jpg 12 | MINI-ImageNet/train/n04522168/n0452216800000894.jpg 13 | MINI-ImageNet/train/n04522168/n0452216800000124.jpg 14 | MINI-ImageNet/train/n04522168/n0452216800000180.jpg 15 | MINI-ImageNet/train/n04522168/n0452216800001258.jpg 16 | MINI-ImageNet/train/n04596742/n0459674200000809.jpg 17 | MINI-ImageNet/train/n04596742/n0459674200000897.jpg 18 | MINI-ImageNet/train/n04596742/n0459674200000132.jpg 19 | MINI-ImageNet/train/n04596742/n0459674200000189.jpg 20 | MINI-ImageNet/train/n04596742/n0459674200001241.jpg 21 | MINI-ImageNet/train/n04604644/n0460464400000828.jpg 22 | MINI-ImageNet/train/n04604644/n0460464400000904.jpg 23 | MINI-ImageNet/train/n04604644/n0460464400000124.jpg 24 | MINI-ImageNet/train/n04604644/n0460464400000175.jpg 25 | MINI-ImageNet/train/n04604644/n0460464400001256.jpg 26 | -------------------------------------------------------------------------------- /solo_learn/datasets/fscil_data/index_list/mini_imagenet/session_8.txt: -------------------------------------------------------------------------------- 1 | MINI-ImageNet/train/n04612504/n0461250400000737.jpg 2 | MINI-ImageNet/train/n04612504/n0461250400000810.jpg 3 | MINI-ImageNet/train/n04612504/n0461250400000149.jpg 4 | MINI-ImageNet/train/n04612504/n0461250400000194.jpg 5 | MINI-ImageNet/train/n04612504/n0461250400001160.jpg 6 | MINI-ImageNet/train/n06794110/n0679411000000773.jpg 7 | MINI-ImageNet/train/n06794110/n0679411000000882.jpg 8 | MINI-ImageNet/train/n06794110/n0679411000000124.jpg 9 | MINI-ImageNet/train/n06794110/n0679411000000199.jpg 10 | MINI-ImageNet/train/n06794110/n0679411000001256.jpg 11 | MINI-ImageNet/train/n07584110/n0758411000000764.jpg 12 | MINI-ImageNet/train/n07584110/n0758411000000855.jpg 13 | MINI-ImageNet/train/n07584110/n0758411000000133.jpg 14 | MINI-ImageNet/train/n07584110/n0758411000000180.jpg 15 | MINI-ImageNet/train/n07584110/n0758411000001154.jpg 16 | MINI-ImageNet/train/n07613480/n0761348000000770.jpg 17 | MINI-ImageNet/train/n07613480/n0761348000000868.jpg 18 | MINI-ImageNet/train/n07613480/n0761348000000140.jpg 19 | MINI-ImageNet/train/n07613480/n0761348000000183.jpg 20 | MINI-ImageNet/train/n07613480/n0761348000001254.jpg 21 | MINI-ImageNet/train/n07697537/n0769753700000774.jpg 22 | MINI-ImageNet/train/n07697537/n0769753700000862.jpg 23 | MINI-ImageNet/train/n07697537/n0769753700000142.jpg 24 | MINI-ImageNet/train/n07697537/n0769753700000181.jpg 25 | MINI-ImageNet/train/n07697537/n0769753700001231.jpg 26 | -------------------------------------------------------------------------------- /solo_learn/datasets/fscil_data/index_list/mini_imagenet/session_9.txt: -------------------------------------------------------------------------------- 1 | MINI-ImageNet/train/n07747607/n0774760700000787.jpg 2 | MINI-ImageNet/train/n07747607/n0774760700000894.jpg 3 | MINI-ImageNet/train/n07747607/n0774760700000140.jpg 4 | MINI-ImageNet/train/n07747607/n0774760700000190.jpg 5 | MINI-ImageNet/train/n07747607/n0774760700001253.jpg 6 | MINI-ImageNet/train/n09246464/n0924646400000794.jpg 7 | MINI-ImageNet/train/n09246464/n0924646400000885.jpg 8 | MINI-ImageNet/train/n09246464/n0924646400000107.jpg 9 | MINI-ImageNet/train/n09246464/n0924646400000145.jpg 10 | MINI-ImageNet/train/n09246464/n0924646400001250.jpg 11 | MINI-ImageNet/train/n09256479/n0925647900000823.jpg 12 | MINI-ImageNet/train/n09256479/n0925647900000899.jpg 13 | MINI-ImageNet/train/n09256479/n0925647900000154.jpg 14 | MINI-ImageNet/train/n09256479/n0925647900000208.jpg 15 | MINI-ImageNet/train/n09256479/n0925647900001246.jpg 16 | MINI-ImageNet/train/n13054560/n1305456000000771.jpg 17 | MINI-ImageNet/train/n13054560/n1305456000000856.jpg 18 | MINI-ImageNet/train/n13054560/n1305456000000102.jpg 19 | MINI-ImageNet/train/n13054560/n1305456000000159.jpg 20 | MINI-ImageNet/train/n13054560/n1305456000001230.jpg 21 | MINI-ImageNet/train/n13133613/n1313361300000758.jpg 22 | MINI-ImageNet/train/n13133613/n1313361300000871.jpg 23 | MINI-ImageNet/train/n13133613/n1313361300000106.jpg 24 | MINI-ImageNet/train/n13133613/n1313361300000160.jpg 25 | MINI-ImageNet/train/n13133613/n1313361300001231.jpg 26 | -------------------------------------------------------------------------------- /solo_learn/solo/backbones/resnet/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | from .resnet import resnet18 as default_resnet18 21 | from .resnet import resnet50 as default_resnet50 22 | 23 | def resnet18(method, *args, **kwargs): 24 | return default_resnet18(*args, **kwargs) 25 | 26 | def resnet50(method, *args, **kwargs): 27 | return default_resnet50(*args, **kwargs) 28 | 29 | __all__ = ["resnet18", "resnet50"] 30 | -------------------------------------------------------------------------------- /models/cec/helper.py: -------------------------------------------------------------------------------- 1 | # import new Network name here and add in model_class args 2 | from .Network import MYNET 3 | from utils import * 4 | from tqdm import tqdm 5 | import torch.nn.functional as F 6 | 7 | 8 | def replace_base_fc(trainset, transform, model, args): 9 | # replace fc.weight with the embedding average of train data 10 | model = model.eval() 11 | 12 | trainloader = torch.utils.data.DataLoader(dataset=trainset, batch_size=128, 13 | num_workers=8, pin_memory=True, shuffle=False) 14 | trainloader.dataset.transform = transform 15 | embedding_list = [] 16 | label_list = [] 17 | # data_list=[] 18 | with torch.no_grad(): 19 | for i, batch in enumerate(trainloader): 20 | data, label = [_.cuda() for _ in batch] 21 | model.module.mode = 'encoder' 22 | embedding = model(data) 23 | 24 | embedding_list.append(embedding.cpu()) 25 | label_list.append(label.cpu()) 26 | embedding_list = torch.cat(embedding_list, dim=0) 27 | label_list = torch.cat(label_list, dim=0) 28 | 29 | proto_list = [] 30 | 31 | for class_index in range(args.base_class): 32 | data_index = (label_list == class_index).nonzero() 33 | embedding_this = embedding_list[data_index.squeeze(-1)] 34 | embedding_this = embedding_this.mean(0) 35 | proto_list.append(embedding_this) 36 | 37 | proto_list = torch.stack(proto_list, dim=0) 38 | 39 | model.module.fc.weight.data[:args.base_class] = proto_list 40 | 41 | return model -------------------------------------------------------------------------------- /solo_learn/solo/methods/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | from solo.methods.base import BaseMethod 21 | from solo.methods.supcon import SupCon 22 | from solo.methods.linear_proj import LinearProjModel 23 | 24 | 25 | METHODS = { 26 | # base classes 27 | "base": BaseMethod, 28 | "linear_proj": LinearProjModel, 29 | # methods 30 | "supcon": SupCon, 31 | } 32 | __all__ = [ 33 | "SupCon", 34 | "LinearProjModel" 35 | ] 36 | -------------------------------------------------------------------------------- /solo_learn/solo/backbones/alice/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | from .alicenet import resnet18_alice as default_resnet18_alice 21 | from .alicenet_cub import resnet18_alice_cub as default_resnet18_alice_cub 22 | 23 | def resnet18_alice(method, *args, **kwargs): 24 | return default_resnet18_alice(*args, **kwargs) 25 | 26 | def resnet18_alice_cub(method, *args, **kwargs): 27 | return default_resnet18_alice_cub(*args, **kwargs) 28 | 29 | __all__ = ["resnet18_alice"] 30 | -------------------------------------------------------------------------------- /solo_learn/scripts/pretrain/minet/base.yaml: -------------------------------------------------------------------------------- 1 | defaults: 2 | - _self_ 3 | - augmentations: symmetric_auto_augment.yaml 4 | - wandb: private.yaml 5 | - override hydra/hydra_logging: disabled 6 | - override hydra/job_logging: disabled 7 | 8 | # disable hydra outputs 9 | hydra: 10 | output_subdir: null 11 | run: 12 | dir: . 13 | 14 | name: "minet_base" # change here to change name in wandb 15 | method: "supcon" 16 | backbone: 17 | name: "resnet18_alice" 18 | method_kwargs: 19 | proj_hidden_dim: 2048 20 | proj_output_dim: 128 21 | temperature: 0.2 # 0.2 initially. 22 | margin: 0 23 | proj_type: "proj" 24 | apply_infonce: True 25 | simclr_weight: 0.1 26 | convex_loss_comb: True 27 | data: 28 | # dataset: cifar100 # change here for cifar100 29 | dataset: fscil_minet 30 | train_path: "../../datasets" 31 | val_path: "../../datasets/" 32 | format: "image_folder" 33 | num_workers: 4 34 | aa_string: "rand-m9-mstd0.5-inc1" #rand-m9-mstd0.5-inc1, v0-mstd0.5 35 | optimizer: 36 | name: "lars" 37 | batch_size: 512 38 | lr: 0.4 39 | classifier_lr: 0.2 40 | weight_decay: 0.00001 41 | kwargs: 42 | momentum: 0.9 43 | clip_lr: True 44 | eta: 0.02 45 | exclude_bias_n_norm: True 46 | scheduler: 47 | name: "warmup_cosine" 48 | min_lr: 0 49 | warmup_start_lr: 0.003 50 | warmup_epochs: 10 51 | checkpoint: 52 | enabled: True 53 | dir: "trained_models" 54 | frequency: 20 55 | auto_resume: 56 | enabled: True 57 | 58 | # overwrite PL stuff 59 | max_epochs: 400 60 | devices: [0] 61 | sync_batchnorm: True 62 | accelerator: "gpu" 63 | strategy: "ddp" 64 | precision: 16 -------------------------------------------------------------------------------- /solo_learn/scripts/pretrain/cifar/base.yaml: -------------------------------------------------------------------------------- 1 | defaults: 2 | - _self_ 3 | - augmentations: symmetric_auto_augment.yaml 4 | - wandb: private.yaml 5 | - override hydra/hydra_logging: disabled 6 | - override hydra/job_logging: disabled 7 | 8 | # disable hydra outputs 9 | hydra: 10 | output_subdir: null 11 | run: 12 | dir: . 13 | 14 | name: "cifa100_base" # change here for cifar100 15 | method: "supcon" 16 | backbone: 17 | # name: "resnet18_alice" 18 | name: "resnet12_nc" 19 | method_kwargs: 20 | proj_hidden_dim: 2048 21 | proj_output_dim: 128 # <===== 22 | temperature: 0.2 # 0.2 with 0.5 we have flatter representation and harder training 23 | proj_type: "proj" 24 | apply_infonce: True 25 | simclr_weight: 0.1 26 | convex_loss_comb: True 27 | data: 28 | dataset: fscil_cifar100 29 | train_path: "../../datasets" 30 | format: "image_folder" 31 | num_workers: 4 32 | aa_string: "v0-mstd0.5" 33 | optimizer: 34 | name: "lars" 35 | batch_size: 512 #512 36 | lr: 0.8 #0.4 <=== 37 | classifier_lr: 0.1 38 | weight_decay: 0.00001 39 | kwargs: 40 | momentum: 0.9 41 | clip_lr: True 42 | eta: 0.02 43 | exclude_bias_n_norm: True 44 | scheduler: 45 | name: "warmup_cosine" 46 | min_lr: 0 47 | warmup_start_lr: 0.003 48 | warmup_epochs: 10 49 | checkpoint: 50 | enabled: True 51 | dir: "trained_models" 52 | frequency: -1 # If frequency is -1 then save the best model only 53 | keep_prev: False 54 | auto_resume: 55 | enabled: False 56 | 57 | # overwrite PL stuff 58 | max_epochs: 300 #<=== 59 | devices: [0] 60 | sync_batchnorm: True 61 | accelerator: "gpu" 62 | strategy: "ddp" 63 | precision: 16 64 | -------------------------------------------------------------------------------- /solo_learn/solo/backbones/wide_resnet/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | 21 | from .wide_resnet import wide_resnet28w2 as default_wide_resnet28w2 22 | from .wide_resnet import wide_resnet28w8 as default_wide_resnet28w8 23 | 24 | 25 | def wide_resnet28w2(method, *args, **kwargs): 26 | return default_wide_resnet28w2(*args, **kwargs) 27 | 28 | 29 | def wide_resnet28w8(method, *args, **kwargs): 30 | return default_wide_resnet28w8(*args, **kwargs) 31 | 32 | 33 | __all__ = ["default_wide_resnet28w2", "default_wide_resnet28w8"] 34 | -------------------------------------------------------------------------------- /solo_learn/solo/utils/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | from solo.utils import ( 21 | checkpointer, 22 | knn, 23 | lars, 24 | metrics, 25 | misc, 26 | momentum, 27 | sinkhorn_knopp, 28 | ) 29 | 30 | __all__ = [ 31 | "checkpointer", 32 | "knn", 33 | "misc", 34 | "lars", 35 | "metrics", 36 | "momentum", 37 | "sinkhorn_knopp", 38 | ] 39 | 40 | 41 | try: 42 | from solo.utils import auto_umap # noqa: F401 43 | except ImportError: 44 | pass 45 | else: 46 | __all__.append("auto_umap") 47 | -------------------------------------------------------------------------------- /solo_learn/solo/data/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | 21 | from solo.data import classification_dataloader, pretrain_dataloader 22 | 23 | __all__ = [ 24 | "classification_dataloader", 25 | "pretrain_dataloader", 26 | ] 27 | 28 | 29 | try: 30 | from solo.data import dali_dataloader # noqa: F401 31 | except ImportError: 32 | pass 33 | else: 34 | __all__.append("dali_dataloader") 35 | 36 | 37 | try: 38 | from solo.data import h5_dataset # noqa: F401 39 | except ImportError: 40 | pass 41 | else: 42 | __all__.append("h5_dataset") 43 | -------------------------------------------------------------------------------- /dataloader/sampler.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import numpy as np 3 | import copy 4 | 5 | 6 | class CategoriesSampler(): 7 | 8 | def __init__(self, label, n_batch, n_cls, n_per, ): 9 | self.n_batch = n_batch # the number of iterations in the dataloader 10 | self.n_cls = n_cls 11 | self.n_per = n_per 12 | 13 | label = np.array(label) # all data label 14 | self.m_ind = [] # the data index of each class 15 | for i in range(max(label) + 1): 16 | ind = np.argwhere(label == i).reshape(-1) # all data index of this class 17 | ind = torch.from_numpy(ind) 18 | self.m_ind.append(ind) 19 | 20 | def __len__(self): 21 | return self.n_batch 22 | 23 | def __iter__(self): 24 | 25 | for i_batch in range(self.n_batch): 26 | batch = [] 27 | classes = torch.randperm(len(self.m_ind))[:self.n_cls] # random sample num_class indexs,e.g. torch.randperm(5) = tensor([0, 2, 4, 3, 1]) 28 | for c in classes: # Traversing the sampled n_cls of episode_way classes 29 | l = self.m_ind[c] # all data indexs of this class. All indices for class c in the original label set 30 | pos = torch.randperm(len(l))[:self.n_per] # sample n_per data index of this class. Shuffle and get n_per data 31 | batch.append(l[pos]) # Append the indices from the chosen positions from all the indiices for a certain class. 32 | batch = torch.stack(batch).t().reshape(-1) 33 | # .t() transpose, 34 | # due to it, the label is in the sequence of abcdabcdabcd form after reshape, 35 | # instead of aaaabbbbccccdddd 36 | yield batch # Note that the sampler returns sampled indices to the trainloader. 37 | -------------------------------------------------------------------------------- /solo_learn/solo/data/fscil_dataloader/sampler.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import numpy as np 3 | import copy 4 | 5 | 6 | class CategoriesSampler(): 7 | 8 | def __init__(self, label, n_batch, n_cls, n_per, ): 9 | self.n_batch = n_batch # the number of iterations in the dataloader 10 | self.n_cls = n_cls 11 | self.n_per = n_per 12 | 13 | label = np.array(label) # all data label 14 | self.m_ind = [] # the data index of each class 15 | for i in range(max(label) + 1): 16 | ind = np.argwhere(label == i).reshape(-1) # all data index of this class 17 | ind = torch.from_numpy(ind) 18 | self.m_ind.append(ind) 19 | 20 | def __len__(self): 21 | return self.n_batch 22 | 23 | def __iter__(self): 24 | 25 | for i_batch in range(self.n_batch): 26 | batch = [] 27 | classes = torch.randperm(len(self.m_ind))[:self.n_cls] # random sample num_class indexs,e.g. torch.randperm(5) = tensor([0, 2, 4, 3, 1]) 28 | for c in classes: # Traversing the sampled n_cls of episode_way classes 29 | l = self.m_ind[c] # all data indexs of this class. All indices for class c in the original label set 30 | pos = torch.randperm(len(l))[:self.n_per] # sample n_per data index of this class. Shuffle and get n_per data 31 | batch.append(l[pos]) # Append the indices from the chosen positions from all the indiices for a certain class. 32 | batch = torch.stack(batch).t().reshape(-1) 33 | # .t() transpose, 34 | # due to it, the label is in the sequence of abcdabcdabcd form after reshape, 35 | # instead of aaaabbbbccccdddd 36 | yield batch # Note that the sampler returns sampled indices to the trainloader. 37 | -------------------------------------------------------------------------------- /solo_learn/solo/backbones/swin/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | from .swin import swin_tiny as default_swin_tiny 21 | from .swin import swin_small as default_swin_small 22 | from .swin import swin_base as default_swin_base 23 | from .swin import swin_large as default_swin_large 24 | 25 | 26 | def swin_tiny(method, *args, **kwargs): 27 | return default_swin_tiny(*args, **kwargs) 28 | 29 | 30 | def swin_small(method, *args, **kwargs): 31 | return default_swin_small(*args, **kwargs) 32 | 33 | 34 | def swin_base(method, *args, **kwargs): 35 | return default_swin_base(*args, **kwargs) 36 | 37 | 38 | def swin_large(method, *args, **kwargs): 39 | return default_swin_large(*args, **kwargs) 40 | 41 | 42 | __all__ = ["swin_tiny", "swin_small", "swin_base", "swin_large"] 43 | -------------------------------------------------------------------------------- /models/orco/base.py: -------------------------------------------------------------------------------- 1 | import abc 2 | import os.path as osp 3 | from dataloader.data_utils import * 4 | from copy import deepcopy 5 | 6 | from utils import ( 7 | ensure_path, 8 | Averager, Timer, count_acc, 9 | ) 10 | 11 | 12 | class Trainer(object, metaclass=abc.ABCMeta): 13 | def __init__(self, args): 14 | self.args = args 15 | self.args = set_up_datasets(self.args) 16 | self.dt, self.ft = Averager(), Averager() 17 | self.bt, self.ot = Averager(), Averager() 18 | self.timer = Timer() 19 | 20 | # train statistics 21 | self.trlog = {} 22 | self.trlog['train_loss'] = [] 23 | self.trlog['val_loss'] = [] 24 | self.trlog['test_loss'] = [] 25 | self.trlog['train_acc'] = [] 26 | self.trlog['val_acc'] = [] 27 | self.trlog['test_acc'] = [] 28 | self.trlog['max_acc_epoch'] = 0 29 | 30 | # Sessional Statistics 31 | self.trlog['max_acc'] = [0.0] * args.sessions 32 | self.trlog['max_novel_acc'] = [0.0] * args.sessions 33 | self.trlog['max_base_acc'] = [0.0] * args.sessions 34 | self.trlog['max_hm'] = [0.0] * args.sessions 35 | self.trlog["max_am"] = [0.0] * args.sessions 36 | self.trlog["cw_acc"] = [0.0] * args.sessions 37 | self.trlog["max_hm_cw"] = [0.0] * args.sessions 38 | 39 | self.trlog['pretrain_knn_acc1'] = 0 40 | self.trlog['prep_knn_acc1'] = 0 41 | self.trlog['inc_knn_acc1'] = [0.0] * args.sessions 42 | self.trlog['cos_sims_inter'] = [0.0] * args.sessions 43 | self.trlog['cos_sims_intra'] = [0.0] * args.sessions 44 | 45 | self.trlog['base2base'] = [0.0] * args.sessions 46 | self.trlog['novel2novel'] = [0.0] * args.sessions 47 | self.trlog['novel2base'] = [0.0] * args.sessions 48 | self.trlog['base2novel'] = [0.0] * args.sessions 49 | 50 | @abc.abstractmethod 51 | def train(self): 52 | pass -------------------------------------------------------------------------------- /solo_learn/trained_models/supcon/xvb15qr4/args.json: -------------------------------------------------------------------------------- 1 | {"name": "minet_base", "method": "supcon", "backbone": {"name": "resnet18_alice", "kwargs": {}}, "method_kwargs": {"proj_hidden_dim": 2048, "proj_output_dim": 128, "temperature": 0.2, "margin": 0, "proj_type": "proj", "apply_infonce": true, "simclr_weight": 0.1, "convex_loss_comb": true}, "data": {"dataset": "fscil_minet", "train_path": "../../datasets", "val_path": "../../datasets/", "format": "image_folder", "num_workers": 4, "aa_string": "rand-m9-mstd0.5-inc1", "no_labels": false, "fraction": -1, "num_classes": 60, "num_large_crops": 2, "num_small_crops": 0}, "optimizer": {"name": "lars", "batch_size": 512, "lr": 0.8, "classifier_lr": 0.4, "weight_decay": 1e-05, "kwargs": {"momentum": 0.9, "clip_lr": true, "eta": 0.02, "exclude_bias_n_norm": true}, "exclude_bias_n_norm_wd": false}, "scheduler": {"name": "warmup_cosine", "min_lr": 0, "warmup_start_lr": 0.003, "warmup_epochs": 10, "lr_decay_steps": null, "interval": "step"}, "checkpoint": {"enabled": true, "dir": "trained_models", "frequency": 20, "keep_prev": false}, "auto_resume": {"enabled": true, "max_hours": 36}, "max_epochs": 400, "devices": [0], "sync_batchnorm": true, "accelerator": "gpu", "strategy": "ddp", "precision": 16, "augmentations": [{"rrc": {"enabled": true, "crop_min_scale": 0.08, "crop_max_scale": 1.0}, "color_jitter": {"prob": 0.8, "brightness": 0.8, "contrast": 0.8, "saturation": 0.8, "hue": 0.2}, "grayscale": {"prob": 0.2}, "gaussian_blur": {"prob": 0.5}, "solarization": {"prob": 0.0}, "equalization": {"prob": 0.0}, "horizontal_flip": {"prob": 0.5}, "crop_size": 84, "num_crops": 2, "auto_augment": true, "aa_string": "rand-m9-mstd0.5-inc1"}], "wandb": {"enabled": true, "entity": null, "project": "Group MINET Supcon", "offline": false}, "debug_augmentations": false, "seed": 5, "resume_from_checkpoint": null, "num_nodes": 1, "accumulate_grad_batches": 1, "knn_eval": {"enabled": false, "k": 20, "distance_func": "euclidean"}, "performance": {"disable_channel_last": false}, "wandb_run_id": "xvb15qr4"} -------------------------------------------------------------------------------- /solo_learn/solo/losses/wmse.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | import torch 21 | import torch.nn.functional as F 22 | 23 | 24 | def wmse_loss_func(z1: torch.Tensor, z2: torch.Tensor, simplified: bool = True) -> torch.Tensor: 25 | """Computes W-MSE's loss given two batches of whitened features z1 and z2. 26 | 27 | Args: 28 | z1 (torch.Tensor): NxD Tensor containing whitened features from view 1. 29 | z2 (torch.Tensor): NxD Tensor containing whitened features from view 2. 30 | simplified (bool): faster computation, but with same result. 31 | 32 | Returns: 33 | torch.Tensor: W-MSE loss. 34 | """ 35 | 36 | if simplified: 37 | return 2 - 2 * F.cosine_similarity(z1, z2.detach(), dim=-1).mean() 38 | 39 | z1 = F.normalize(z1, dim=-1) 40 | z2 = F.normalize(z2, dim=-1) 41 | 42 | return 2 - 2 * (z1 * z2).sum(dim=-1).mean() 43 | -------------------------------------------------------------------------------- /solo_learn/solo/backbones/convnext/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | from .convnext import convnext_tiny as default_convnext_tiny 21 | from .convnext import convnext_small as default_convnext_small 22 | from .convnext import convnext_base as default_convnext_base 23 | from .convnext import convnext_large as default_convnext_large 24 | 25 | 26 | def convnext_tiny(method, *args, **kwargs): 27 | return default_convnext_tiny(*args, **kwargs) 28 | 29 | 30 | def convnext_small(method, *args, **kwargs): 31 | return default_convnext_small(*args, **kwargs) 32 | 33 | 34 | def convnext_base(method, *args, **kwargs): 35 | return default_convnext_base(*args, **kwargs) 36 | 37 | 38 | def convnext_large(method, *args, **kwargs): 39 | return default_convnext_large(*args, **kwargs) 40 | 41 | 42 | __all__ = ["convnext_tiny", "convnext_small", "convnext_base", "convnext_large"] 43 | -------------------------------------------------------------------------------- /solo_learn/solo/losses/simsiam.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | import torch 21 | import torch.nn.functional as F 22 | 23 | 24 | def simsiam_loss_func(p: torch.Tensor, z: torch.Tensor, simplified: bool = True) -> torch.Tensor: 25 | """Computes SimSiam's loss given batch of predicted features p from view 1 and 26 | a batch of projected features z from view 2. 27 | 28 | Args: 29 | p (torch.Tensor): Tensor containing predicted features from view 1. 30 | z (torch.Tensor): Tensor containing projected features from view 2. 31 | simplified (bool): faster computation, but with same result. 32 | 33 | Returns: 34 | torch.Tensor: SimSiam loss. 35 | """ 36 | 37 | if simplified: 38 | return -F.cosine_similarity(p, z.detach(), dim=-1).mean() 39 | 40 | p = F.normalize(p, dim=-1) 41 | z = F.normalize(z, dim=-1) 42 | 43 | return -(p * z.detach()).sum(dim=1).mean() 44 | -------------------------------------------------------------------------------- /solo_learn/solo/losses/byol.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | import torch 21 | import torch.nn.functional as F 22 | 23 | 24 | def byol_loss_func(p: torch.Tensor, z: torch.Tensor, simplified: bool = True) -> torch.Tensor: 25 | """Computes BYOL's loss given batch of predicted features p and projected momentum features z. 26 | 27 | Args: 28 | p (torch.Tensor): NxD Tensor containing predicted features from view 1 29 | z (torch.Tensor): NxD Tensor containing projected momentum features from view 2 30 | simplified (bool): faster computation, but with same result. Defaults to True. 31 | 32 | Returns: 33 | torch.Tensor: BYOL's loss. 34 | """ 35 | 36 | if simplified: 37 | return 2 - 2 * F.cosine_similarity(p, z.detach(), dim=-1).mean() 38 | 39 | p = F.normalize(p, dim=-1) 40 | z = F.normalize(z, dim=-1) 41 | 42 | return 2 - 2 * (p * z.detach()).sum(dim=1).mean() 43 | -------------------------------------------------------------------------------- /solo_learn/solo/backbones/poolformer/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | from .poolformer import poolformer_s12 as default_poolformer_s12 21 | from .poolformer import poolformer_s24 as default_poolformer_s24 22 | from .poolformer import poolformer_s36 as default_poolformer_s36 23 | from .poolformer import poolformer_m36 as default_poolformer_m36 24 | from .poolformer import poolformer_m48 as default_poolformer_m48 25 | 26 | 27 | def poolformer_s12(method, *args, **kwargs): 28 | return default_poolformer_s12(*args, **kwargs) 29 | 30 | 31 | def poolformer_s24(method, *args, **kwargs): 32 | return default_poolformer_s24(*args, **kwargs) 33 | 34 | 35 | def poolformer_s36(method, *args, **kwargs): 36 | return default_poolformer_s36(*args, **kwargs) 37 | 38 | 39 | def poolformer_m36(method, *args, **kwargs): 40 | return default_poolformer_m36(*args, **kwargs) 41 | 42 | 43 | def poolformer_m48(method, *args, **kwargs): 44 | return default_poolformer_m48(*args, **kwargs) 45 | 46 | 47 | __all__ = ["poolformer_s12", "poolformer_s24", "poolformer_s36", "poolformer_m36", "poolformer_m48"] 48 | -------------------------------------------------------------------------------- /solo_learn/solo/losses/swav.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | from typing import List 21 | 22 | import numpy as np 23 | import torch 24 | 25 | 26 | def swav_loss_func( 27 | preds: List[torch.Tensor], assignments: List[torch.Tensor], temperature: float = 0.1 28 | ) -> torch.Tensor: 29 | """Computes SwAV's loss given list of batch predictions from multiple views 30 | and a list of cluster assignments from the same multiple views. 31 | 32 | Args: 33 | preds (torch.Tensor): list of NxC Tensors containing nearest neighbors' features from 34 | view 1. 35 | assignments (torch.Tensor): list of NxC Tensor containing predicted features from view 2. 36 | temperature (torch.Tensor): softmax temperature for the loss. Defaults to 0.1. 37 | 38 | Returns: 39 | torch.Tensor: SwAV loss. 40 | """ 41 | 42 | losses = [] 43 | for v1, a in enumerate(assignments): 44 | for v2 in np.delete(np.arange(len(preds)), v1): 45 | p = preds[v2] / temperature 46 | loss = -torch.mean(torch.sum(a * torch.log_softmax(p, dim=1), dim=1)) 47 | losses.append(loss) 48 | return sum(losses) / len(losses) 49 | -------------------------------------------------------------------------------- /solo_learn/solo/losses/mocov2plus.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | import torch 21 | import torch.nn.functional as F 22 | 23 | 24 | def mocov2plus_loss_func( 25 | query: torch.Tensor, key: torch.Tensor, queue: torch.Tensor, temperature=0.1 26 | ) -> torch.Tensor: 27 | """Computes MoCo's loss given a batch of queries from view 1, a batch of keys from view 2 and a 28 | queue of past elements. 29 | 30 | Args: 31 | query (torch.Tensor): NxD Tensor containing the queries from view 1. 32 | key (torch.Tensor): NxD Tensor containing the keys from view 2. 33 | queue (torch.Tensor): a queue of negative samples for the contrastive loss. 34 | temperature (float, optional): temperature of the softmax in the contrastive 35 | loss. Defaults to 0.1. 36 | 37 | Returns: 38 | torch.Tensor: MoCo loss. 39 | """ 40 | 41 | pos = torch.einsum("nc,nc->n", [query, key]).unsqueeze(-1) 42 | neg = torch.einsum("nc,ck->nk", [query, queue]) 43 | logits = torch.cat([pos, neg], dim=1) 44 | logits /= temperature 45 | targets = torch.zeros(query.size(0), device=query.device, dtype=torch.long) 46 | return F.cross_entropy(logits, targets) 47 | -------------------------------------------------------------------------------- /solo_learn/solo/losses/deepclusterv2.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | import torch 21 | import torch.nn.functional as F 22 | 23 | 24 | def deepclusterv2_loss_func( 25 | outputs: torch.Tensor, assignments: torch.Tensor, temperature: float = 0.1 26 | ) -> torch.Tensor: 27 | """Computes DeepClusterV2's loss given a tensor containing logits from multiple views 28 | and a tensor containing cluster assignments from the same multiple views. 29 | 30 | Args: 31 | outputs (torch.Tensor): tensor of size PxVxNxC where P is the number of prototype 32 | layers and V is the number of views. 33 | assignments (torch.Tensor): tensor of size PxVxNxC containing the assignments 34 | generated using k-means. 35 | temperature (float, optional): softmax temperature for the loss. Defaults to 0.1. 36 | 37 | Returns: 38 | torch.Tensor: DeepClusterV2 loss. 39 | """ 40 | loss = 0 41 | for h in range(outputs.size(0)): 42 | scores = outputs[h].view(-1, outputs.size(-1)) / temperature 43 | targets = assignments[h].repeat(outputs.size(1)).to(outputs.device, non_blocking=True) 44 | loss += F.cross_entropy(scores, targets, ignore_index=-1) 45 | return loss / outputs.size(0) 46 | -------------------------------------------------------------------------------- /solo_learn/solo/backbones/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | 21 | from .convnext import convnext_tiny, convnext_small, convnext_base, convnext_large 22 | from .poolformer import ( 23 | poolformer_s12, 24 | poolformer_s24, 25 | poolformer_s36, 26 | poolformer_m36, 27 | poolformer_m48, 28 | ) 29 | from .resnet import resnet18, resnet50 30 | from .swin import swin_tiny, swin_small, swin_base, swin_large 31 | from .vit import vit_tiny, vit_small, vit_base, vit_large 32 | from .wide_resnet import wide_resnet28w2, wide_resnet28w8 33 | from .alice import resnet18_alice, resnet18_alice_cub 34 | from .nueralcollapse import resnet12_nc 35 | 36 | __all__ = [ 37 | "resnet18", 38 | "resnet50", 39 | "vit_tiny", 40 | "vit_small", 41 | "vit_base", 42 | "vit_large", 43 | "swin_tiny", 44 | "swin_small", 45 | "swin_base", 46 | "swin_large", 47 | "poolformer_s12", 48 | "poolformer_s24", 49 | "poolformer_s36", 50 | "poolformer_m36", 51 | "poolformer_m48", 52 | "convnext_tiny", 53 | "convnext_small", 54 | "convnext_base", 55 | "convnext_large", 56 | "wide_resnet28w2", 57 | "wide_resnet28w8", 58 | "resnet18_alice", 59 | "resnet18_alice_cub", 60 | "resnet12_nc" 61 | ] 62 | -------------------------------------------------------------------------------- /solo_learn/solo/losses/nnclr.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | import torch 21 | import torch.nn.functional as F 22 | from solo.utils.misc import gather, get_rank 23 | 24 | 25 | def nnclr_loss_func(nn: torch.Tensor, p: torch.Tensor, temperature: float = 0.1) -> torch.Tensor: 26 | """Computes NNCLR's loss given batch of nearest-neighbors nn from view 1 and 27 | predicted features p from view 2. 28 | 29 | Args: 30 | nn (torch.Tensor): NxD Tensor containing nearest neighbors' features from view 1. 31 | p (torch.Tensor): NxD Tensor containing predicted features from view 2 32 | temperature (float, optional): temperature of the softmax in the contrastive loss. Defaults 33 | to 0.1. 34 | 35 | Returns: 36 | torch.Tensor: NNCLR loss. 37 | """ 38 | 39 | nn = F.normalize(nn, dim=-1) 40 | p = F.normalize(p, dim=-1) 41 | # to be consistent with simclr, we now gather p 42 | # this might result in suboptimal results given previous parameters. 43 | p = gather(p) 44 | 45 | logits = nn @ p.T / temperature 46 | 47 | rank = get_rank() 48 | n = nn.size(0) 49 | labels = torch.arange(n * rank, n * (rank + 1), device=p.device) 50 | loss = F.cross_entropy(logits, labels) 51 | return loss 52 | -------------------------------------------------------------------------------- /solo_learn/solo/losses/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | from solo.losses.barlow import barlow_loss_func 21 | from solo.losses.byol import byol_loss_func 22 | from solo.losses.deepclusterv2 import deepclusterv2_loss_func 23 | from solo.losses.dino import DINOLoss 24 | from solo.losses.mae import mae_loss_func 25 | from solo.losses.mocov2plus import mocov2plus_loss_func 26 | from solo.losses.mocov3 import mocov3_loss_func 27 | from solo.losses.nnclr import nnclr_loss_func 28 | from solo.losses.ressl import ressl_loss_func 29 | from solo.losses.simclr import simclr_loss_func 30 | from solo.losses.simsiam import simsiam_loss_func 31 | from solo.losses.swav import swav_loss_func 32 | from solo.losses.vibcreg import vibcreg_loss_func 33 | from solo.losses.vicreg import vicreg_loss_func 34 | from solo.losses.wmse import wmse_loss_func 35 | 36 | __all__ = [ 37 | "barlow_loss_func", 38 | "byol_loss_func", 39 | "deepclusterv2_loss_func", 40 | "DINOLoss", 41 | "mae_loss_func", 42 | "mocov2plus_loss_func", 43 | "mocov3_loss_func", 44 | "nnclr_loss_func", 45 | "ressl_loss_func", 46 | "simclr_loss_func", 47 | "simsiam_loss_func", 48 | "swav_loss_func", 49 | "vibcreg_loss_func", 50 | "vicreg_loss_func", 51 | "wmse_loss_func", 52 | ] 53 | -------------------------------------------------------------------------------- /solo_learn/solo/backbones/convnext/convnext.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | # Adapted from timm https://github.com/rwightman/pytorch-image-models/blob/master/timm/ 21 | 22 | from timm.models.convnext import _create_convnext 23 | from timm.models.registry import register_model 24 | 25 | 26 | @register_model 27 | def convnext_tiny(**kwargs): 28 | model_args = dict(depths=(3, 3, 9, 3), dims=(96, 192, 384, 768), **kwargs) 29 | model = _create_convnext("convnext_tiny", pretrained=False, num_classes=0, **model_args) 30 | return model 31 | 32 | 33 | @register_model 34 | def convnext_small(**kwargs): 35 | model_args = dict(depths=[3, 3, 27, 3], dims=[96, 192, 384, 768], **kwargs) 36 | model = _create_convnext("convnext_small", pretrained=False, num_classes=0, **model_args) 37 | return model 38 | 39 | 40 | @register_model 41 | def convnext_base(**kwargs): 42 | model_args = dict(depths=[3, 3, 27, 3], dims=[128, 256, 512, 1024], **kwargs) 43 | model = _create_convnext("convnext_base", pretrained=False, num_classes=0, **model_args) 44 | return model 45 | 46 | 47 | @register_model 48 | def convnext_large(**kwargs): 49 | model_args = dict(depths=[3, 3, 27, 3], dims=[192, 384, 768, 1536], **kwargs) 50 | model = _create_convnext("convnext_large", pretrained=False, num_classes=0, **model_args) 51 | return model 52 | -------------------------------------------------------------------------------- /solo_learn/solo/losses/mocov3.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | import torch 21 | import torch.distributed as dist 22 | import torch.nn.functional as F 23 | from solo.utils.misc import concat_all_gather_no_grad 24 | 25 | 26 | def mocov3_loss_func(query: torch.Tensor, key: torch.Tensor, temperature=0.2) -> torch.Tensor: 27 | """Computes MoCo V3's loss given a batch of queries from view 1, a batch of keys from view 2 and a 28 | queue of past elements. 29 | 30 | Args: 31 | query (torch.Tensor): NxD Tensor containing the queries from view 1. 32 | key (torch.Tensor): NxD Tensor containing the keys from view 2. 33 | temperature (float, optional): temperature of the softmax in the contrastive 34 | loss. Defaults to 0.2. 35 | 36 | Returns: 37 | torch.Tensor: MoCo loss. 38 | """ 39 | 40 | n = query.size(0) 41 | device = query.device 42 | rank = dist.get_rank() if dist.is_available() and dist.is_initialized() else 0 43 | 44 | query = F.normalize(query, dim=1) 45 | key = F.normalize(key, dim=1) 46 | 47 | # gather all targets without gradients 48 | key = concat_all_gather_no_grad(key) 49 | 50 | logits = torch.einsum("nc,mc->nm", [query, key]) / temperature 51 | labels = torch.arange(n, dtype=torch.long, device=device) + n * rank 52 | 53 | return F.cross_entropy(logits, labels) * (2 * temperature) 54 | -------------------------------------------------------------------------------- /solo_learn/solo/losses/ressl.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | import torch 21 | import torch.nn.functional as F 22 | 23 | 24 | def ressl_loss_func( 25 | q: torch.Tensor, 26 | k: torch.Tensor, 27 | queue: torch.Tensor, 28 | temperature_q: float = 0.1, 29 | temperature_k: float = 0.04, 30 | ) -> torch.Tensor: 31 | """Computes ReSSL's loss given a batch of queries from view 1, a batch of keys from view 2 and a 32 | queue of past elements. 33 | 34 | Args: 35 | query (torch.Tensor): NxD Tensor containing the queries from view 1. 36 | key (torch.Tensor): NxD Tensor containing the queries from view 2. 37 | queue (torch.Tensor): a queue of negative samples for the contrastive loss. 38 | temperature_q (float, optional): [description]. temperature of the softmax for the query. 39 | Defaults to 0.1. 40 | temperature_k (float, optional): [description]. temperature of the softmax for the key. 41 | Defaults to 0.04. 42 | 43 | Returns: 44 | torch.Tensor: ReSSL loss. 45 | """ 46 | 47 | logits_q = torch.einsum("nc,kc->nk", [q, queue]) 48 | logits_k = torch.einsum("nc,kc->nk", [k, queue]) 49 | 50 | loss = -torch.sum( 51 | F.softmax(logits_k.detach() / temperature_k, dim=1) 52 | * F.log_softmax(logits_q / temperature_q, dim=1), 53 | dim=1, 54 | ).mean() 55 | 56 | return loss 57 | -------------------------------------------------------------------------------- /solo_learn/solo/losses/barlow.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | import torch 21 | 22 | import torch.distributed as dist 23 | 24 | 25 | def barlow_loss_func( 26 | z1: torch.Tensor, z2: torch.Tensor, lamb: float = 5e-3, scale_loss: float = 0.025 27 | ) -> torch.Tensor: 28 | """Computes Barlow Twins' loss given batch of projected features z1 from view 1 and 29 | projected features z2 from view 2. 30 | 31 | Args: 32 | z1 (torch.Tensor): NxD Tensor containing projected features from view 1. 33 | z2 (torch.Tensor): NxD Tensor containing projected features from view 2. 34 | lamb (float, optional): off-diagonal scaling factor for the cross-covariance matrix. 35 | Defaults to 5e-3. 36 | scale_loss (float, optional): final scaling factor of the loss. Defaults to 0.025. 37 | 38 | Returns: 39 | torch.Tensor: Barlow Twins' loss. 40 | """ 41 | 42 | N, D = z1.size() 43 | 44 | # to match the original code 45 | bn = torch.nn.BatchNorm1d(D, affine=False).to(z1.device) 46 | z1 = bn(z1) 47 | z2 = bn(z2) 48 | 49 | corr = torch.einsum("bi, bj -> ij", z1, z2) / N 50 | 51 | if dist.is_available() and dist.is_initialized(): 52 | dist.all_reduce(corr) 53 | world_size = dist.get_world_size() 54 | corr /= world_size 55 | 56 | diag = torch.eye(D, device=corr.device) 57 | cdif = (corr - diag).pow(2) 58 | cdif[~diag.bool()] *= lamb 59 | loss = scale_loss * cdif.sum() 60 | return loss 61 | -------------------------------------------------------------------------------- /solo_learn/scripts/utils/convert_imgfolder_to_h5.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | import argparse 21 | import os 22 | 23 | import h5py 24 | import numpy as np 25 | from tqdm import tqdm 26 | 27 | 28 | def convert_imgfolder_to_h5(folder_path: str, h5_path: str): 29 | """Converts image folder to a h5 dataset. 30 | 31 | Args: 32 | folder_path (str): path to the image folder. 33 | h5_path (str): output path of the h5 file. 34 | """ 35 | 36 | with h5py.File(h5_path, "w") as h5: 37 | classes = os.listdir(folder_path) 38 | for class_name in tqdm(classes, desc="Processing classes"): 39 | cur_folder = os.path.join(folder_path, class_name) 40 | class_group = h5.create_group(class_name) 41 | for i, img_name in enumerate(os.listdir(cur_folder)): 42 | with open(os.path.join(cur_folder, img_name), "rb") as fid_img: 43 | binary_data = fid_img.read() 44 | data = np.frombuffer(binary_data, dtype="uint8") 45 | class_group.create_dataset( 46 | img_name, 47 | data=data, 48 | shape=data.shape, 49 | compression="gzip", 50 | compression_opts=9, 51 | ) 52 | 53 | 54 | if __name__ == "__main__": 55 | parser = argparse.ArgumentParser() 56 | parser.add_argument("--folder_path", type=str, required=True) 57 | parser.add_argument("--h5_path", type=str, required=True) 58 | args = parser.parse_args() 59 | convert_imgfolder_to_h5(args.folder_path, args.h5_path) 60 | -------------------------------------------------------------------------------- /solo_learn/solo/backbones/vit/vit.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | # Adapted from timm https://github.com/rwightman/pytorch-image-models/blob/master/timm/ 21 | 22 | from timm.models.registry import register_model 23 | from timm.models.vision_transformer import _create_vision_transformer 24 | 25 | 26 | @register_model 27 | def vit_tiny(patch_size=16, **kwargs): 28 | """ViT-Tiny (Vit-Ti/16)""" 29 | model_kwargs = dict( 30 | patch_size=patch_size, embed_dim=192, depth=12, num_heads=3, num_classes=0, **kwargs 31 | ) 32 | model = _create_vision_transformer("vit_tiny_patch16_224", pretrained=False, **model_kwargs) 33 | return model 34 | 35 | 36 | @register_model 37 | def vit_small(patch_size=16, **kwargs): 38 | model_kwargs = dict( 39 | patch_size=patch_size, embed_dim=384, depth=12, num_heads=6, num_classes=0, **kwargs 40 | ) 41 | model = _create_vision_transformer("vit_small_patch16_224", pretrained=False, **model_kwargs) 42 | return model 43 | 44 | 45 | @register_model 46 | def vit_base(patch_size=16, **kwargs): 47 | model_kwargs = dict( 48 | patch_size=patch_size, embed_dim=768, depth=12, num_heads=12, num_classes=0, **kwargs 49 | ) 50 | model = _create_vision_transformer("vit_base_patch16_224", pretrained=False, **model_kwargs) 51 | return model 52 | 53 | 54 | @register_model 55 | def vit_large(patch_size=16, **kwargs): 56 | model_kwargs = dict( 57 | patch_size=patch_size, embed_dim=1024, depth=24, num_heads=16, num_classes=0, **kwargs 58 | ) 59 | model = _create_vision_transformer("vit_large_patch16_224", pretrained=False, **model_kwargs) 60 | return model 61 | -------------------------------------------------------------------------------- /solo_learn/scripts/utils/make_imagenet100.py: -------------------------------------------------------------------------------- 1 | import os, sys 2 | 3 | # usage: python make_imagenet100.py full/imagenet/path desired/imagenet100/path 4 | full_imagenet_path = sys.argv[1] 5 | imagenet100_path = sys.argv[2] 6 | 7 | class_names = [ 8 | "n02869837", 9 | "n01749939", 10 | "n02488291", 11 | "n02107142", 12 | "n13037406", 13 | "n02091831", 14 | "n04517823", 15 | "n04589890", 16 | "n03062245", 17 | "n01773797", 18 | "n01735189", 19 | "n07831146", 20 | "n07753275", 21 | "n03085013", 22 | "n04485082", 23 | "n02105505", 24 | "n01983481", 25 | "n02788148", 26 | "n03530642", 27 | "n04435653", 28 | "n02086910", 29 | "n02859443", 30 | "n13040303", 31 | "n03594734", 32 | "n02085620", 33 | "n02099849", 34 | "n01558993", 35 | "n04493381", 36 | "n02109047", 37 | "n04111531", 38 | "n02877765", 39 | "n04429376", 40 | "n02009229", 41 | "n01978455", 42 | "n02106550", 43 | "n01820546", 44 | "n01692333", 45 | "n07714571", 46 | "n02974003", 47 | "n02114855", 48 | "n03785016", 49 | "n03764736", 50 | "n03775546", 51 | "n02087046", 52 | "n07836838", 53 | "n04099969", 54 | "n04592741", 55 | "n03891251", 56 | "n02701002", 57 | "n03379051", 58 | "n02259212", 59 | "n07715103", 60 | "n03947888", 61 | "n04026417", 62 | "n02326432", 63 | "n03637318", 64 | "n01980166", 65 | "n02113799", 66 | "n02086240", 67 | "n03903868", 68 | "n02483362", 69 | "n04127249", 70 | "n02089973", 71 | "n03017168", 72 | "n02093428", 73 | "n02804414", 74 | "n02396427", 75 | "n04418357", 76 | "n02172182", 77 | "n01729322", 78 | "n02113978", 79 | "n03787032", 80 | "n02089867", 81 | "n02119022", 82 | "n03777754", 83 | "n04238763", 84 | "n02231487", 85 | "n03032252", 86 | "n02138441", 87 | "n02104029", 88 | "n03837869", 89 | "n03494278", 90 | "n04136333", 91 | "n03794056", 92 | "n03492542", 93 | "n02018207", 94 | "n04067472", 95 | "n03930630", 96 | "n03584829", 97 | "n02123045", 98 | "n04229816", 99 | "n02100583", 100 | "n03642806", 101 | "n04336792", 102 | "n03259280", 103 | "n02116738", 104 | "n02108089", 105 | "n03424325", 106 | "n01855672", 107 | "n02090622", 108 | ] 109 | 110 | for subdir in ["train", "val"]: 111 | os.makedirs(os.path.join(imagenet100_path, subdir), exist_ok=True) 112 | for class_name in class_names: 113 | os.symlink( 114 | os.path.join(full_imagenet_path, subdir, class_name), 115 | os.path.join(imagenet100_path, subdir, class_name), 116 | target_is_directory=True, 117 | ) 118 | -------------------------------------------------------------------------------- /solo_learn/solo/utils/metrics.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | from typing import Dict, List, Sequence 21 | 22 | import torch 23 | 24 | 25 | def accuracy_at_k( 26 | outputs: torch.Tensor, targets: torch.Tensor, top_k: Sequence[int] = (1, 5) 27 | ) -> Sequence[int]: 28 | """Computes the accuracy over the k top predictions for the specified values of k. 29 | 30 | Args: 31 | outputs (torch.Tensor): output of a classifier (logits or probabilities). 32 | targets (torch.Tensor): ground truth labels. 33 | top_k (Sequence[int], optional): sequence of top k values to compute the accuracy over. 34 | Defaults to (1, 5). 35 | 36 | Returns: 37 | Sequence[int]: accuracies at the desired k. 38 | """ 39 | 40 | with torch.no_grad(): 41 | maxk = max(top_k) 42 | batch_size = targets.size(0) 43 | 44 | _, pred = outputs.topk(maxk, 1, True, True) 45 | pred = pred.t() 46 | correct = pred.eq(targets.view(1, -1).expand_as(pred)) 47 | 48 | res = [] 49 | for k in top_k: 50 | correct_k = correct[:k].contiguous().view(-1).float().sum(0, keepdim=True) 51 | res.append(correct_k.mul_(100.0 / batch_size)) 52 | return res 53 | 54 | 55 | def weighted_mean(outputs: List[Dict], key: str, batch_size_key: str) -> float: 56 | """Computes the mean of the values of a key weighted by the batch size. 57 | 58 | Args: 59 | outputs (List[Dict]): list of dicts containing the outputs of a validation step. 60 | key (str): key of the metric of interest. 61 | batch_size_key (str): key of batch size values. 62 | 63 | Returns: 64 | float: weighted mean of the values of a key 65 | """ 66 | 67 | value = 0 68 | n = 0 69 | for out in outputs: 70 | value += out[batch_size_key] * out[key] 71 | n += out[batch_size_key] 72 | value = value / n 73 | return value.squeeze(0) 74 | -------------------------------------------------------------------------------- /solo_learn/solo/backbones/swin/swin.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | # Adapted from timm https://github.com/rwightman/pytorch-image-models/blob/master/timm/ 21 | 22 | from timm.models.registry import register_model 23 | from timm.models.swin_transformer import _create_swin_transformer 24 | 25 | 26 | @register_model 27 | def swin_tiny(window_size=7, **kwargs): 28 | model_kwargs = dict( 29 | patch_size=4, 30 | window_size=window_size, 31 | embed_dim=96, 32 | depths=(2, 2, 6, 2), 33 | num_heads=(3, 6, 12, 24), 34 | num_classes=0, 35 | **kwargs, 36 | ) 37 | return _create_swin_transformer("swin_tiny_patch4_window7_224", **model_kwargs) 38 | 39 | 40 | @register_model 41 | def swin_small(window_size=7, **kwargs): 42 | model_kwargs = dict( 43 | patch_size=4, 44 | window_size=window_size, 45 | embed_dim=96, 46 | depths=(2, 2, 18, 2), 47 | num_heads=(3, 6, 12, 24), 48 | num_classes=0, 49 | **kwargs, 50 | ) 51 | return _create_swin_transformer( 52 | "swin_small_patch4_window7_224", pretrained=False, **model_kwargs 53 | ) 54 | 55 | 56 | @register_model 57 | def swin_base(window_size=7, **kwargs): 58 | model_kwargs = dict( 59 | patch_size=4, 60 | window_size=window_size, 61 | embed_dim=128, 62 | depths=(2, 2, 18, 2), 63 | num_heads=(4, 8, 16, 32), 64 | num_classes=0, 65 | **kwargs, 66 | ) 67 | return _create_swin_transformer( 68 | "swin_base_patch4_window7_224", pretrained=False, **model_kwargs 69 | ) 70 | 71 | 72 | @register_model 73 | def swin_large(window_size=7, **kwargs): 74 | model_kwargs = dict( 75 | patch_size=4, 76 | window_size=window_size, 77 | embed_dim=192, 78 | depths=(2, 2, 18, 2), 79 | num_heads=(6, 12, 24, 48), 80 | num_classes=0, 81 | **kwargs, 82 | ) 83 | return _create_swin_transformer( 84 | "swin_large_patch4_window7_224", pretrained=False, **model_kwargs 85 | ) 86 | -------------------------------------------------------------------------------- /solo_learn/solo/backbones/vit/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | import logging 21 | 22 | from .vit import vit_tiny as default_vit_tiny 23 | from .vit import vit_small as default_vit_small 24 | from .vit import vit_base as default_vit_base 25 | from .vit import vit_large as default_vit_large 26 | 27 | from .vit_mocov3 import vit_tiny as mocov3_vit_tiny 28 | from .vit_mocov3 import vit_small as mocov3_vit_small 29 | from .vit_mocov3 import vit_base as mocov3_vit_base 30 | from .vit_mocov3 import vit_large as mocov3_vit_large 31 | 32 | from .vit_mae import vit_tiny as mae_vit_tiny 33 | from .vit_mae import vit_small as mae_vit_small 34 | from .vit_mae import vit_base as mae_vit_base 35 | from .vit_mae import vit_large as mae_vit_large 36 | 37 | 38 | def get_constructor(method, options, default): 39 | if str(method).lower() in options: 40 | logging.warn(f"Using custom backbone for {method}") 41 | return options[method] 42 | 43 | logging.warn(f"No custom backbone found for {method}, defaulting to default") 44 | return default 45 | 46 | 47 | def vit_tiny(method, *args, **kwargs): 48 | custom_backbone_constructor = {"mocov3": mocov3_vit_tiny, "mae": mae_vit_tiny} 49 | return get_constructor(method, custom_backbone_constructor, default_vit_tiny)(*args, **kwargs) 50 | 51 | 52 | def vit_small(method, *args, **kwargs): 53 | custom_backbone_constructor = {"mocov3": mocov3_vit_small, "mae": mae_vit_small} 54 | return get_constructor(method, custom_backbone_constructor, default_vit_small)(*args, **kwargs) 55 | 56 | 57 | def vit_base(method, *args, **kwargs): 58 | custom_backbone_constructor = {"mocov3": mocov3_vit_base, "mae": mae_vit_base} 59 | return get_constructor(method, custom_backbone_constructor, default_vit_base)(*args, **kwargs) 60 | 61 | 62 | def vit_large(method, *args, **kwargs): 63 | custom_backbone_constructor = {"mocov3": mocov3_vit_large, "mae": mae_vit_large} 64 | return get_constructor(method, custom_backbone_constructor, default_vit_large)(*args, **kwargs) 65 | 66 | 67 | __all__ = ["vit_tiny", "vit_small", "vit_base", "vit_large"] 68 | -------------------------------------------------------------------------------- /models/orco/helper.py: -------------------------------------------------------------------------------- 1 | from utils import * 2 | from tqdm import tqdm 3 | import torch.nn.functional as F 4 | 5 | def test(model, testloader, epoch, args, session): 6 | test_class = args.base_class + session * args.way 7 | model = model.eval() 8 | vl = Averager() 9 | va = Averager() 10 | cw_acc = Averager() 11 | base_cw = Averager() 12 | novel_cw = Averager() 13 | 14 | all_targets=[] 15 | all_probs=[] 16 | 17 | with torch.no_grad(): 18 | tqdm_gen = tqdm(testloader) 19 | for i, batch in enumerate(tqdm_gen, 1): 20 | data, test_label = [_.cuda() for _ in batch] 21 | 22 | logits, _ = model(data) 23 | logits = logits[:, :test_class] 24 | 25 | all_targets.append(test_label) 26 | all_probs.append(logits) 27 | loss = F.cross_entropy(logits, test_label) 28 | acc = count_acc(logits, test_label) 29 | 30 | vl.add(loss.item()) 31 | va.add(acc) 32 | 33 | vl = vl.item() 34 | va = va.item() 35 | 36 | # Concatenate all_targets and probs 37 | all_targets = torch.cat(all_targets) 38 | all_probs = torch.cat(all_probs, axis=0) 39 | 40 | # Compute class wise accuracy 41 | for l in all_targets.unique(): 42 | # Get class l mask 43 | class_mask = all_targets == l 44 | pred = torch.argmax(all_probs, dim=1)[class_mask] 45 | label_ = all_targets[class_mask] 46 | class_acc = (pred == label_).type(torch.cuda.FloatTensor).mean().item() 47 | cw_acc.add(class_acc) 48 | 49 | if l < args.base_class: 50 | base_cw.add(class_acc) 51 | else: 52 | novel_cw.add(class_acc) 53 | 54 | # Compute va using class-wise accuracy 55 | pred = torch.argmax(all_probs, dim=1) 56 | va = class_acc = (pred == all_targets).type(torch.cuda.FloatTensor).mean().item() 57 | 58 | return va, novel_cw.item(), base_cw.item() 59 | 60 | def get_base_prototypes(trainset, transform, model, args, mode="encoder"): 61 | model = model.eval() 62 | 63 | trainloader = torch.utils.data.DataLoader(dataset=trainset, batch_size=128, 64 | num_workers=8, pin_memory=True, shuffle=False) 65 | trainloader.dataset.transform = transform 66 | embedding_list = [] 67 | label_list = [] 68 | og_mode = model.module.mode 69 | with torch.no_grad(): 70 | tqdm_gen = tqdm(trainloader) 71 | tqdm_gen.set_description("Generating Features: ") 72 | model.module.mode = mode 73 | for i, batch in enumerate(tqdm_gen, 1): 74 | data, label = [_.cuda() for _ in batch] 75 | 76 | embedding = model(data) 77 | 78 | embedding_list.append(embedding) 79 | label_list.append(label) 80 | 81 | embedding_list = torch.cat(embedding_list, dim=0) 82 | label_list = torch.cat(label_list, dim=0) 83 | 84 | proto_list = [] 85 | 86 | for class_index in range(args.base_class): 87 | data_index = (label_list == class_index).nonzero() 88 | embedding_this = embedding_list[data_index.squeeze(-1)] 89 | 90 | embedding_this = embedding_this.mean(0) 91 | proto_list.append(embedding_this) 92 | 93 | prototypes = torch.stack(proto_list, dim=0) 94 | 95 | model.module.mode = og_mode 96 | 97 | return prototypes 98 | -------------------------------------------------------------------------------- /solo_learn/solo/losses/mae.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | import torch 21 | 22 | 23 | def patchify(imgs: torch.Tensor, patch_size: int) -> torch.Tensor: 24 | """Patchifies an image according to some patch size. 25 | Adapted from https://github.com/facebookresearch/mae. 26 | 27 | Args: 28 | imgs (torch.Tensor): [N, 3, H, W] Tensor containing the original images. 29 | patch_size (int): size of each patch. 30 | 31 | Returns: 32 | torch.Tensor: [N, Tokens, pixels * pixels * 3] Tensor containing the patchified images. 33 | """ 34 | 35 | assert imgs.size(2) == imgs.size(3) and imgs.size(2) % patch_size == 0 36 | 37 | h = w = imgs.size(2) // patch_size 38 | x = imgs.reshape(shape=(imgs.size(0), 3, h, patch_size, w, patch_size)) 39 | x = torch.einsum("nchpwq->nhwpqc", x) 40 | x = x.reshape(shape=(imgs.size(0), h * w, patch_size**2 * 3)) 41 | return x 42 | 43 | 44 | def mae_loss_func( 45 | imgs: torch.Tensor, 46 | pred: torch.Tensor, 47 | mask: torch.Tensor, 48 | patch_size: int, 49 | norm_pix_loss: bool = True, 50 | ) -> torch.Tensor: 51 | """Computes MAE's loss given batch of images, the decoder predictions, the input mask and respective patch size. 52 | Adapted from https://github.com/facebookresearch/mae. 53 | 54 | Args: 55 | imgs (torch.Tensor): [N, 3, H, W] Tensor containing the original images. 56 | pred (torch.Tensor): [N, Tokens, pixels * pixels * 3] Tensor containing the predicted patches. 57 | mask (torch.Tensor): [N, Tokens] Tensor representing a binary mask, where value 1 means masked. 58 | patch_size (int): size of each patch. 59 | norm_pix_loss (bool): whether to normalize the pixels of each patch with their respective mean and std. 60 | 61 | Returns: 62 | torch.Tensor: MAE's loss. 63 | """ 64 | 65 | target = patchify(imgs, patch_size) 66 | 67 | if norm_pix_loss: 68 | mean = target.mean(dim=-1, keepdim=True) 69 | var = target.var(dim=-1, keepdim=True) 70 | target = (target - mean) / (var + 1.0e-6) ** 0.5 71 | 72 | loss = (pred - target) ** 2 73 | loss = loss.mean(dim=-1) # [N, L], mean loss per patch 74 | 75 | loss = (loss * mask).sum() / mask.sum() # mean loss on removed patches 76 | return loss 77 | -------------------------------------------------------------------------------- /data/index_list/cub200/session_6.txt: -------------------------------------------------------------------------------- 1 | CUB_200_2011/images/141.Artic_Tern/Artic_Tern_0055_141524.jpg 2 | CUB_200_2011/images/141.Artic_Tern/Artic_Tern_0124_142121.jpg 3 | CUB_200_2011/images/141.Artic_Tern/Artic_Tern_0133_141069.jpg 4 | CUB_200_2011/images/141.Artic_Tern/Artic_Tern_0111_143101.jpg 5 | CUB_200_2011/images/141.Artic_Tern/Artic_Tern_0107_141181.jpg 6 | CUB_200_2011/images/142.Black_Tern/Black_Tern_0079_143998.jpg 7 | CUB_200_2011/images/142.Black_Tern/Black_Tern_0082_144372.jpg 8 | CUB_200_2011/images/142.Black_Tern/Black_Tern_0029_144140.jpg 9 | CUB_200_2011/images/142.Black_Tern/Black_Tern_0066_144541.jpg 10 | CUB_200_2011/images/142.Black_Tern/Black_Tern_0046_144229.jpg 11 | CUB_200_2011/images/143.Caspian_Tern/Caspian_Tern_0009_145057.jpg 12 | CUB_200_2011/images/143.Caspian_Tern/Caspian_Tern_0116_145607.jpg 13 | CUB_200_2011/images/143.Caspian_Tern/Caspian_Tern_0123_145774.jpg 14 | CUB_200_2011/images/143.Caspian_Tern/Caspian_Tern_0006_145594.jpg 15 | CUB_200_2011/images/143.Caspian_Tern/Caspian_Tern_0013_145553.jpg 16 | CUB_200_2011/images/144.Common_Tern/Common_Tern_0071_148796.jpg 17 | CUB_200_2011/images/144.Common_Tern/Common_Tern_0077_149196.jpg 18 | CUB_200_2011/images/144.Common_Tern/Common_Tern_0030_147825.jpg 19 | CUB_200_2011/images/144.Common_Tern/Common_Tern_0095_149960.jpg 20 | CUB_200_2011/images/144.Common_Tern/Common_Tern_0083_148096.jpg 21 | CUB_200_2011/images/145.Elegant_Tern/Elegant_Tern_0009_150954.jpg 22 | CUB_200_2011/images/145.Elegant_Tern/Elegant_Tern_0045_150752.jpg 23 | CUB_200_2011/images/145.Elegant_Tern/Elegant_Tern_0046_150905.jpg 24 | CUB_200_2011/images/145.Elegant_Tern/Elegant_Tern_0103_150493.jpg 25 | CUB_200_2011/images/145.Elegant_Tern/Elegant_Tern_0004_150948.jpg 26 | CUB_200_2011/images/146.Forsters_Tern/Forsters_Tern_0027_151456.jpg 27 | CUB_200_2011/images/146.Forsters_Tern/Forsters_Tern_0077_152255.jpg 28 | CUB_200_2011/images/146.Forsters_Tern/Forsters_Tern_0125_151399.jpg 29 | CUB_200_2011/images/146.Forsters_Tern/Forsters_Tern_0045_151227.jpg 30 | CUB_200_2011/images/146.Forsters_Tern/Forsters_Tern_0119_152709.jpg 31 | CUB_200_2011/images/147.Least_Tern/Least_Tern_0092_153361.jpg 32 | CUB_200_2011/images/147.Least_Tern/Least_Tern_0020_153458.jpg 33 | CUB_200_2011/images/147.Least_Tern/Least_Tern_0060_153190.jpg 34 | CUB_200_2011/images/147.Least_Tern/Least_Tern_0119_153950.jpg 35 | CUB_200_2011/images/147.Least_Tern/Least_Tern_0037_153637.jpg 36 | CUB_200_2011/images/148.Green_tailed_Towhee/Green_Tailed_Towhee_0018_154825.jpg 37 | CUB_200_2011/images/148.Green_tailed_Towhee/Green_Tailed_Towhee_0070_154844.jpg 38 | CUB_200_2011/images/148.Green_tailed_Towhee/Green_Tailed_Towhee_0064_154771.jpg 39 | CUB_200_2011/images/148.Green_tailed_Towhee/Green_Tailed_Towhee_0058_797399.jpg 40 | CUB_200_2011/images/148.Green_tailed_Towhee/Green_Tailed_Towhee_0060_154820.jpg 41 | CUB_200_2011/images/149.Brown_Thrasher/Brown_Thrasher_0013_155329.jpg 42 | CUB_200_2011/images/149.Brown_Thrasher/Brown_Thrasher_0079_155394.jpg 43 | CUB_200_2011/images/149.Brown_Thrasher/Brown_Thrasher_0019_155216.jpg 44 | CUB_200_2011/images/149.Brown_Thrasher/Brown_Thrasher_0051_155344.jpg 45 | CUB_200_2011/images/149.Brown_Thrasher/Brown_Thrasher_0081_155256.jpg 46 | CUB_200_2011/images/150.Sage_Thrasher/Sage_Thrasher_0033_155511.jpg 47 | CUB_200_2011/images/150.Sage_Thrasher/Sage_Thrasher_0069_155544.jpg 48 | CUB_200_2011/images/150.Sage_Thrasher/Sage_Thrasher_0096_155449.jpg 49 | CUB_200_2011/images/150.Sage_Thrasher/Sage_Thrasher_0104_155529.jpg 50 | CUB_200_2011/images/150.Sage_Thrasher/Sage_Thrasher_0070_155732.jpg 51 | -------------------------------------------------------------------------------- /solo_learn/solo/utils/cos_scheduler.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from math import cos, pi 3 | 4 | class CosineAnnealingCooldownLrUpdaterHook(): 5 | """Cosine annealing learning rate scheduler with cooldown. 6 | 7 | Args: 8 | min_lr (float, optional): The minimum learning rate after annealing. 9 | Defaults to None. 10 | min_lr_ratio (float, optional): The minimum learning ratio after 11 | nnealing. Defaults to None. 12 | cool_down_ratio (float): The cooldown ratio. Defaults to 0.1. 13 | cool_down_time (int): The cooldown time. Defaults to 10. 14 | by_epoch (bool): If True, the learning rate changes epoch by epoch. If 15 | False, the learning rate changes iter by iter. Defaults to True. 16 | warmup (string, optional): Type of warmup used. It can be None (use no 17 | warmup), 'constant', 'linear' or 'exp'. Defaults to None. 18 | warmup_iters (int): The number of iterations or epochs that warmup 19 | lasts. Defaults to 0. 20 | warmup_ratio (float): LR used at the beginning of warmup equals to 21 | ``warmup_ratio * initial_lr``. Defaults to 0.1. 22 | warmup_by_epoch (bool): If True, the ``warmup_iters`` 23 | means the number of epochs that warmup lasts, otherwise means the 24 | number of iteration that warmup lasts. Defaults to False. 25 | 26 | Note: 27 | You need to set one and only one of ``min_lr`` and ``min_lr_ratio``. 28 | """ 29 | 30 | def __init__(self, 31 | min_lr=None, 32 | min_lr_ratio=None, 33 | cool_down_ratio=0.1, 34 | cool_down_time=10, 35 | **kwargs): 36 | assert (min_lr is None) ^ (min_lr_ratio is None) 37 | self.min_lr = min_lr 38 | self.min_lr_ratio = min_lr_ratio 39 | self.cool_down_time = cool_down_time 40 | self.cool_down_ratio = cool_down_ratio 41 | 42 | def get_lr(self, runner, base_lr): 43 | if self.by_epoch: 44 | progress = runner.epoch 45 | max_progress = runner.max_epochs 46 | else: 47 | progress = runner.iter 48 | max_progress = runner.max_iters 49 | 50 | if self.min_lr_ratio is not None: 51 | target_lr = base_lr * self.min_lr_ratio 52 | else: 53 | target_lr = self.min_lr 54 | 55 | if progress > max_progress - self.cool_down_time: 56 | return target_lr * self.cool_down_ratio 57 | else: 58 | max_progress = max_progress - self.cool_down_time 59 | 60 | return annealing_cos(base_lr, target_lr, progress / max_progress) 61 | 62 | 63 | def annealing_cos(start, end, factor, weight=1): 64 | """Calculate annealing cos learning rate. 65 | 66 | Cosine anneal from `weight * start + (1 - weight) * end` to `end` as 67 | percentage goes from 0.0 to 1.0. 68 | 69 | Args: 70 | start (float): The starting learning rate of the cosine annealing. 71 | end (float): The ending learing rate of the cosine annealing. 72 | factor (float): The coefficient of `pi` when calculating the current 73 | percentage. Range from 0.0 to 1.0. 74 | weight (float, optional): The combination factor of `start` and `end` 75 | when calculating the actual starting learning rate. Default to 1. 76 | """ 77 | cos_out = cos(pi * factor) + 1 78 | return end + 0.5 * weight * (start - end) * cos_out -------------------------------------------------------------------------------- /solo_learn/datasets/fscil_data/index_list/cub200/session_6.txt: -------------------------------------------------------------------------------- 1 | CUB_200_2011/images/141.Artic_Tern/Artic_Tern_0055_141524.jpg 2 | CUB_200_2011/images/141.Artic_Tern/Artic_Tern_0124_142121.jpg 3 | CUB_200_2011/images/141.Artic_Tern/Artic_Tern_0133_141069.jpg 4 | CUB_200_2011/images/141.Artic_Tern/Artic_Tern_0111_143101.jpg 5 | CUB_200_2011/images/141.Artic_Tern/Artic_Tern_0107_141181.jpg 6 | CUB_200_2011/images/142.Black_Tern/Black_Tern_0079_143998.jpg 7 | CUB_200_2011/images/142.Black_Tern/Black_Tern_0082_144372.jpg 8 | CUB_200_2011/images/142.Black_Tern/Black_Tern_0029_144140.jpg 9 | CUB_200_2011/images/142.Black_Tern/Black_Tern_0066_144541.jpg 10 | CUB_200_2011/images/142.Black_Tern/Black_Tern_0046_144229.jpg 11 | CUB_200_2011/images/143.Caspian_Tern/Caspian_Tern_0009_145057.jpg 12 | CUB_200_2011/images/143.Caspian_Tern/Caspian_Tern_0116_145607.jpg 13 | CUB_200_2011/images/143.Caspian_Tern/Caspian_Tern_0123_145774.jpg 14 | CUB_200_2011/images/143.Caspian_Tern/Caspian_Tern_0006_145594.jpg 15 | CUB_200_2011/images/143.Caspian_Tern/Caspian_Tern_0013_145553.jpg 16 | CUB_200_2011/images/144.Common_Tern/Common_Tern_0071_148796.jpg 17 | CUB_200_2011/images/144.Common_Tern/Common_Tern_0077_149196.jpg 18 | CUB_200_2011/images/144.Common_Tern/Common_Tern_0030_147825.jpg 19 | CUB_200_2011/images/144.Common_Tern/Common_Tern_0095_149960.jpg 20 | CUB_200_2011/images/144.Common_Tern/Common_Tern_0083_148096.jpg 21 | CUB_200_2011/images/145.Elegant_Tern/Elegant_Tern_0009_150954.jpg 22 | CUB_200_2011/images/145.Elegant_Tern/Elegant_Tern_0045_150752.jpg 23 | CUB_200_2011/images/145.Elegant_Tern/Elegant_Tern_0046_150905.jpg 24 | CUB_200_2011/images/145.Elegant_Tern/Elegant_Tern_0103_150493.jpg 25 | CUB_200_2011/images/145.Elegant_Tern/Elegant_Tern_0004_150948.jpg 26 | CUB_200_2011/images/146.Forsters_Tern/Forsters_Tern_0027_151456.jpg 27 | CUB_200_2011/images/146.Forsters_Tern/Forsters_Tern_0077_152255.jpg 28 | CUB_200_2011/images/146.Forsters_Tern/Forsters_Tern_0125_151399.jpg 29 | CUB_200_2011/images/146.Forsters_Tern/Forsters_Tern_0045_151227.jpg 30 | CUB_200_2011/images/146.Forsters_Tern/Forsters_Tern_0119_152709.jpg 31 | CUB_200_2011/images/147.Least_Tern/Least_Tern_0092_153361.jpg 32 | CUB_200_2011/images/147.Least_Tern/Least_Tern_0020_153458.jpg 33 | CUB_200_2011/images/147.Least_Tern/Least_Tern_0060_153190.jpg 34 | CUB_200_2011/images/147.Least_Tern/Least_Tern_0119_153950.jpg 35 | CUB_200_2011/images/147.Least_Tern/Least_Tern_0037_153637.jpg 36 | CUB_200_2011/images/148.Green_tailed_Towhee/Green_Tailed_Towhee_0018_154825.jpg 37 | CUB_200_2011/images/148.Green_tailed_Towhee/Green_Tailed_Towhee_0070_154844.jpg 38 | CUB_200_2011/images/148.Green_tailed_Towhee/Green_Tailed_Towhee_0064_154771.jpg 39 | CUB_200_2011/images/148.Green_tailed_Towhee/Green_Tailed_Towhee_0058_797399.jpg 40 | CUB_200_2011/images/148.Green_tailed_Towhee/Green_Tailed_Towhee_0060_154820.jpg 41 | CUB_200_2011/images/149.Brown_Thrasher/Brown_Thrasher_0013_155329.jpg 42 | CUB_200_2011/images/149.Brown_Thrasher/Brown_Thrasher_0079_155394.jpg 43 | CUB_200_2011/images/149.Brown_Thrasher/Brown_Thrasher_0019_155216.jpg 44 | CUB_200_2011/images/149.Brown_Thrasher/Brown_Thrasher_0051_155344.jpg 45 | CUB_200_2011/images/149.Brown_Thrasher/Brown_Thrasher_0081_155256.jpg 46 | CUB_200_2011/images/150.Sage_Thrasher/Sage_Thrasher_0033_155511.jpg 47 | CUB_200_2011/images/150.Sage_Thrasher/Sage_Thrasher_0069_155544.jpg 48 | CUB_200_2011/images/150.Sage_Thrasher/Sage_Thrasher_0096_155449.jpg 49 | CUB_200_2011/images/150.Sage_Thrasher/Sage_Thrasher_0104_155529.jpg 50 | CUB_200_2011/images/150.Sage_Thrasher/Sage_Thrasher_0070_155732.jpg 51 | -------------------------------------------------------------------------------- /data/index_list/cub200/session_11.txt: -------------------------------------------------------------------------------- 1 | CUB_200_2011/images/191.Red_headed_Woodpecker/Red_Headed_Woodpecker_0020_183255.jpg 2 | CUB_200_2011/images/191.Red_headed_Woodpecker/Red_Headed_Woodpecker_0005_183414.jpg 3 | CUB_200_2011/images/191.Red_headed_Woodpecker/Red_Headed_Woodpecker_0068_183662.jpg 4 | CUB_200_2011/images/191.Red_headed_Woodpecker/Red_Headed_Woodpecker_0013_182721.jpg 5 | CUB_200_2011/images/191.Red_headed_Woodpecker/Red_Headed_Woodpecker_0095_183688.jpg 6 | CUB_200_2011/images/192.Downy_Woodpecker/Downy_Woodpecker_0040_184061.jpg 7 | CUB_200_2011/images/192.Downy_Woodpecker/Downy_Woodpecker_0031_184120.jpg 8 | CUB_200_2011/images/192.Downy_Woodpecker/Downy_Woodpecker_0090_183964.jpg 9 | CUB_200_2011/images/192.Downy_Woodpecker/Downy_Woodpecker_0005_184098.jpg 10 | CUB_200_2011/images/192.Downy_Woodpecker/Downy_Woodpecker_0136_184534.jpg 11 | CUB_200_2011/images/193.Bewick_Wren/Bewick_Wren_0083_185190.jpg 12 | CUB_200_2011/images/193.Bewick_Wren/Bewick_Wren_0084_184715.jpg 13 | CUB_200_2011/images/193.Bewick_Wren/Bewick_Wren_0015_184981.jpg 14 | CUB_200_2011/images/193.Bewick_Wren/Bewick_Wren_0110_185216.jpg 15 | CUB_200_2011/images/193.Bewick_Wren/Bewick_Wren_0081_185080.jpg 16 | CUB_200_2011/images/194.Cactus_Wren/Cactus_Wren_0089_186023.jpg 17 | CUB_200_2011/images/194.Cactus_Wren/Cactus_Wren_0097_186015.jpg 18 | CUB_200_2011/images/194.Cactus_Wren/Cactus_Wren_0025_185696.jpg 19 | CUB_200_2011/images/194.Cactus_Wren/Cactus_Wren_0066_186028.jpg 20 | CUB_200_2011/images/194.Cactus_Wren/Cactus_Wren_0033_186014.jpg 21 | CUB_200_2011/images/195.Carolina_Wren/Carolina_Wren_0113_186675.jpg 22 | CUB_200_2011/images/195.Carolina_Wren/Carolina_Wren_0099_186237.jpg 23 | CUB_200_2011/images/195.Carolina_Wren/Carolina_Wren_0014_186525.jpg 24 | CUB_200_2011/images/195.Carolina_Wren/Carolina_Wren_0020_186702.jpg 25 | CUB_200_2011/images/195.Carolina_Wren/Carolina_Wren_0128_186581.jpg 26 | CUB_200_2011/images/196.House_Wren/House_Wren_0108_187102.jpg 27 | CUB_200_2011/images/196.House_Wren/House_Wren_0107_187230.jpg 28 | CUB_200_2011/images/196.House_Wren/House_Wren_0035_187708.jpg 29 | CUB_200_2011/images/196.House_Wren/House_Wren_0094_187226.jpg 30 | CUB_200_2011/images/196.House_Wren/House_Wren_0122_187331.jpg 31 | CUB_200_2011/images/197.Marsh_Wren/Marsh_Wren_0056_188241.jpg 32 | CUB_200_2011/images/197.Marsh_Wren/Marsh_Wren_0141_188796.jpg 33 | CUB_200_2011/images/197.Marsh_Wren/Marsh_Wren_0006_188126.jpg 34 | CUB_200_2011/images/197.Marsh_Wren/Marsh_Wren_0044_188270.jpg 35 | CUB_200_2011/images/197.Marsh_Wren/Marsh_Wren_0039_188201.jpg 36 | CUB_200_2011/images/198.Rock_Wren/Rock_Wren_0122_189042.jpg 37 | CUB_200_2011/images/198.Rock_Wren/Rock_Wren_0063_189121.jpg 38 | CUB_200_2011/images/198.Rock_Wren/Rock_Wren_0069_188969.jpg 39 | CUB_200_2011/images/198.Rock_Wren/Rock_Wren_0111_189443.jpg 40 | CUB_200_2011/images/198.Rock_Wren/Rock_Wren_0027_189331.jpg 41 | CUB_200_2011/images/199.Winter_Wren/Winter_Wren_0066_189637.jpg 42 | CUB_200_2011/images/199.Winter_Wren/Winter_Wren_0030_190311.jpg 43 | CUB_200_2011/images/199.Winter_Wren/Winter_Wren_0075_189578.jpg 44 | CUB_200_2011/images/199.Winter_Wren/Winter_Wren_0065_189675.jpg 45 | CUB_200_2011/images/199.Winter_Wren/Winter_Wren_0037_190123.jpg 46 | CUB_200_2011/images/200.Common_Yellowthroat/Common_Yellowthroat_0004_190606.jpg 47 | CUB_200_2011/images/200.Common_Yellowthroat/Common_Yellowthroat_0054_190398.jpg 48 | CUB_200_2011/images/200.Common_Yellowthroat/Common_Yellowthroat_0010_190572.jpg 49 | CUB_200_2011/images/200.Common_Yellowthroat/Common_Yellowthroat_0126_190407.jpg 50 | CUB_200_2011/images/200.Common_Yellowthroat/Common_Yellowthroat_0032_190592.jpg 51 | -------------------------------------------------------------------------------- /data/index_list/cub200/session_2.txt: -------------------------------------------------------------------------------- 1 | CUB_200_2011/images/101.White_Pelican/White_Pelican_0081_96148.jpg 2 | CUB_200_2011/images/101.White_Pelican/White_Pelican_0075_96422.jpg 3 | CUB_200_2011/images/101.White_Pelican/White_Pelican_0026_95832.jpg 4 | CUB_200_2011/images/101.White_Pelican/White_Pelican_0022_95897.jpg 5 | CUB_200_2011/images/101.White_Pelican/White_Pelican_0044_96028.jpg 6 | CUB_200_2011/images/102.Western_Wood_Pewee/Western_Wood_Pewee_0072_98035.jpg 7 | CUB_200_2011/images/102.Western_Wood_Pewee/Western_Wood_Pewee_0004_98257.jpg 8 | CUB_200_2011/images/102.Western_Wood_Pewee/Western_Wood_Pewee_0060_795045.jpg 9 | CUB_200_2011/images/102.Western_Wood_Pewee/Western_Wood_Pewee_0039_795063.jpg 10 | CUB_200_2011/images/102.Western_Wood_Pewee/Western_Wood_Pewee_0040_795051.jpg 11 | CUB_200_2011/images/103.Sayornis/Sayornis_0099_98593.jpg 12 | CUB_200_2011/images/103.Sayornis/Sayornis_0133_99129.jpg 13 | CUB_200_2011/images/103.Sayornis/Sayornis_0098_98419.jpg 14 | CUB_200_2011/images/103.Sayornis/Sayornis_0011_98610.jpg 15 | CUB_200_2011/images/103.Sayornis/Sayornis_0114_98976.jpg 16 | CUB_200_2011/images/104.American_Pipit/American_Pipit_0037_99954.jpg 17 | CUB_200_2011/images/104.American_Pipit/American_Pipit_0067_100237.jpg 18 | CUB_200_2011/images/104.American_Pipit/American_Pipit_0019_99810.jpg 19 | CUB_200_2011/images/104.American_Pipit/American_Pipit_0058_100218.jpg 20 | CUB_200_2011/images/104.American_Pipit/American_Pipit_0113_99939.jpg 21 | CUB_200_2011/images/105.Whip_poor_Will/Whip_Poor_Will_0038_100443.jpg 22 | CUB_200_2011/images/105.Whip_poor_Will/Whip_Poor_Will_0018_796403.jpg 23 | CUB_200_2011/images/105.Whip_poor_Will/Whip_Poor_Will_0013_796439.jpg 24 | CUB_200_2011/images/105.Whip_poor_Will/Whip_Poor_Will_0026_100456.jpg 25 | CUB_200_2011/images/105.Whip_poor_Will/Whip_Poor_Will_0004_100479.jpg 26 | CUB_200_2011/images/106.Horned_Puffin/Horned_Puffin_0004_100733.jpg 27 | CUB_200_2011/images/106.Horned_Puffin/Horned_Puffin_0028_100765.jpg 28 | CUB_200_2011/images/106.Horned_Puffin/Horned_Puffin_0062_100693.jpg 29 | CUB_200_2011/images/106.Horned_Puffin/Horned_Puffin_0042_100760.jpg 30 | CUB_200_2011/images/106.Horned_Puffin/Horned_Puffin_0030_100725.jpg 31 | CUB_200_2011/images/107.Common_Raven/Common_Raven_0009_102112.jpg 32 | CUB_200_2011/images/107.Common_Raven/Common_Raven_0068_101216.jpg 33 | CUB_200_2011/images/107.Common_Raven/Common_Raven_0099_102534.jpg 34 | CUB_200_2011/images/107.Common_Raven/Common_Raven_0001_101213.jpg 35 | CUB_200_2011/images/107.Common_Raven/Common_Raven_0095_101831.jpg 36 | CUB_200_2011/images/108.White_necked_Raven/White_Necked_Raven_0063_797361.jpg 37 | CUB_200_2011/images/108.White_necked_Raven/White_Necked_Raven_0050_797374.jpg 38 | CUB_200_2011/images/108.White_necked_Raven/White_Necked_Raven_0010_797350.jpg 39 | CUB_200_2011/images/108.White_necked_Raven/White_Necked_Raven_0002_797370.jpg 40 | CUB_200_2011/images/108.White_necked_Raven/White_Necked_Raven_0026_797357.jpg 41 | CUB_200_2011/images/109.American_Redstart/American_Redstart_0036_103231.jpg 42 | CUB_200_2011/images/109.American_Redstart/American_Redstart_0071_103266.jpg 43 | CUB_200_2011/images/109.American_Redstart/American_Redstart_0085_103155.jpg 44 | CUB_200_2011/images/109.American_Redstart/American_Redstart_0056_103241.jpg 45 | CUB_200_2011/images/109.American_Redstart/American_Redstart_0049_103176.jpg 46 | CUB_200_2011/images/110.Geococcyx/Geococcyx_0106_104216.jpg 47 | CUB_200_2011/images/110.Geococcyx/Geococcyx_0086_104755.jpg 48 | CUB_200_2011/images/110.Geococcyx/Geococcyx_0124_104141.jpg 49 | CUB_200_2011/images/110.Geococcyx/Geococcyx_0117_104227.jpg 50 | CUB_200_2011/images/110.Geococcyx/Geococcyx_0036_104173.jpg -------------------------------------------------------------------------------- /solo_learn/datasets/fscil_data/index_list/cub200/session_11.txt: -------------------------------------------------------------------------------- 1 | CUB_200_2011/images/191.Red_headed_Woodpecker/Red_Headed_Woodpecker_0020_183255.jpg 2 | CUB_200_2011/images/191.Red_headed_Woodpecker/Red_Headed_Woodpecker_0005_183414.jpg 3 | CUB_200_2011/images/191.Red_headed_Woodpecker/Red_Headed_Woodpecker_0068_183662.jpg 4 | CUB_200_2011/images/191.Red_headed_Woodpecker/Red_Headed_Woodpecker_0013_182721.jpg 5 | CUB_200_2011/images/191.Red_headed_Woodpecker/Red_Headed_Woodpecker_0095_183688.jpg 6 | CUB_200_2011/images/192.Downy_Woodpecker/Downy_Woodpecker_0040_184061.jpg 7 | CUB_200_2011/images/192.Downy_Woodpecker/Downy_Woodpecker_0031_184120.jpg 8 | CUB_200_2011/images/192.Downy_Woodpecker/Downy_Woodpecker_0090_183964.jpg 9 | CUB_200_2011/images/192.Downy_Woodpecker/Downy_Woodpecker_0005_184098.jpg 10 | CUB_200_2011/images/192.Downy_Woodpecker/Downy_Woodpecker_0136_184534.jpg 11 | CUB_200_2011/images/193.Bewick_Wren/Bewick_Wren_0083_185190.jpg 12 | CUB_200_2011/images/193.Bewick_Wren/Bewick_Wren_0084_184715.jpg 13 | CUB_200_2011/images/193.Bewick_Wren/Bewick_Wren_0015_184981.jpg 14 | CUB_200_2011/images/193.Bewick_Wren/Bewick_Wren_0110_185216.jpg 15 | CUB_200_2011/images/193.Bewick_Wren/Bewick_Wren_0081_185080.jpg 16 | CUB_200_2011/images/194.Cactus_Wren/Cactus_Wren_0089_186023.jpg 17 | CUB_200_2011/images/194.Cactus_Wren/Cactus_Wren_0097_186015.jpg 18 | CUB_200_2011/images/194.Cactus_Wren/Cactus_Wren_0025_185696.jpg 19 | CUB_200_2011/images/194.Cactus_Wren/Cactus_Wren_0066_186028.jpg 20 | CUB_200_2011/images/194.Cactus_Wren/Cactus_Wren_0033_186014.jpg 21 | CUB_200_2011/images/195.Carolina_Wren/Carolina_Wren_0113_186675.jpg 22 | CUB_200_2011/images/195.Carolina_Wren/Carolina_Wren_0099_186237.jpg 23 | CUB_200_2011/images/195.Carolina_Wren/Carolina_Wren_0014_186525.jpg 24 | CUB_200_2011/images/195.Carolina_Wren/Carolina_Wren_0020_186702.jpg 25 | CUB_200_2011/images/195.Carolina_Wren/Carolina_Wren_0128_186581.jpg 26 | CUB_200_2011/images/196.House_Wren/House_Wren_0108_187102.jpg 27 | CUB_200_2011/images/196.House_Wren/House_Wren_0107_187230.jpg 28 | CUB_200_2011/images/196.House_Wren/House_Wren_0035_187708.jpg 29 | CUB_200_2011/images/196.House_Wren/House_Wren_0094_187226.jpg 30 | CUB_200_2011/images/196.House_Wren/House_Wren_0122_187331.jpg 31 | CUB_200_2011/images/197.Marsh_Wren/Marsh_Wren_0056_188241.jpg 32 | CUB_200_2011/images/197.Marsh_Wren/Marsh_Wren_0141_188796.jpg 33 | CUB_200_2011/images/197.Marsh_Wren/Marsh_Wren_0006_188126.jpg 34 | CUB_200_2011/images/197.Marsh_Wren/Marsh_Wren_0044_188270.jpg 35 | CUB_200_2011/images/197.Marsh_Wren/Marsh_Wren_0039_188201.jpg 36 | CUB_200_2011/images/198.Rock_Wren/Rock_Wren_0122_189042.jpg 37 | CUB_200_2011/images/198.Rock_Wren/Rock_Wren_0063_189121.jpg 38 | CUB_200_2011/images/198.Rock_Wren/Rock_Wren_0069_188969.jpg 39 | CUB_200_2011/images/198.Rock_Wren/Rock_Wren_0111_189443.jpg 40 | CUB_200_2011/images/198.Rock_Wren/Rock_Wren_0027_189331.jpg 41 | CUB_200_2011/images/199.Winter_Wren/Winter_Wren_0066_189637.jpg 42 | CUB_200_2011/images/199.Winter_Wren/Winter_Wren_0030_190311.jpg 43 | CUB_200_2011/images/199.Winter_Wren/Winter_Wren_0075_189578.jpg 44 | CUB_200_2011/images/199.Winter_Wren/Winter_Wren_0065_189675.jpg 45 | CUB_200_2011/images/199.Winter_Wren/Winter_Wren_0037_190123.jpg 46 | CUB_200_2011/images/200.Common_Yellowthroat/Common_Yellowthroat_0004_190606.jpg 47 | CUB_200_2011/images/200.Common_Yellowthroat/Common_Yellowthroat_0054_190398.jpg 48 | CUB_200_2011/images/200.Common_Yellowthroat/Common_Yellowthroat_0010_190572.jpg 49 | CUB_200_2011/images/200.Common_Yellowthroat/Common_Yellowthroat_0126_190407.jpg 50 | CUB_200_2011/images/200.Common_Yellowthroat/Common_Yellowthroat_0032_190592.jpg 51 | -------------------------------------------------------------------------------- /solo_learn/solo/losses/vibcreg.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | import torch 21 | import torch.nn.functional as F 22 | from solo.losses.vicreg import invariance_loss, variance_loss 23 | from solo.utils.misc import gather 24 | 25 | 26 | def covariance_loss(z1: torch.Tensor, z2: torch.Tensor) -> torch.Tensor: 27 | """Computes normalized covariance loss given batch of projected features z1 from view 1 and 28 | projected features z2 from view 2. 29 | 30 | Args: 31 | z1 (torch.Tensor): NxD Tensor containing projected features from view 1. 32 | z2 (torch.Tensor): NxD Tensor containing projected features from view 2. 33 | 34 | Returns: 35 | torch.Tensor: covariance regularization loss. 36 | """ 37 | 38 | norm_z1 = z1 - z1.mean(dim=0) 39 | norm_z2 = z2 - z2.mean(dim=0) 40 | norm_z1 = F.normalize(norm_z1, p=2, dim=0) # (batch * feature); l2-norm 41 | norm_z2 = F.normalize(norm_z2, p=2, dim=0) 42 | fxf_cov_z1 = torch.mm(norm_z1.T, norm_z1) # (feature * feature) 43 | fxf_cov_z2 = torch.mm(norm_z2.T, norm_z2) 44 | fxf_cov_z1.fill_diagonal_(0.0) 45 | fxf_cov_z2.fill_diagonal_(0.0) 46 | cov_loss = (fxf_cov_z1**2).mean() + (fxf_cov_z2**2).mean() 47 | return cov_loss 48 | 49 | 50 | def vibcreg_loss_func( 51 | z1: torch.Tensor, 52 | z2: torch.Tensor, 53 | sim_loss_weight: float = 25.0, 54 | var_loss_weight: float = 25.0, 55 | cov_loss_weight: float = 200.0, 56 | ) -> torch.Tensor: 57 | """Computes VIbCReg's loss given batch of projected features z1 from view 1 and 58 | projected features z2 from view 2. 59 | 60 | Args: 61 | z1 (torch.Tensor): NxD Tensor containing projected features from view 1. 62 | z2 (torch.Tensor): NxD Tensor containing projected features from view 2. 63 | sim_loss_weight (float): invariance loss weight. 64 | var_loss_weight (float): variance loss weight. 65 | cov_loss_weight (float): covariance loss weight. 66 | 67 | Returns: 68 | torch.Tensor: VIbCReg loss. 69 | """ 70 | 71 | sim_loss = invariance_loss(z1, z2) 72 | # vicreg's official coded gathers the tensors here, so it's likely to benefit vibcreg 73 | # https://github.com/facebookresearch/vicreg/blob/main/main_vicreg.py 74 | z1, z2 = gather(z1), gather(z2) 75 | 76 | var_loss = variance_loss(z1, z2) 77 | cov_loss = covariance_loss(z1, z2) 78 | 79 | loss = sim_loss_weight * sim_loss + var_loss_weight * var_loss + cov_loss_weight * cov_loss 80 | return loss 81 | -------------------------------------------------------------------------------- /solo_learn/datasets/fscil_data/index_list/cub200/session_2.txt: -------------------------------------------------------------------------------- 1 | CUB_200_2011/images/101.White_Pelican/White_Pelican_0081_96148.jpg 2 | CUB_200_2011/images/101.White_Pelican/White_Pelican_0075_96422.jpg 3 | CUB_200_2011/images/101.White_Pelican/White_Pelican_0026_95832.jpg 4 | CUB_200_2011/images/101.White_Pelican/White_Pelican_0022_95897.jpg 5 | CUB_200_2011/images/101.White_Pelican/White_Pelican_0044_96028.jpg 6 | CUB_200_2011/images/102.Western_Wood_Pewee/Western_Wood_Pewee_0072_98035.jpg 7 | CUB_200_2011/images/102.Western_Wood_Pewee/Western_Wood_Pewee_0004_98257.jpg 8 | CUB_200_2011/images/102.Western_Wood_Pewee/Western_Wood_Pewee_0060_795045.jpg 9 | CUB_200_2011/images/102.Western_Wood_Pewee/Western_Wood_Pewee_0039_795063.jpg 10 | CUB_200_2011/images/102.Western_Wood_Pewee/Western_Wood_Pewee_0040_795051.jpg 11 | CUB_200_2011/images/103.Sayornis/Sayornis_0099_98593.jpg 12 | CUB_200_2011/images/103.Sayornis/Sayornis_0133_99129.jpg 13 | CUB_200_2011/images/103.Sayornis/Sayornis_0098_98419.jpg 14 | CUB_200_2011/images/103.Sayornis/Sayornis_0011_98610.jpg 15 | CUB_200_2011/images/103.Sayornis/Sayornis_0114_98976.jpg 16 | CUB_200_2011/images/104.American_Pipit/American_Pipit_0037_99954.jpg 17 | CUB_200_2011/images/104.American_Pipit/American_Pipit_0067_100237.jpg 18 | CUB_200_2011/images/104.American_Pipit/American_Pipit_0019_99810.jpg 19 | CUB_200_2011/images/104.American_Pipit/American_Pipit_0058_100218.jpg 20 | CUB_200_2011/images/104.American_Pipit/American_Pipit_0113_99939.jpg 21 | CUB_200_2011/images/105.Whip_poor_Will/Whip_Poor_Will_0038_100443.jpg 22 | CUB_200_2011/images/105.Whip_poor_Will/Whip_Poor_Will_0018_796403.jpg 23 | CUB_200_2011/images/105.Whip_poor_Will/Whip_Poor_Will_0013_796439.jpg 24 | CUB_200_2011/images/105.Whip_poor_Will/Whip_Poor_Will_0026_100456.jpg 25 | CUB_200_2011/images/105.Whip_poor_Will/Whip_Poor_Will_0004_100479.jpg 26 | CUB_200_2011/images/106.Horned_Puffin/Horned_Puffin_0004_100733.jpg 27 | CUB_200_2011/images/106.Horned_Puffin/Horned_Puffin_0028_100765.jpg 28 | CUB_200_2011/images/106.Horned_Puffin/Horned_Puffin_0062_100693.jpg 29 | CUB_200_2011/images/106.Horned_Puffin/Horned_Puffin_0042_100760.jpg 30 | CUB_200_2011/images/106.Horned_Puffin/Horned_Puffin_0030_100725.jpg 31 | CUB_200_2011/images/107.Common_Raven/Common_Raven_0009_102112.jpg 32 | CUB_200_2011/images/107.Common_Raven/Common_Raven_0068_101216.jpg 33 | CUB_200_2011/images/107.Common_Raven/Common_Raven_0099_102534.jpg 34 | CUB_200_2011/images/107.Common_Raven/Common_Raven_0001_101213.jpg 35 | CUB_200_2011/images/107.Common_Raven/Common_Raven_0095_101831.jpg 36 | CUB_200_2011/images/108.White_necked_Raven/White_Necked_Raven_0063_797361.jpg 37 | CUB_200_2011/images/108.White_necked_Raven/White_Necked_Raven_0050_797374.jpg 38 | CUB_200_2011/images/108.White_necked_Raven/White_Necked_Raven_0010_797350.jpg 39 | CUB_200_2011/images/108.White_necked_Raven/White_Necked_Raven_0002_797370.jpg 40 | CUB_200_2011/images/108.White_necked_Raven/White_Necked_Raven_0026_797357.jpg 41 | CUB_200_2011/images/109.American_Redstart/American_Redstart_0036_103231.jpg 42 | CUB_200_2011/images/109.American_Redstart/American_Redstart_0071_103266.jpg 43 | CUB_200_2011/images/109.American_Redstart/American_Redstart_0085_103155.jpg 44 | CUB_200_2011/images/109.American_Redstart/American_Redstart_0056_103241.jpg 45 | CUB_200_2011/images/109.American_Redstart/American_Redstart_0049_103176.jpg 46 | CUB_200_2011/images/110.Geococcyx/Geococcyx_0106_104216.jpg 47 | CUB_200_2011/images/110.Geococcyx/Geococcyx_0086_104755.jpg 48 | CUB_200_2011/images/110.Geococcyx/Geococcyx_0124_104141.jpg 49 | CUB_200_2011/images/110.Geococcyx/Geococcyx_0117_104227.jpg 50 | CUB_200_2011/images/110.Geococcyx/Geococcyx_0036_104173.jpg 51 | -------------------------------------------------------------------------------- /solo_learn/solo/losses/simclr.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | import torch 21 | import torch.nn.functional as F 22 | from solo.utils.misc import gather, get_rank 23 | 24 | 25 | def simclr_loss_func( 26 | z: torch.Tensor, indexes: torch.Tensor, temperature: float = 0.1, margin: float = 0, apply_infonce=False 27 | ) -> torch.Tensor: 28 | """Computes SimCLR's loss given batch of projected features z 29 | from different views, a positive boolean mask of all positives and 30 | a negative boolean mask of all negatives. 31 | 32 | Args: 33 | z (torch.Tensor): (N*views) x D Tensor containing projected features from the views. 34 | indexes (torch.Tensor): unique identifiers for each crop (unsupervised) 35 | or targets of each crop (supervised). 36 | 37 | Return: 38 | torch.Tensor: SimCLR loss. 39 | """ 40 | 41 | z = F.normalize(z, dim=-1) 42 | gathered_z = gather(z) 43 | 44 | sim = torch.exp(torch.einsum("if, jf -> ij", z, gathered_z) / temperature) 45 | 46 | gathered_indexes = gather(indexes) 47 | 48 | indexes = indexes.unsqueeze(0) 49 | gathered_indexes = gathered_indexes.unsqueeze(0) 50 | # positives 51 | pos_mask = indexes.t() == gathered_indexes 52 | pos_mask[:, z.size(0) * get_rank() :].fill_diagonal_(0) 53 | # negatives 54 | neg_mask = indexes.t() != gathered_indexes 55 | 56 | pos = torch.sum((sim-margin) * pos_mask, 1) 57 | 58 | neg = torch.sum(sim * neg_mask, 1) 59 | loss = -(torch.mean(torch.log(pos / (pos + neg)))) 60 | 61 | # With class wise infone 62 | if apply_infonce: 63 | 64 | # == Original 65 | bs = z.size(0)//2 66 | num = sim[:bs, bs:].diag() # singling out the similarity between each image and its augmentation in the batch 67 | num = torch.cat([sim[:bs, bs:].diag(), sim[bs:, :bs].diag()]) 68 | 69 | # Compute denominator as the sum of the similarities of all the 70 | pos_mask = indexes.t() == gathered_indexes # comparing against all other views and selecting the pos mask for the current class 71 | pos_mask = pos_mask.fill_diagonal_(0) # consider positives except the current one 72 | den = torch.sum(sim * pos_mask, 1) 73 | 74 | # # Remove any indices where den is 0 75 | # zero_mask = den != 0 76 | 77 | # Now compute the total sum for the entire batch 78 | infonce_loss = -(torch.mean(torch.log(num / den))) 79 | # infonce_loss = -(torch.mean(torch.log( (num / den)[zero_mask] ))) 80 | 81 | alpha = 0.3 82 | loss = ((1-alpha) * loss) + (alpha * infonce_loss) 83 | 84 | return loss 85 | -------------------------------------------------------------------------------- /data/index_list/cub200/session_5.txt: -------------------------------------------------------------------------------- 1 | CUB_200_2011/images/131.Vesper_Sparrow/Vesper_Sparrow_0079_125579.jpg 2 | CUB_200_2011/images/131.Vesper_Sparrow/Vesper_Sparrow_0080_125606.jpg 3 | CUB_200_2011/images/131.Vesper_Sparrow/Vesper_Sparrow_0084_125532.jpg 4 | CUB_200_2011/images/131.Vesper_Sparrow/Vesper_Sparrow_0094_125602.jpg 5 | CUB_200_2011/images/131.Vesper_Sparrow/Vesper_Sparrow_0019_125558.jpg 6 | CUB_200_2011/images/132.White_crowned_Sparrow/White_Crowned_Sparrow_0068_126156.jpg 7 | CUB_200_2011/images/132.White_crowned_Sparrow/White_Crowned_Sparrow_0100_126267.jpg 8 | CUB_200_2011/images/132.White_crowned_Sparrow/White_Crowned_Sparrow_0072_127080.jpg 9 | CUB_200_2011/images/132.White_crowned_Sparrow/White_Crowned_Sparrow_0033_127728.jpg 10 | CUB_200_2011/images/132.White_crowned_Sparrow/White_Crowned_Sparrow_0095_127118.jpg 11 | CUB_200_2011/images/133.White_throated_Sparrow/White_Throated_Sparrow_0125_128832.jpg 12 | CUB_200_2011/images/133.White_throated_Sparrow/White_Throated_Sparrow_0056_128906.jpg 13 | CUB_200_2011/images/133.White_throated_Sparrow/White_Throated_Sparrow_0085_129180.jpg 14 | CUB_200_2011/images/133.White_throated_Sparrow/White_Throated_Sparrow_0042_128899.jpg 15 | CUB_200_2011/images/133.White_throated_Sparrow/White_Throated_Sparrow_0021_128804.jpg 16 | CUB_200_2011/images/134.Cape_Glossy_Starling/Cape_Glossy_Starling_0096_129388.jpg 17 | CUB_200_2011/images/134.Cape_Glossy_Starling/Cape_Glossy_Starling_0046_129434.jpg 18 | CUB_200_2011/images/134.Cape_Glossy_Starling/Cape_Glossy_Starling_0043_129358.jpg 19 | CUB_200_2011/images/134.Cape_Glossy_Starling/Cape_Glossy_Starling_0019_129407.jpg 20 | CUB_200_2011/images/134.Cape_Glossy_Starling/Cape_Glossy_Starling_0067_129380.jpg 21 | CUB_200_2011/images/135.Bank_Swallow/Bank_Swallow_0003_129623.jpg 22 | CUB_200_2011/images/135.Bank_Swallow/Bank_Swallow_0045_129483.jpg 23 | CUB_200_2011/images/135.Bank_Swallow/Bank_Swallow_0020_129747.jpg 24 | CUB_200_2011/images/135.Bank_Swallow/Bank_Swallow_0067_129959.jpg 25 | CUB_200_2011/images/135.Bank_Swallow/Bank_Swallow_0053_129501.jpg 26 | CUB_200_2011/images/136.Barn_Swallow/Barn_Swallow_0018_130709.jpg 27 | CUB_200_2011/images/136.Barn_Swallow/Barn_Swallow_0048_132793.jpg 28 | CUB_200_2011/images/136.Barn_Swallow/Barn_Swallow_0070_130127.jpg 29 | CUB_200_2011/images/136.Barn_Swallow/Barn_Swallow_0066_130214.jpg 30 | CUB_200_2011/images/136.Barn_Swallow/Barn_Swallow_0049_130181.jpg 31 | CUB_200_2011/images/137.Cliff_Swallow/Cliff_Swallow_0018_132974.jpg 32 | CUB_200_2011/images/137.Cliff_Swallow/Cliff_Swallow_0023_134314.jpg 33 | CUB_200_2011/images/137.Cliff_Swallow/Cliff_Swallow_0066_133206.jpg 34 | CUB_200_2011/images/137.Cliff_Swallow/Cliff_Swallow_0050_134054.jpg 35 | CUB_200_2011/images/137.Cliff_Swallow/Cliff_Swallow_0075_134516.jpg 36 | CUB_200_2011/images/138.Tree_Swallow/Tree_Swallow_0087_137354.jpg 37 | CUB_200_2011/images/138.Tree_Swallow/Tree_Swallow_0043_136878.jpg 38 | CUB_200_2011/images/138.Tree_Swallow/Tree_Swallow_0111_135253.jpg 39 | CUB_200_2011/images/138.Tree_Swallow/Tree_Swallow_0108_135068.jpg 40 | CUB_200_2011/images/138.Tree_Swallow/Tree_Swallow_0064_136322.jpg 41 | CUB_200_2011/images/139.Scarlet_Tanager/Scarlet_Tanager_0107_138577.jpg 42 | CUB_200_2011/images/139.Scarlet_Tanager/Scarlet_Tanager_0077_137626.jpg 43 | CUB_200_2011/images/139.Scarlet_Tanager/Scarlet_Tanager_0040_137885.jpg 44 | CUB_200_2011/images/139.Scarlet_Tanager/Scarlet_Tanager_0033_137603.jpg 45 | CUB_200_2011/images/139.Scarlet_Tanager/Scarlet_Tanager_0132_138001.jpg 46 | CUB_200_2011/images/140.Summer_Tanager/Summer_Tanager_0032_140425.jpg 47 | CUB_200_2011/images/140.Summer_Tanager/Summer_Tanager_0046_139802.jpg 48 | CUB_200_2011/images/140.Summer_Tanager/Summer_Tanager_0111_139605.jpg 49 | CUB_200_2011/images/140.Summer_Tanager/Summer_Tanager_0116_139923.jpg 50 | CUB_200_2011/images/140.Summer_Tanager/Summer_Tanager_0095_139882.jpg 51 | -------------------------------------------------------------------------------- /data/index_list/cub200/session_3.txt: -------------------------------------------------------------------------------- 1 | CUB_200_2011/images/111.Loggerhead_Shrike/Loggerhead_Shrike_0127_105742.jpg 2 | CUB_200_2011/images/111.Loggerhead_Shrike/Loggerhead_Shrike_0018_26407.jpg 3 | CUB_200_2011/images/111.Loggerhead_Shrike/Loggerhead_Shrike_0019_106132.jpg 4 | CUB_200_2011/images/111.Loggerhead_Shrike/Loggerhead_Shrike_0011_104921.jpg 5 | CUB_200_2011/images/111.Loggerhead_Shrike/Loggerhead_Shrike_0033_105686.jpg 6 | CUB_200_2011/images/112.Great_Grey_Shrike/Great_Grey_Shrike_0092_797048.jpg 7 | CUB_200_2011/images/112.Great_Grey_Shrike/Great_Grey_Shrike_0042_797056.jpg 8 | CUB_200_2011/images/112.Great_Grey_Shrike/Great_Grey_Shrike_0049_797025.jpg 9 | CUB_200_2011/images/112.Great_Grey_Shrike/Great_Grey_Shrike_0083_797051.jpg 10 | CUB_200_2011/images/112.Great_Grey_Shrike/Great_Grey_Shrike_0063_797042.jpg 11 | CUB_200_2011/images/113.Baird_Sparrow/Baird_Sparrow_0021_794576.jpg 12 | CUB_200_2011/images/113.Baird_Sparrow/Baird_Sparrow_0018_794584.jpg 13 | CUB_200_2011/images/113.Baird_Sparrow/Baird_Sparrow_0025_794564.jpg 14 | CUB_200_2011/images/113.Baird_Sparrow/Baird_Sparrow_0041_794582.jpg 15 | CUB_200_2011/images/113.Baird_Sparrow/Baird_Sparrow_0036_794572.jpg 16 | CUB_200_2011/images/114.Black_throated_Sparrow/Black_Throated_Sparrow_0019_107192.jpg 17 | CUB_200_2011/images/114.Black_throated_Sparrow/Black_Throated_Sparrow_0088_107220.jpg 18 | CUB_200_2011/images/114.Black_throated_Sparrow/Black_Throated_Sparrow_0097_106935.jpg 19 | CUB_200_2011/images/114.Black_throated_Sparrow/Black_Throated_Sparrow_0055_107213.jpg 20 | CUB_200_2011/images/114.Black_throated_Sparrow/Black_Throated_Sparrow_0010_107375.jpg 21 | CUB_200_2011/images/115.Brewer_Sparrow/Brewer_Sparrow_0068_107422.jpg 22 | CUB_200_2011/images/115.Brewer_Sparrow/Brewer_Sparrow_0036_107451.jpg 23 | CUB_200_2011/images/115.Brewer_Sparrow/Brewer_Sparrow_0041_796711.jpg 24 | CUB_200_2011/images/115.Brewer_Sparrow/Brewer_Sparrow_0014_107435.jpg 25 | CUB_200_2011/images/115.Brewer_Sparrow/Brewer_Sparrow_0076_107393.jpg 26 | CUB_200_2011/images/116.Chipping_Sparrow/Chipping_Sparrow_0064_108204.jpg 27 | CUB_200_2011/images/116.Chipping_Sparrow/Chipping_Sparrow_0038_109234.jpg 28 | CUB_200_2011/images/116.Chipping_Sparrow/Chipping_Sparrow_0098_108644.jpg 29 | CUB_200_2011/images/116.Chipping_Sparrow/Chipping_Sparrow_0110_108974.jpg 30 | CUB_200_2011/images/116.Chipping_Sparrow/Chipping_Sparrow_0023_108684.jpg 31 | CUB_200_2011/images/117.Clay_colored_Sparrow/Clay_Colored_Sparrow_0104_110699.jpg 32 | CUB_200_2011/images/117.Clay_colored_Sparrow/Clay_Colored_Sparrow_0098_110735.jpg 33 | CUB_200_2011/images/117.Clay_colored_Sparrow/Clay_Colored_Sparrow_0003_110672.jpg 34 | CUB_200_2011/images/117.Clay_colored_Sparrow/Clay_Colored_Sparrow_0029_110720.jpg 35 | CUB_200_2011/images/117.Clay_colored_Sparrow/Clay_Colored_Sparrow_0087_110946.jpg 36 | CUB_200_2011/images/118.House_Sparrow/House_Sparrow_0092_111413.jpg 37 | CUB_200_2011/images/118.House_Sparrow/House_Sparrow_0111_112968.jpg 38 | CUB_200_2011/images/118.House_Sparrow/House_Sparrow_0080_111099.jpg 39 | CUB_200_2011/images/118.House_Sparrow/House_Sparrow_0130_110985.jpg 40 | CUB_200_2011/images/118.House_Sparrow/House_Sparrow_0053_111388.jpg 41 | CUB_200_2011/images/119.Field_Sparrow/Field_Sparrow_0069_113827.jpg 42 | CUB_200_2011/images/119.Field_Sparrow/Field_Sparrow_0130_113846.jpg 43 | CUB_200_2011/images/119.Field_Sparrow/Field_Sparrow_0091_113486.jpg 44 | CUB_200_2011/images/119.Field_Sparrow/Field_Sparrow_0043_113607.jpg 45 | CUB_200_2011/images/119.Field_Sparrow/Field_Sparrow_0108_114154.jpg 46 | CUB_200_2011/images/120.Fox_Sparrow/Fox_Sparrow_0104_114908.jpg 47 | CUB_200_2011/images/120.Fox_Sparrow/Fox_Sparrow_0086_115484.jpg 48 | CUB_200_2011/images/120.Fox_Sparrow/Fox_Sparrow_0055_114809.jpg 49 | CUB_200_2011/images/120.Fox_Sparrow/Fox_Sparrow_0012_115324.jpg 50 | CUB_200_2011/images/120.Fox_Sparrow/Fox_Sparrow_0035_114866.jpg -------------------------------------------------------------------------------- /solo_learn/datasets/fscil_data/index_list/cub200/session_5.txt: -------------------------------------------------------------------------------- 1 | CUB_200_2011/images/131.Vesper_Sparrow/Vesper_Sparrow_0079_125579.jpg 2 | CUB_200_2011/images/131.Vesper_Sparrow/Vesper_Sparrow_0080_125606.jpg 3 | CUB_200_2011/images/131.Vesper_Sparrow/Vesper_Sparrow_0084_125532.jpg 4 | CUB_200_2011/images/131.Vesper_Sparrow/Vesper_Sparrow_0094_125602.jpg 5 | CUB_200_2011/images/131.Vesper_Sparrow/Vesper_Sparrow_0019_125558.jpg 6 | CUB_200_2011/images/132.White_crowned_Sparrow/White_Crowned_Sparrow_0068_126156.jpg 7 | CUB_200_2011/images/132.White_crowned_Sparrow/White_Crowned_Sparrow_0100_126267.jpg 8 | CUB_200_2011/images/132.White_crowned_Sparrow/White_Crowned_Sparrow_0072_127080.jpg 9 | CUB_200_2011/images/132.White_crowned_Sparrow/White_Crowned_Sparrow_0033_127728.jpg 10 | CUB_200_2011/images/132.White_crowned_Sparrow/White_Crowned_Sparrow_0095_127118.jpg 11 | CUB_200_2011/images/133.White_throated_Sparrow/White_Throated_Sparrow_0125_128832.jpg 12 | CUB_200_2011/images/133.White_throated_Sparrow/White_Throated_Sparrow_0056_128906.jpg 13 | CUB_200_2011/images/133.White_throated_Sparrow/White_Throated_Sparrow_0085_129180.jpg 14 | CUB_200_2011/images/133.White_throated_Sparrow/White_Throated_Sparrow_0042_128899.jpg 15 | CUB_200_2011/images/133.White_throated_Sparrow/White_Throated_Sparrow_0021_128804.jpg 16 | CUB_200_2011/images/134.Cape_Glossy_Starling/Cape_Glossy_Starling_0096_129388.jpg 17 | CUB_200_2011/images/134.Cape_Glossy_Starling/Cape_Glossy_Starling_0046_129434.jpg 18 | CUB_200_2011/images/134.Cape_Glossy_Starling/Cape_Glossy_Starling_0043_129358.jpg 19 | CUB_200_2011/images/134.Cape_Glossy_Starling/Cape_Glossy_Starling_0019_129407.jpg 20 | CUB_200_2011/images/134.Cape_Glossy_Starling/Cape_Glossy_Starling_0067_129380.jpg 21 | CUB_200_2011/images/135.Bank_Swallow/Bank_Swallow_0003_129623.jpg 22 | CUB_200_2011/images/135.Bank_Swallow/Bank_Swallow_0045_129483.jpg 23 | CUB_200_2011/images/135.Bank_Swallow/Bank_Swallow_0020_129747.jpg 24 | CUB_200_2011/images/135.Bank_Swallow/Bank_Swallow_0067_129959.jpg 25 | CUB_200_2011/images/135.Bank_Swallow/Bank_Swallow_0053_129501.jpg 26 | CUB_200_2011/images/136.Barn_Swallow/Barn_Swallow_0018_130709.jpg 27 | CUB_200_2011/images/136.Barn_Swallow/Barn_Swallow_0048_132793.jpg 28 | CUB_200_2011/images/136.Barn_Swallow/Barn_Swallow_0070_130127.jpg 29 | CUB_200_2011/images/136.Barn_Swallow/Barn_Swallow_0066_130214.jpg 30 | CUB_200_2011/images/136.Barn_Swallow/Barn_Swallow_0049_130181.jpg 31 | CUB_200_2011/images/137.Cliff_Swallow/Cliff_Swallow_0018_132974.jpg 32 | CUB_200_2011/images/137.Cliff_Swallow/Cliff_Swallow_0023_134314.jpg 33 | CUB_200_2011/images/137.Cliff_Swallow/Cliff_Swallow_0066_133206.jpg 34 | CUB_200_2011/images/137.Cliff_Swallow/Cliff_Swallow_0050_134054.jpg 35 | CUB_200_2011/images/137.Cliff_Swallow/Cliff_Swallow_0075_134516.jpg 36 | CUB_200_2011/images/138.Tree_Swallow/Tree_Swallow_0087_137354.jpg 37 | CUB_200_2011/images/138.Tree_Swallow/Tree_Swallow_0043_136878.jpg 38 | CUB_200_2011/images/138.Tree_Swallow/Tree_Swallow_0111_135253.jpg 39 | CUB_200_2011/images/138.Tree_Swallow/Tree_Swallow_0108_135068.jpg 40 | CUB_200_2011/images/138.Tree_Swallow/Tree_Swallow_0064_136322.jpg 41 | CUB_200_2011/images/139.Scarlet_Tanager/Scarlet_Tanager_0107_138577.jpg 42 | CUB_200_2011/images/139.Scarlet_Tanager/Scarlet_Tanager_0077_137626.jpg 43 | CUB_200_2011/images/139.Scarlet_Tanager/Scarlet_Tanager_0040_137885.jpg 44 | CUB_200_2011/images/139.Scarlet_Tanager/Scarlet_Tanager_0033_137603.jpg 45 | CUB_200_2011/images/139.Scarlet_Tanager/Scarlet_Tanager_0132_138001.jpg 46 | CUB_200_2011/images/140.Summer_Tanager/Summer_Tanager_0032_140425.jpg 47 | CUB_200_2011/images/140.Summer_Tanager/Summer_Tanager_0046_139802.jpg 48 | CUB_200_2011/images/140.Summer_Tanager/Summer_Tanager_0111_139605.jpg 49 | CUB_200_2011/images/140.Summer_Tanager/Summer_Tanager_0116_139923.jpg 50 | CUB_200_2011/images/140.Summer_Tanager/Summer_Tanager_0095_139882.jpg 51 | -------------------------------------------------------------------------------- /params/OrCo/cifar100/args.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "(Group CIFAR) supcon (Group CIFAR) supcon (Resnet 18->12, aa_string: v0-mstd0.5, views:4, supcon + selfsupcon)", 3 | "method": "supcon", 4 | "backbone": { 5 | "name": "resnet12_nc", 6 | "kwargs": {} 7 | }, 8 | "method_kwargs": { 9 | "proj_hidden_dim": 2048, 10 | "proj_output_dim": 128, 11 | "temperature": 0.2, 12 | "proj_type": "proj", 13 | "apply_infonce": true 14 | }, 15 | "data": { 16 | "dataset": "fscil_cifar100", 17 | "train_path": "./datasets", 18 | "format": "image_folder", 19 | "num_workers": 4, 20 | "aa_string": "v0-mstd0.5", 21 | "val_path": null, 22 | "no_labels": false, 23 | "fraction": -1, 24 | "num_classes": 60, 25 | "num_large_crops": 4, 26 | "num_small_crops": 0 27 | }, 28 | "optimizer": { 29 | "name": "lars", 30 | "batch_size": 512, 31 | "lr": 0.8, 32 | "classifier_lr": 0.1, 33 | "weight_decay": 1e-05, 34 | "kwargs": { 35 | "momentum": 0.9, 36 | "clip_lr": true, 37 | "eta": 0.02, 38 | "exclude_bias_n_norm": true 39 | }, 40 | "exclude_bias_n_norm_wd": false 41 | }, 42 | "scheduler": { 43 | "name": "warmup_cosine", 44 | "min_lr": 0, 45 | "warmup_start_lr": 0.003, 46 | "warmup_epochs": 10, 47 | "lr_decay_steps": null, 48 | "interval": "step" 49 | }, 50 | "checkpoint": { 51 | "enabled": true, 52 | "dir": "trained_models", 53 | "frequency": 20, 54 | "keep_prev": false 55 | }, 56 | "auto_resume": { 57 | "enabled": false, 58 | "max_hours": 36 59 | }, 60 | "max_epochs": 300, 61 | "devices": [ 62 | 0 63 | ], 64 | "sync_batchnorm": true, 65 | "accelerator": "gpu", 66 | "strategy": "ddp", 67 | "precision": 16, 68 | "augmentations": [ 69 | { 70 | "rrc": { 71 | "enabled": true, 72 | "crop_min_scale": 0.2, 73 | "crop_max_scale": 1.0 74 | }, 75 | "color_jitter": { 76 | "prob": 0.8, 77 | "brightness": 0.8, 78 | "contrast": 0.8, 79 | "saturation": 0.8, 80 | "hue": 0.2 81 | }, 82 | "grayscale": { 83 | "prob": 0.2 84 | }, 85 | "gaussian_blur": { 86 | "prob": 0.5 87 | }, 88 | "solarization": { 89 | "prob": 0.0 90 | }, 91 | "equalization": { 92 | "prob": 0.0 93 | }, 94 | "horizontal_flip": { 95 | "prob": 0.5 96 | }, 97 | "crop_size": 32, 98 | "num_crops": 4, 99 | "auto_augment": true, 100 | "aa_string": "v0-mstd0.5" 101 | } 102 | ], 103 | "wandb": { 104 | "enabled": true, 105 | "entity": null, 106 | "project": "Group CIFAR Supcon (new)", 107 | "offline": false 108 | }, 109 | "auto_umap": { 110 | "enabled": false, 111 | "dir": "auto_umap", 112 | "frequency": 1 113 | }, 114 | "debug_augmentations": false, 115 | "seed": 5, 116 | "resume_from_checkpoint": null, 117 | "num_nodes": 1, 118 | "accumulate_grad_batches": 1, 119 | "knn_eval": { 120 | "enabled": false, 121 | "k": 20, 122 | "distance_func": "euclidean" 123 | }, 124 | "performance": { 125 | "disable_channel_last": false 126 | }, 127 | "wandb_run_id": "15dtcwvu" 128 | } -------------------------------------------------------------------------------- /solo_learn/datasets/fscil_data/index_list/cub200/session_3.txt: -------------------------------------------------------------------------------- 1 | CUB_200_2011/images/111.Loggerhead_Shrike/Loggerhead_Shrike_0127_105742.jpg 2 | CUB_200_2011/images/111.Loggerhead_Shrike/Loggerhead_Shrike_0018_26407.jpg 3 | CUB_200_2011/images/111.Loggerhead_Shrike/Loggerhead_Shrike_0019_106132.jpg 4 | CUB_200_2011/images/111.Loggerhead_Shrike/Loggerhead_Shrike_0011_104921.jpg 5 | CUB_200_2011/images/111.Loggerhead_Shrike/Loggerhead_Shrike_0033_105686.jpg 6 | CUB_200_2011/images/112.Great_Grey_Shrike/Great_Grey_Shrike_0092_797048.jpg 7 | CUB_200_2011/images/112.Great_Grey_Shrike/Great_Grey_Shrike_0042_797056.jpg 8 | CUB_200_2011/images/112.Great_Grey_Shrike/Great_Grey_Shrike_0049_797025.jpg 9 | CUB_200_2011/images/112.Great_Grey_Shrike/Great_Grey_Shrike_0083_797051.jpg 10 | CUB_200_2011/images/112.Great_Grey_Shrike/Great_Grey_Shrike_0063_797042.jpg 11 | CUB_200_2011/images/113.Baird_Sparrow/Baird_Sparrow_0021_794576.jpg 12 | CUB_200_2011/images/113.Baird_Sparrow/Baird_Sparrow_0018_794584.jpg 13 | CUB_200_2011/images/113.Baird_Sparrow/Baird_Sparrow_0025_794564.jpg 14 | CUB_200_2011/images/113.Baird_Sparrow/Baird_Sparrow_0041_794582.jpg 15 | CUB_200_2011/images/113.Baird_Sparrow/Baird_Sparrow_0036_794572.jpg 16 | CUB_200_2011/images/114.Black_throated_Sparrow/Black_Throated_Sparrow_0019_107192.jpg 17 | CUB_200_2011/images/114.Black_throated_Sparrow/Black_Throated_Sparrow_0088_107220.jpg 18 | CUB_200_2011/images/114.Black_throated_Sparrow/Black_Throated_Sparrow_0097_106935.jpg 19 | CUB_200_2011/images/114.Black_throated_Sparrow/Black_Throated_Sparrow_0055_107213.jpg 20 | CUB_200_2011/images/114.Black_throated_Sparrow/Black_Throated_Sparrow_0010_107375.jpg 21 | CUB_200_2011/images/115.Brewer_Sparrow/Brewer_Sparrow_0068_107422.jpg 22 | CUB_200_2011/images/115.Brewer_Sparrow/Brewer_Sparrow_0036_107451.jpg 23 | CUB_200_2011/images/115.Brewer_Sparrow/Brewer_Sparrow_0041_796711.jpg 24 | CUB_200_2011/images/115.Brewer_Sparrow/Brewer_Sparrow_0014_107435.jpg 25 | CUB_200_2011/images/115.Brewer_Sparrow/Brewer_Sparrow_0076_107393.jpg 26 | CUB_200_2011/images/116.Chipping_Sparrow/Chipping_Sparrow_0064_108204.jpg 27 | CUB_200_2011/images/116.Chipping_Sparrow/Chipping_Sparrow_0038_109234.jpg 28 | CUB_200_2011/images/116.Chipping_Sparrow/Chipping_Sparrow_0098_108644.jpg 29 | CUB_200_2011/images/116.Chipping_Sparrow/Chipping_Sparrow_0110_108974.jpg 30 | CUB_200_2011/images/116.Chipping_Sparrow/Chipping_Sparrow_0023_108684.jpg 31 | CUB_200_2011/images/117.Clay_colored_Sparrow/Clay_Colored_Sparrow_0104_110699.jpg 32 | CUB_200_2011/images/117.Clay_colored_Sparrow/Clay_Colored_Sparrow_0098_110735.jpg 33 | CUB_200_2011/images/117.Clay_colored_Sparrow/Clay_Colored_Sparrow_0003_110672.jpg 34 | CUB_200_2011/images/117.Clay_colored_Sparrow/Clay_Colored_Sparrow_0029_110720.jpg 35 | CUB_200_2011/images/117.Clay_colored_Sparrow/Clay_Colored_Sparrow_0087_110946.jpg 36 | CUB_200_2011/images/118.House_Sparrow/House_Sparrow_0092_111413.jpg 37 | CUB_200_2011/images/118.House_Sparrow/House_Sparrow_0111_112968.jpg 38 | CUB_200_2011/images/118.House_Sparrow/House_Sparrow_0080_111099.jpg 39 | CUB_200_2011/images/118.House_Sparrow/House_Sparrow_0130_110985.jpg 40 | CUB_200_2011/images/118.House_Sparrow/House_Sparrow_0053_111388.jpg 41 | CUB_200_2011/images/119.Field_Sparrow/Field_Sparrow_0069_113827.jpg 42 | CUB_200_2011/images/119.Field_Sparrow/Field_Sparrow_0130_113846.jpg 43 | CUB_200_2011/images/119.Field_Sparrow/Field_Sparrow_0091_113486.jpg 44 | CUB_200_2011/images/119.Field_Sparrow/Field_Sparrow_0043_113607.jpg 45 | CUB_200_2011/images/119.Field_Sparrow/Field_Sparrow_0108_114154.jpg 46 | CUB_200_2011/images/120.Fox_Sparrow/Fox_Sparrow_0104_114908.jpg 47 | CUB_200_2011/images/120.Fox_Sparrow/Fox_Sparrow_0086_115484.jpg 48 | CUB_200_2011/images/120.Fox_Sparrow/Fox_Sparrow_0055_114809.jpg 49 | CUB_200_2011/images/120.Fox_Sparrow/Fox_Sparrow_0012_115324.jpg 50 | CUB_200_2011/images/120.Fox_Sparrow/Fox_Sparrow_0035_114866.jpg 51 | -------------------------------------------------------------------------------- /data/index_list/cub200/session_9.txt: -------------------------------------------------------------------------------- 1 | CUB_200_2011/images/171.Myrtle_Warbler/Myrtle_Warbler_0023_166764.jpg 2 | CUB_200_2011/images/171.Myrtle_Warbler/Myrtle_Warbler_0050_166820.jpg 3 | CUB_200_2011/images/171.Myrtle_Warbler/Myrtle_Warbler_0043_166708.jpg 4 | CUB_200_2011/images/171.Myrtle_Warbler/Myrtle_Warbler_0098_166794.jpg 5 | CUB_200_2011/images/171.Myrtle_Warbler/Myrtle_Warbler_0015_166713.jpg 6 | CUB_200_2011/images/172.Nashville_Warbler/Nashville_Warbler_0108_167259.jpg 7 | CUB_200_2011/images/172.Nashville_Warbler/Nashville_Warbler_0098_167293.jpg 8 | CUB_200_2011/images/172.Nashville_Warbler/Nashville_Warbler_0104_167096.jpg 9 | CUB_200_2011/images/172.Nashville_Warbler/Nashville_Warbler_0110_167268.jpg 10 | CUB_200_2011/images/172.Nashville_Warbler/Nashville_Warbler_0081_167234.jpg 11 | CUB_200_2011/images/173.Orange_crowned_Warbler/Orange_Crowned_Warbler_0062_168119.jpg 12 | CUB_200_2011/images/173.Orange_crowned_Warbler/Orange_Crowned_Warbler_0050_168166.jpg 13 | CUB_200_2011/images/173.Orange_crowned_Warbler/Orange_Crowned_Warbler_0055_168600.jpg 14 | CUB_200_2011/images/173.Orange_crowned_Warbler/Orange_Crowned_Warbler_0118_167640.jpg 15 | CUB_200_2011/images/173.Orange_crowned_Warbler/Orange_Crowned_Warbler_0067_167588.jpg 16 | CUB_200_2011/images/174.Palm_Warbler/Palm_Warbler_0083_170281.jpg 17 | CUB_200_2011/images/174.Palm_Warbler/Palm_Warbler_0012_170857.jpg 18 | CUB_200_2011/images/174.Palm_Warbler/Palm_Warbler_0015_169626.jpg 19 | CUB_200_2011/images/174.Palm_Warbler/Palm_Warbler_0126_170311.jpg 20 | CUB_200_2011/images/174.Palm_Warbler/Palm_Warbler_0136_170276.jpg 21 | CUB_200_2011/images/175.Pine_Warbler/Pine_Warbler_0017_171678.jpg 22 | CUB_200_2011/images/175.Pine_Warbler/Pine_Warbler_0127_171742.jpg 23 | CUB_200_2011/images/175.Pine_Warbler/Pine_Warbler_0060_171635.jpg 24 | CUB_200_2011/images/175.Pine_Warbler/Pine_Warbler_0056_172064.jpg 25 | CUB_200_2011/images/175.Pine_Warbler/Pine_Warbler_0102_171147.jpg 26 | CUB_200_2011/images/176.Prairie_Warbler/Prairie_Warbler_0073_172771.jpg 27 | CUB_200_2011/images/176.Prairie_Warbler/Prairie_Warbler_0120_173097.jpg 28 | CUB_200_2011/images/176.Prairie_Warbler/Prairie_Warbler_0063_172682.jpg 29 | CUB_200_2011/images/176.Prairie_Warbler/Prairie_Warbler_0053_173290.jpg 30 | CUB_200_2011/images/176.Prairie_Warbler/Prairie_Warbler_0080_172724.jpg 31 | CUB_200_2011/images/177.Prothonotary_Warbler/Prothonotary_Warbler_0062_174412.jpg 32 | CUB_200_2011/images/177.Prothonotary_Warbler/Prothonotary_Warbler_0037_173418.jpg 33 | CUB_200_2011/images/177.Prothonotary_Warbler/Prothonotary_Warbler_0076_174118.jpg 34 | CUB_200_2011/images/177.Prothonotary_Warbler/Prothonotary_Warbler_0070_174650.jpg 35 | CUB_200_2011/images/177.Prothonotary_Warbler/Prothonotary_Warbler_0110_173857.jpg 36 | CUB_200_2011/images/178.Swainson_Warbler/Swainson_Warbler_0017_174685.jpg 37 | CUB_200_2011/images/178.Swainson_Warbler/Swainson_Warbler_0039_794859.jpg 38 | CUB_200_2011/images/178.Swainson_Warbler/Swainson_Warbler_0051_794900.jpg 39 | CUB_200_2011/images/178.Swainson_Warbler/Swainson_Warbler_0037_174691.jpg 40 | CUB_200_2011/images/178.Swainson_Warbler/Swainson_Warbler_0018_174715.jpg 41 | CUB_200_2011/images/179.Tennessee_Warbler/Tennessee_Warbler_0051_175015.jpg 42 | CUB_200_2011/images/179.Tennessee_Warbler/Tennessee_Warbler_0019_174786.jpg 43 | CUB_200_2011/images/179.Tennessee_Warbler/Tennessee_Warbler_0023_174977.jpg 44 | CUB_200_2011/images/179.Tennessee_Warbler/Tennessee_Warbler_0033_174772.jpg 45 | CUB_200_2011/images/179.Tennessee_Warbler/Tennessee_Warbler_0004_174997.jpg 46 | CUB_200_2011/images/180.Wilson_Warbler/Wilson_Warbler_0107_175320.jpg 47 | CUB_200_2011/images/180.Wilson_Warbler/Wilson_Warbler_0065_175924.jpg 48 | CUB_200_2011/images/180.Wilson_Warbler/Wilson_Warbler_0129_175256.jpg 49 | CUB_200_2011/images/180.Wilson_Warbler/Wilson_Warbler_0126_175368.jpg 50 | CUB_200_2011/images/180.Wilson_Warbler/Wilson_Warbler_0054_175285.jpg 51 | -------------------------------------------------------------------------------- /data/index_list/cub200/session_4.txt: -------------------------------------------------------------------------------- 1 | CUB_200_2011/images/121.Grasshopper_Sparrow/Grasshopper_Sparrow_0014_116129.jpg 2 | CUB_200_2011/images/121.Grasshopper_Sparrow/Grasshopper_Sparrow_0114_116160.jpg 3 | CUB_200_2011/images/121.Grasshopper_Sparrow/Grasshopper_Sparrow_0068_115799.jpg 4 | CUB_200_2011/images/121.Grasshopper_Sparrow/Grasshopper_Sparrow_0110_115644.jpg 5 | CUB_200_2011/images/121.Grasshopper_Sparrow/Grasshopper_Sparrow_0042_115638.jpg 6 | CUB_200_2011/images/122.Harris_Sparrow/Harris_Sparrow_0006_116364.jpg 7 | CUB_200_2011/images/122.Harris_Sparrow/Harris_Sparrow_0018_116402.jpg 8 | CUB_200_2011/images/122.Harris_Sparrow/Harris_Sparrow_0026_116620.jpg 9 | CUB_200_2011/images/122.Harris_Sparrow/Harris_Sparrow_0020_116379.jpg 10 | CUB_200_2011/images/122.Harris_Sparrow/Harris_Sparrow_0011_116597.jpg 11 | CUB_200_2011/images/123.Henslow_Sparrow/Henslow_Sparrow_0023_796582.jpg 12 | CUB_200_2011/images/123.Henslow_Sparrow/Henslow_Sparrow_0052_796599.jpg 13 | CUB_200_2011/images/123.Henslow_Sparrow/Henslow_Sparrow_0054_116850.jpg 14 | CUB_200_2011/images/123.Henslow_Sparrow/Henslow_Sparrow_0064_796573.jpg 15 | CUB_200_2011/images/123.Henslow_Sparrow/Henslow_Sparrow_0070_796571.jpg 16 | CUB_200_2011/images/124.Le_Conte_Sparrow/Le_Conte_Sparrow_0040_117088.jpg 17 | CUB_200_2011/images/124.Le_Conte_Sparrow/Le_Conte_Sparrow_0072_795230.jpg 18 | CUB_200_2011/images/124.Le_Conte_Sparrow/Le_Conte_Sparrow_0068_795180.jpg 19 | CUB_200_2011/images/124.Le_Conte_Sparrow/Le_Conte_Sparrow_0081_795215.jpg 20 | CUB_200_2011/images/124.Le_Conte_Sparrow/Le_Conte_Sparrow_0032_795186.jpg 21 | CUB_200_2011/images/125.Lincoln_Sparrow/Lincoln_Sparrow_0084_117492.jpg 22 | CUB_200_2011/images/125.Lincoln_Sparrow/Lincoln_Sparrow_0009_117535.jpg 23 | CUB_200_2011/images/125.Lincoln_Sparrow/Lincoln_Sparrow_0014_117883.jpg 24 | CUB_200_2011/images/125.Lincoln_Sparrow/Lincoln_Sparrow_0042_117507.jpg 25 | CUB_200_2011/images/125.Lincoln_Sparrow/Lincoln_Sparrow_0072_117951.jpg 26 | CUB_200_2011/images/126.Nelson_Sharp_tailed_Sparrow/Nelson_Sharp_Tailed_Sparrow_0056_117974.jpg 27 | CUB_200_2011/images/126.Nelson_Sharp_tailed_Sparrow/Nelson_Sharp_Tailed_Sparrow_0002_796908.jpg 28 | CUB_200_2011/images/126.Nelson_Sharp_tailed_Sparrow/Nelson_Sharp_Tailed_Sparrow_0051_796902.jpg 29 | CUB_200_2011/images/126.Nelson_Sharp_tailed_Sparrow/Nelson_Sharp_Tailed_Sparrow_0014_796906.jpg 30 | CUB_200_2011/images/126.Nelson_Sharp_tailed_Sparrow/Nelson_Sharp_Tailed_Sparrow_0077_796913.jpg 31 | CUB_200_2011/images/127.Savannah_Sparrow/Savannah_Sparrow_0049_119596.jpg 32 | CUB_200_2011/images/127.Savannah_Sparrow/Savannah_Sparrow_0118_118603.jpg 33 | CUB_200_2011/images/127.Savannah_Sparrow/Savannah_Sparrow_0068_119972.jpg 34 | CUB_200_2011/images/127.Savannah_Sparrow/Savannah_Sparrow_0052_118583.jpg 35 | CUB_200_2011/images/127.Savannah_Sparrow/Savannah_Sparrow_0054_120057.jpg 36 | CUB_200_2011/images/128.Seaside_Sparrow/Seaside_Sparrow_0001_120720.jpg 37 | CUB_200_2011/images/128.Seaside_Sparrow/Seaside_Sparrow_0048_120758.jpg 38 | CUB_200_2011/images/128.Seaside_Sparrow/Seaside_Sparrow_0042_796528.jpg 39 | CUB_200_2011/images/128.Seaside_Sparrow/Seaside_Sparrow_0049_120735.jpg 40 | CUB_200_2011/images/128.Seaside_Sparrow/Seaside_Sparrow_0035_796533.jpg 41 | CUB_200_2011/images/129.Song_Sparrow/Song_Sparrow_0046_121903.jpg 42 | CUB_200_2011/images/129.Song_Sparrow/Song_Sparrow_0055_121158.jpg 43 | CUB_200_2011/images/129.Song_Sparrow/Song_Sparrow_0107_120990.jpg 44 | CUB_200_2011/images/129.Song_Sparrow/Song_Sparrow_0091_121651.jpg 45 | CUB_200_2011/images/129.Song_Sparrow/Song_Sparrow_0087_121062.jpg 46 | CUB_200_2011/images/130.Tree_Sparrow/Tree_Sparrow_0094_124974.jpg 47 | CUB_200_2011/images/130.Tree_Sparrow/Tree_Sparrow_0123_125324.jpg 48 | CUB_200_2011/images/130.Tree_Sparrow/Tree_Sparrow_0041_123497.jpg 49 | CUB_200_2011/images/130.Tree_Sparrow/Tree_Sparrow_0086_123751.jpg 50 | CUB_200_2011/images/130.Tree_Sparrow/Tree_Sparrow_0119_124114.jpg 51 | -------------------------------------------------------------------------------- /solo_learn/datasets/fscil_data/index_list/cub200/session_9.txt: -------------------------------------------------------------------------------- 1 | CUB_200_2011/images/171.Myrtle_Warbler/Myrtle_Warbler_0023_166764.jpg 2 | CUB_200_2011/images/171.Myrtle_Warbler/Myrtle_Warbler_0050_166820.jpg 3 | CUB_200_2011/images/171.Myrtle_Warbler/Myrtle_Warbler_0043_166708.jpg 4 | CUB_200_2011/images/171.Myrtle_Warbler/Myrtle_Warbler_0098_166794.jpg 5 | CUB_200_2011/images/171.Myrtle_Warbler/Myrtle_Warbler_0015_166713.jpg 6 | CUB_200_2011/images/172.Nashville_Warbler/Nashville_Warbler_0108_167259.jpg 7 | CUB_200_2011/images/172.Nashville_Warbler/Nashville_Warbler_0098_167293.jpg 8 | CUB_200_2011/images/172.Nashville_Warbler/Nashville_Warbler_0104_167096.jpg 9 | CUB_200_2011/images/172.Nashville_Warbler/Nashville_Warbler_0110_167268.jpg 10 | CUB_200_2011/images/172.Nashville_Warbler/Nashville_Warbler_0081_167234.jpg 11 | CUB_200_2011/images/173.Orange_crowned_Warbler/Orange_Crowned_Warbler_0062_168119.jpg 12 | CUB_200_2011/images/173.Orange_crowned_Warbler/Orange_Crowned_Warbler_0050_168166.jpg 13 | CUB_200_2011/images/173.Orange_crowned_Warbler/Orange_Crowned_Warbler_0055_168600.jpg 14 | CUB_200_2011/images/173.Orange_crowned_Warbler/Orange_Crowned_Warbler_0118_167640.jpg 15 | CUB_200_2011/images/173.Orange_crowned_Warbler/Orange_Crowned_Warbler_0067_167588.jpg 16 | CUB_200_2011/images/174.Palm_Warbler/Palm_Warbler_0083_170281.jpg 17 | CUB_200_2011/images/174.Palm_Warbler/Palm_Warbler_0012_170857.jpg 18 | CUB_200_2011/images/174.Palm_Warbler/Palm_Warbler_0015_169626.jpg 19 | CUB_200_2011/images/174.Palm_Warbler/Palm_Warbler_0126_170311.jpg 20 | CUB_200_2011/images/174.Palm_Warbler/Palm_Warbler_0136_170276.jpg 21 | CUB_200_2011/images/175.Pine_Warbler/Pine_Warbler_0017_171678.jpg 22 | CUB_200_2011/images/175.Pine_Warbler/Pine_Warbler_0127_171742.jpg 23 | CUB_200_2011/images/175.Pine_Warbler/Pine_Warbler_0060_171635.jpg 24 | CUB_200_2011/images/175.Pine_Warbler/Pine_Warbler_0056_172064.jpg 25 | CUB_200_2011/images/175.Pine_Warbler/Pine_Warbler_0102_171147.jpg 26 | CUB_200_2011/images/176.Prairie_Warbler/Prairie_Warbler_0073_172771.jpg 27 | CUB_200_2011/images/176.Prairie_Warbler/Prairie_Warbler_0120_173097.jpg 28 | CUB_200_2011/images/176.Prairie_Warbler/Prairie_Warbler_0063_172682.jpg 29 | CUB_200_2011/images/176.Prairie_Warbler/Prairie_Warbler_0053_173290.jpg 30 | CUB_200_2011/images/176.Prairie_Warbler/Prairie_Warbler_0080_172724.jpg 31 | CUB_200_2011/images/177.Prothonotary_Warbler/Prothonotary_Warbler_0062_174412.jpg 32 | CUB_200_2011/images/177.Prothonotary_Warbler/Prothonotary_Warbler_0037_173418.jpg 33 | CUB_200_2011/images/177.Prothonotary_Warbler/Prothonotary_Warbler_0076_174118.jpg 34 | CUB_200_2011/images/177.Prothonotary_Warbler/Prothonotary_Warbler_0070_174650.jpg 35 | CUB_200_2011/images/177.Prothonotary_Warbler/Prothonotary_Warbler_0110_173857.jpg 36 | CUB_200_2011/images/178.Swainson_Warbler/Swainson_Warbler_0017_174685.jpg 37 | CUB_200_2011/images/178.Swainson_Warbler/Swainson_Warbler_0039_794859.jpg 38 | CUB_200_2011/images/178.Swainson_Warbler/Swainson_Warbler_0051_794900.jpg 39 | CUB_200_2011/images/178.Swainson_Warbler/Swainson_Warbler_0037_174691.jpg 40 | CUB_200_2011/images/178.Swainson_Warbler/Swainson_Warbler_0018_174715.jpg 41 | CUB_200_2011/images/179.Tennessee_Warbler/Tennessee_Warbler_0051_175015.jpg 42 | CUB_200_2011/images/179.Tennessee_Warbler/Tennessee_Warbler_0019_174786.jpg 43 | CUB_200_2011/images/179.Tennessee_Warbler/Tennessee_Warbler_0023_174977.jpg 44 | CUB_200_2011/images/179.Tennessee_Warbler/Tennessee_Warbler_0033_174772.jpg 45 | CUB_200_2011/images/179.Tennessee_Warbler/Tennessee_Warbler_0004_174997.jpg 46 | CUB_200_2011/images/180.Wilson_Warbler/Wilson_Warbler_0107_175320.jpg 47 | CUB_200_2011/images/180.Wilson_Warbler/Wilson_Warbler_0065_175924.jpg 48 | CUB_200_2011/images/180.Wilson_Warbler/Wilson_Warbler_0129_175256.jpg 49 | CUB_200_2011/images/180.Wilson_Warbler/Wilson_Warbler_0126_175368.jpg 50 | CUB_200_2011/images/180.Wilson_Warbler/Wilson_Warbler_0054_175285.jpg 51 | -------------------------------------------------------------------------------- /solo_learn/solo/utils/momentum.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | import math 21 | 22 | import torch 23 | from torch import nn 24 | 25 | 26 | @torch.no_grad() 27 | def initialize_momentum_params(online_net: nn.Module, momentum_net: nn.Module): 28 | """Copies the parameters of the online network to the momentum network. 29 | 30 | Args: 31 | online_net (nn.Module): online network (e.g. online backbone, online projection, etc...). 32 | momentum_net (nn.Module): momentum network (e.g. momentum backbone, 33 | momentum projection, etc...). 34 | """ 35 | 36 | params_online = online_net.parameters() 37 | params_momentum = momentum_net.parameters() 38 | for po, pm in zip(params_online, params_momentum): 39 | pm.data.copy_(po.data) 40 | pm.requires_grad = False 41 | 42 | 43 | class MomentumUpdater: 44 | def __init__(self, base_tau: float = 0.996, final_tau: float = 1.0): 45 | """Updates momentum parameters using exponential moving average. 46 | 47 | Args: 48 | base_tau (float, optional): base value of the weight decrease coefficient 49 | (should be in [0,1]). Defaults to 0.996. 50 | final_tau (float, optional): final value of the weight decrease coefficient 51 | (should be in [0,1]). Defaults to 1.0. 52 | """ 53 | 54 | super().__init__() 55 | 56 | assert 0 <= base_tau <= 1 57 | assert 0 <= final_tau <= 1 and base_tau <= final_tau 58 | 59 | self.base_tau = base_tau 60 | self.cur_tau = base_tau 61 | self.final_tau = final_tau 62 | 63 | @torch.no_grad() 64 | def update(self, online_net: nn.Module, momentum_net: nn.Module): 65 | """Performs the momentum update for each param group. 66 | 67 | Args: 68 | online_net (nn.Module): online network (e.g. online backbone, online projection, etc...). 69 | momentum_net (nn.Module): momentum network (e.g. momentum backbone, 70 | momentum projection, etc...). 71 | """ 72 | 73 | for op, mp in zip(online_net.parameters(), momentum_net.parameters()): 74 | mp.data = self.cur_tau * mp.data + (1 - self.cur_tau) * op.data 75 | 76 | def update_tau(self, cur_step: int, max_steps: int): 77 | """Computes the next value for the weighting decrease coefficient tau using cosine annealing. 78 | 79 | Args: 80 | cur_step (int): number of gradient steps so far. 81 | max_steps (int): overall number of gradient steps in the whole training. 82 | """ 83 | 84 | self.cur_tau = ( 85 | self.final_tau 86 | - (self.final_tau - self.base_tau) * (math.cos(math.pi * cur_step / max_steps) + 1) / 2 87 | ) 88 | -------------------------------------------------------------------------------- /solo_learn/datasets/fscil_data/index_list/cub200/session_4.txt: -------------------------------------------------------------------------------- 1 | CUB_200_2011/images/121.Grasshopper_Sparrow/Grasshopper_Sparrow_0014_116129.jpg 2 | CUB_200_2011/images/121.Grasshopper_Sparrow/Grasshopper_Sparrow_0114_116160.jpg 3 | CUB_200_2011/images/121.Grasshopper_Sparrow/Grasshopper_Sparrow_0068_115799.jpg 4 | CUB_200_2011/images/121.Grasshopper_Sparrow/Grasshopper_Sparrow_0110_115644.jpg 5 | CUB_200_2011/images/121.Grasshopper_Sparrow/Grasshopper_Sparrow_0042_115638.jpg 6 | CUB_200_2011/images/122.Harris_Sparrow/Harris_Sparrow_0006_116364.jpg 7 | CUB_200_2011/images/122.Harris_Sparrow/Harris_Sparrow_0018_116402.jpg 8 | CUB_200_2011/images/122.Harris_Sparrow/Harris_Sparrow_0026_116620.jpg 9 | CUB_200_2011/images/122.Harris_Sparrow/Harris_Sparrow_0020_116379.jpg 10 | CUB_200_2011/images/122.Harris_Sparrow/Harris_Sparrow_0011_116597.jpg 11 | CUB_200_2011/images/123.Henslow_Sparrow/Henslow_Sparrow_0023_796582.jpg 12 | CUB_200_2011/images/123.Henslow_Sparrow/Henslow_Sparrow_0052_796599.jpg 13 | CUB_200_2011/images/123.Henslow_Sparrow/Henslow_Sparrow_0054_116850.jpg 14 | CUB_200_2011/images/123.Henslow_Sparrow/Henslow_Sparrow_0064_796573.jpg 15 | CUB_200_2011/images/123.Henslow_Sparrow/Henslow_Sparrow_0070_796571.jpg 16 | CUB_200_2011/images/124.Le_Conte_Sparrow/Le_Conte_Sparrow_0040_117088.jpg 17 | CUB_200_2011/images/124.Le_Conte_Sparrow/Le_Conte_Sparrow_0072_795230.jpg 18 | CUB_200_2011/images/124.Le_Conte_Sparrow/Le_Conte_Sparrow_0068_795180.jpg 19 | CUB_200_2011/images/124.Le_Conte_Sparrow/Le_Conte_Sparrow_0081_795215.jpg 20 | CUB_200_2011/images/124.Le_Conte_Sparrow/Le_Conte_Sparrow_0032_795186.jpg 21 | CUB_200_2011/images/125.Lincoln_Sparrow/Lincoln_Sparrow_0084_117492.jpg 22 | CUB_200_2011/images/125.Lincoln_Sparrow/Lincoln_Sparrow_0009_117535.jpg 23 | CUB_200_2011/images/125.Lincoln_Sparrow/Lincoln_Sparrow_0014_117883.jpg 24 | CUB_200_2011/images/125.Lincoln_Sparrow/Lincoln_Sparrow_0042_117507.jpg 25 | CUB_200_2011/images/125.Lincoln_Sparrow/Lincoln_Sparrow_0072_117951.jpg 26 | CUB_200_2011/images/126.Nelson_Sharp_tailed_Sparrow/Nelson_Sharp_Tailed_Sparrow_0056_117974.jpg 27 | CUB_200_2011/images/126.Nelson_Sharp_tailed_Sparrow/Nelson_Sharp_Tailed_Sparrow_0002_796908.jpg 28 | CUB_200_2011/images/126.Nelson_Sharp_tailed_Sparrow/Nelson_Sharp_Tailed_Sparrow_0051_796902.jpg 29 | CUB_200_2011/images/126.Nelson_Sharp_tailed_Sparrow/Nelson_Sharp_Tailed_Sparrow_0014_796906.jpg 30 | CUB_200_2011/images/126.Nelson_Sharp_tailed_Sparrow/Nelson_Sharp_Tailed_Sparrow_0077_796913.jpg 31 | CUB_200_2011/images/127.Savannah_Sparrow/Savannah_Sparrow_0049_119596.jpg 32 | CUB_200_2011/images/127.Savannah_Sparrow/Savannah_Sparrow_0118_118603.jpg 33 | CUB_200_2011/images/127.Savannah_Sparrow/Savannah_Sparrow_0068_119972.jpg 34 | CUB_200_2011/images/127.Savannah_Sparrow/Savannah_Sparrow_0052_118583.jpg 35 | CUB_200_2011/images/127.Savannah_Sparrow/Savannah_Sparrow_0054_120057.jpg 36 | CUB_200_2011/images/128.Seaside_Sparrow/Seaside_Sparrow_0001_120720.jpg 37 | CUB_200_2011/images/128.Seaside_Sparrow/Seaside_Sparrow_0048_120758.jpg 38 | CUB_200_2011/images/128.Seaside_Sparrow/Seaside_Sparrow_0042_796528.jpg 39 | CUB_200_2011/images/128.Seaside_Sparrow/Seaside_Sparrow_0049_120735.jpg 40 | CUB_200_2011/images/128.Seaside_Sparrow/Seaside_Sparrow_0035_796533.jpg 41 | CUB_200_2011/images/129.Song_Sparrow/Song_Sparrow_0046_121903.jpg 42 | CUB_200_2011/images/129.Song_Sparrow/Song_Sparrow_0055_121158.jpg 43 | CUB_200_2011/images/129.Song_Sparrow/Song_Sparrow_0107_120990.jpg 44 | CUB_200_2011/images/129.Song_Sparrow/Song_Sparrow_0091_121651.jpg 45 | CUB_200_2011/images/129.Song_Sparrow/Song_Sparrow_0087_121062.jpg 46 | CUB_200_2011/images/130.Tree_Sparrow/Tree_Sparrow_0094_124974.jpg 47 | CUB_200_2011/images/130.Tree_Sparrow/Tree_Sparrow_0123_125324.jpg 48 | CUB_200_2011/images/130.Tree_Sparrow/Tree_Sparrow_0041_123497.jpg 49 | CUB_200_2011/images/130.Tree_Sparrow/Tree_Sparrow_0086_123751.jpg 50 | CUB_200_2011/images/130.Tree_Sparrow/Tree_Sparrow_0119_124114.jpg 51 | -------------------------------------------------------------------------------- /solo_learn/solo/utils/sinkhorn_knopp.py: -------------------------------------------------------------------------------- 1 | # Copyright 2023 solo-learn development team. 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | # this software and associated documentation files (the "Software"), to deal in 5 | # the Software without restriction, including without limitation the rights to use, 6 | # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the 7 | # Software, and to permit persons to whom the Software is furnished to do so, 8 | # subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in all copies 11 | # or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 14 | # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 15 | # PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 16 | # FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 17 | # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 18 | # DEALINGS IN THE SOFTWARE. 19 | 20 | # Adapted from https://github.com/facebookresearch/swav. 21 | 22 | import torch 23 | import torch.distributed as dist 24 | 25 | 26 | class SinkhornKnopp(torch.nn.Module): 27 | def __init__(self, num_iters: int = 3, epsilon: float = 0.05, world_size: int = 1): 28 | """Approximates optimal transport using the Sinkhorn-Knopp algorithm. 29 | 30 | A simple iterative method to approach the double stochastic matrix is to alternately rescale 31 | rows and columns of the matrix to sum to 1. 32 | 33 | Args: 34 | num_iters (int, optional): number of times to perform row and column normalization. 35 | Defaults to 3. 36 | epsilon (float, optional): weight for the entropy regularization term. Defaults to 0.05. 37 | world_size (int, optional): number of nodes for distributed training. Defaults to 1. 38 | """ 39 | 40 | super().__init__() 41 | self.num_iters = num_iters 42 | self.epsilon = epsilon 43 | self.world_size = world_size 44 | 45 | @torch.no_grad() 46 | def forward(self, Q: torch.Tensor) -> torch.Tensor: 47 | """Produces assignments using Sinkhorn-Knopp algorithm. 48 | 49 | Applies the entropy regularization, normalizes the Q matrix and then normalizes rows and 50 | columns in an alternating fashion for num_iter times. Before returning it normalizes again 51 | the columns in order for the output to be an assignment of samples to prototypes. 52 | 53 | Args: 54 | Q (torch.Tensor): cosine similarities between the features of the 55 | samples and the prototypes. 56 | 57 | Returns: 58 | torch.Tensor: assignment of samples to prototypes according to optimal transport. 59 | """ 60 | 61 | Q = torch.exp(Q / self.epsilon).t() 62 | B = Q.shape[1] * self.world_size 63 | K = Q.shape[0] # num prototypes 64 | 65 | # make the matrix sums to 1 66 | sum_Q = torch.sum(Q) 67 | if dist.is_available() and dist.is_initialized(): 68 | dist.all_reduce(sum_Q) 69 | Q /= sum_Q 70 | 71 | for _ in range(self.num_iters): 72 | # normalize each row: total weight per prototype must be 1/K 73 | sum_of_rows = torch.sum(Q, dim=1, keepdim=True) 74 | if dist.is_available() and dist.is_initialized(): 75 | dist.all_reduce(sum_of_rows) 76 | Q /= sum_of_rows 77 | Q /= K 78 | 79 | # normalize each column: total weight per sample must be 1/B 80 | Q /= torch.sum(Q, dim=0, keepdim=True) 81 | Q /= B 82 | 83 | Q *= B # the colomns must sum to 1 so that Q is an assignment 84 | return Q.t() 85 | -------------------------------------------------------------------------------- /data/index_list/cub200/session_8.txt: -------------------------------------------------------------------------------- 1 | CUB_200_2011/images/161.Blue_winged_Warbler/Blue_Winged_Warbler_0071_161900.jpg 2 | CUB_200_2011/images/161.Blue_winged_Warbler/Blue_Winged_Warbler_0035_161741.jpg 3 | CUB_200_2011/images/161.Blue_winged_Warbler/Blue_Winged_Warbler_0054_161862.jpg 4 | CUB_200_2011/images/161.Blue_winged_Warbler/Blue_Winged_Warbler_0023_161774.jpg 5 | CUB_200_2011/images/161.Blue_winged_Warbler/Blue_Winged_Warbler_0040_161883.jpg 6 | CUB_200_2011/images/162.Canada_Warbler/Canada_Warbler_0113_162403.jpg 7 | CUB_200_2011/images/162.Canada_Warbler/Canada_Warbler_0064_162417.jpg 8 | CUB_200_2011/images/162.Canada_Warbler/Canada_Warbler_0091_162378.jpg 9 | CUB_200_2011/images/162.Canada_Warbler/Canada_Warbler_0016_162411.jpg 10 | CUB_200_2011/images/162.Canada_Warbler/Canada_Warbler_0080_162392.jpg 11 | CUB_200_2011/images/163.Cape_May_Warbler/Cape_May_Warbler_0012_162701.jpg 12 | CUB_200_2011/images/163.Cape_May_Warbler/Cape_May_Warbler_0103_162972.jpg 13 | CUB_200_2011/images/163.Cape_May_Warbler/Cape_May_Warbler_0022_162912.jpg 14 | CUB_200_2011/images/163.Cape_May_Warbler/Cape_May_Warbler_0005_163197.jpg 15 | CUB_200_2011/images/163.Cape_May_Warbler/Cape_May_Warbler_0032_162659.jpg 16 | CUB_200_2011/images/164.Cerulean_Warbler/Cerulean_Warbler_0039_163420.jpg 17 | CUB_200_2011/images/164.Cerulean_Warbler/Cerulean_Warbler_0020_163353.jpg 18 | CUB_200_2011/images/164.Cerulean_Warbler/Cerulean_Warbler_0014_797226.jpg 19 | CUB_200_2011/images/164.Cerulean_Warbler/Cerulean_Warbler_0072_163200.jpg 20 | CUB_200_2011/images/164.Cerulean_Warbler/Cerulean_Warbler_0080_163399.jpg 21 | CUB_200_2011/images/165.Chestnut_sided_Warbler/Chestnut_Sided_Warbler_0128_163696.jpg 22 | CUB_200_2011/images/165.Chestnut_sided_Warbler/Chestnut_Sided_Warbler_0097_163750.jpg 23 | CUB_200_2011/images/165.Chestnut_sided_Warbler/Chestnut_Sided_Warbler_0094_164152.jpg 24 | CUB_200_2011/images/165.Chestnut_sided_Warbler/Chestnut_Sided_Warbler_0105_163996.jpg 25 | CUB_200_2011/images/165.Chestnut_sided_Warbler/Chestnut_Sided_Warbler_0101_164324.jpg 26 | CUB_200_2011/images/166.Golden_winged_Warbler/Golden_Winged_Warbler_0079_794820.jpg 27 | CUB_200_2011/images/166.Golden_winged_Warbler/Golden_Winged_Warbler_0046_794828.jpg 28 | CUB_200_2011/images/166.Golden_winged_Warbler/Golden_Winged_Warbler_0061_164516.jpg 29 | CUB_200_2011/images/166.Golden_winged_Warbler/Golden_Winged_Warbler_0068_794825.jpg 30 | CUB_200_2011/images/166.Golden_winged_Warbler/Golden_Winged_Warbler_0011_794812.jpg 31 | CUB_200_2011/images/167.Hooded_Warbler/Hooded_Warbler_0040_165173.jpg 32 | CUB_200_2011/images/167.Hooded_Warbler/Hooded_Warbler_0001_164704.jpg 33 | CUB_200_2011/images/167.Hooded_Warbler/Hooded_Warbler_0021_165057.jpg 34 | CUB_200_2011/images/167.Hooded_Warbler/Hooded_Warbler_0058_164674.jpg 35 | CUB_200_2011/images/167.Hooded_Warbler/Hooded_Warbler_0053_164631.jpg 36 | CUB_200_2011/images/168.Kentucky_Warbler/Kentucky_Warbler_0008_165369.jpg 37 | CUB_200_2011/images/168.Kentucky_Warbler/Kentucky_Warbler_0035_795878.jpg 38 | CUB_200_2011/images/168.Kentucky_Warbler/Kentucky_Warbler_0050_165278.jpg 39 | CUB_200_2011/images/168.Kentucky_Warbler/Kentucky_Warbler_0071_165342.jpg 40 | CUB_200_2011/images/168.Kentucky_Warbler/Kentucky_Warbler_0072_165305.jpg 41 | CUB_200_2011/images/169.Magnolia_Warbler/Magnolia_Warbler_0041_165709.jpg 42 | CUB_200_2011/images/169.Magnolia_Warbler/Magnolia_Warbler_0092_165807.jpg 43 | CUB_200_2011/images/169.Magnolia_Warbler/Magnolia_Warbler_0029_165567.jpg 44 | CUB_200_2011/images/169.Magnolia_Warbler/Magnolia_Warbler_0030_165782.jpg 45 | CUB_200_2011/images/169.Magnolia_Warbler/Magnolia_Warbler_0053_165682.jpg 46 | CUB_200_2011/images/170.Mourning_Warbler/Mourning_Warbler_0069_166559.jpg 47 | CUB_200_2011/images/170.Mourning_Warbler/Mourning_Warbler_0035_166586.jpg 48 | CUB_200_2011/images/170.Mourning_Warbler/Mourning_Warbler_0002_166520.jpg 49 | CUB_200_2011/images/170.Mourning_Warbler/Mourning_Warbler_0079_166564.jpg 50 | CUB_200_2011/images/170.Mourning_Warbler/Mourning_Warbler_0015_166535.jpg 51 | --------------------------------------------------------------------------------