├── CHANGELOG.md
├── semilearn
├── algorithms
│ ├── clss
│ │ ├── __init__.py
│ │ ├── ordinal_entropy.py
│ │ └── clss.py
│ ├── rda
│ │ ├── __init__.py
│ │ ├── utils.py
│ │ └── rda.py
│ ├── ucvme
│ │ └── __init__.py
│ ├── rankup
│ │ ├── __init__.py
│ │ └── rankup_net.py
│ ├── mixmatch
│ │ └── __init__.py
│ ├── pimodel
│ │ ├── __init__.py
│ │ └── pimodel.py
│ ├── rankuprda
│ │ ├── __init__.py
│ │ ├── rda.py
│ │ └── rankup_net.py
│ ├── meanteacher
│ │ ├── __init__.py
│ │ └── meanteacher.py
│ ├── utils
│ │ ├── __init__.py
│ │ ├── misc.py
│ │ └── ops.py
│ ├── fullysupervised
│ │ ├── __init__.py
│ │ └── fullysupervised.py
│ ├── hooks
│ │ ├── __init__.py
│ │ ├── pseudo_label.py
│ │ └── masking.py
│ └── __init__.py
├── core
│ ├── utils
│ │ ├── __init__.py
│ │ └── registry.py
│ ├── __init__.py
│ ├── criterions
│ │ ├── __init__.py
│ │ ├── cross_entropy.py
│ │ ├── consistency.py
│ │ └── cls_consistency.py
│ └── hooks
│ │ ├── __init__.py
│ │ ├── ema.py
│ │ ├── sampler_seed.py
│ │ ├── checkpoint.py
│ │ ├── timer.py
│ │ ├── hook.py
│ │ ├── param_update.py
│ │ ├── evaluation.py
│ │ ├── priority.py
│ │ ├── logging.py
│ │ ├── wandb.py
│ │ └── aim.py
├── nets
│ ├── bert
│ │ ├── __init__.py
│ │ └── bert.py
│ ├── resnet
│ │ └── __init__.py
│ ├── hubert
│ │ ├── __init__.py
│ │ └── hubert.py
│ ├── whisper
│ │ ├── __init__.py
│ │ └── whisper.py
│ ├── wave2vecv2
│ │ ├── __init__.py
│ │ └── wave2vecv2.py
│ ├── vit
│ │ └── __init__.py
│ ├── wrn
│ │ └── __init__.py
│ └── __init__.py
├── datasets
│ ├── samplers
│ │ ├── __init__.py
│ │ └── sampler.py
│ ├── audio_datasets
│ │ ├── augmentation
│ │ │ ├── __init__.py
│ │ │ ├── transforms.py
│ │ │ └── subsample.py
│ │ ├── __init__.py
│ │ ├── vcc2018.py
│ │ ├── get_dataset.py
│ │ └── datasetbase.py
│ ├── cv_datasets
│ │ ├── __init__.py
│ │ ├── augmentation
│ │ │ ├── __init__.py
│ │ │ └── transforms.py
│ │ ├── get_dataset.py
│ │ ├── utkface.py
│ │ └── datasetbase.py
│ ├── collactors
│ │ ├── __init__.py
│ │ ├── nlp_collactor.py
│ │ └── audio_collactor.py
│ ├── nlp_datasets
│ │ ├── __init__.py
│ │ ├── get_dataset.py
│ │ ├── datasetbase.py
│ │ ├── yelp_review.py
│ │ └── amazon_review.py
│ └── __init__.py
└── __init__.py
├── visualization
├── requirements.txt
└── plot_multi.py
├── requirements.txt
├── config
├── classic_cv
│ ├── fullysupervised
│ │ └── fullysupervised_utkface_s0.yaml
│ ├── supervised
│ │ ├── supervised_utkface_lb50_s0.yaml
│ │ ├── supervised_utkface_lb250_s0.yaml
│ │ └── supervised_utkface_lb2000_s0.yaml
│ ├── pimodel
│ │ ├── pimodel_utkface_lb50_s0.yaml
│ │ ├── pimodel_utkface_lb250_s0.yaml
│ │ └── pimodel_utkface_lb2000_s0.yaml
│ ├── rda
│ │ ├── rda_utkface_lb50_s0.yaml
│ │ ├── rda_utkface_lb250_s0.yaml
│ │ └── rda_utkface_lb2000_s0.yaml
│ ├── ucvme
│ │ ├── ucvme_utkface_lb50_s0.yaml
│ │ ├── ucvme_utkface_lb250_s0.yaml
│ │ └── ucvme_utkface_lb2000_s0.yaml
│ ├── meanteacher
│ │ ├── meanteacher_utkface_lb50_s0.yaml
│ │ ├── meanteacher_utkface_lb250_s0.yaml
│ │ └── meanteacher_utkface_lb2000_s0.yaml
│ ├── mixmatch
│ │ ├── mixmatch_utkface_lb50_s0.yaml
│ │ ├── mixmatch_utkface_lb250_s0.yaml
│ │ └── mixmatch_utkface_lb2000_s0.yaml
│ ├── clss
│ │ ├── clss_utkface_lb50_s0.yaml
│ │ ├── clss_utkface_lb2000_s0.yaml
│ │ └── clss_utkface_lb250_s0.yaml
│ ├── rankup
│ │ ├── rankup_utkface_lb50_s0.yaml
│ │ ├── rankup_utkface_lb2000_s0.yaml
│ │ └── rankup_utkface_lb250_s0.yaml
│ └── rankuprda
│ │ ├── rankuprda_utkface_lb50_s0.yaml
│ │ ├── rankuprda_utkface_lb2000_s0.yaml
│ │ └── rankuprda_utkface_lb250_s0.yaml
├── nlp
│ ├── fullysupervised
│ │ └── fullysupervised_yelp_review_s0.yaml
│ ├── supervised
│ │ └── supervised_yelp_review_lb250_s0.yaml
│ ├── pimodel
│ │ └── pimodel_yelp_review_lb250_s0.yaml
│ ├── rda
│ │ └── rda_yelp_review_lb250_s0.yaml
│ ├── ucvme
│ │ └── ucvme_yelp_review_lb250_s0.yaml
│ ├── meanteacher
│ │ └── meanteacher_yelp_review_lb250_s0.yaml
│ ├── clss
│ │ └── clss_yelp_review_lb250_s0.yaml
│ ├── mixmatch
│ │ └── mixmatch_yelp_review_lb250_s0.yaml
│ ├── rankup
│ │ └── rankup_yelp_review_lb250_s0.yaml
│ └── rankuprda
│ │ └── rankuprda_yelp_review_lb250_s0.yaml
└── audio
│ ├── fullysupervised
│ └── fullysupervised_bvcc_s0.yaml
│ ├── supervised
│ └── supervised_bvcc_lb250_s0.yaml
│ ├── pimodel
│ └── pimodel_bvcc_lb250_s0.yaml
│ ├── rda
│ └── rda_bvcc_lb250_s0.yaml
│ ├── ucvme
│ └── ucvme_bvcc_lb250_s0.yaml
│ ├── meanteacher
│ └── meanteacher_bvcc_lb250_s0.yaml
│ ├── mixmatch
│ └── mixmatch_bvcc_lb250_s0.yaml
│ ├── clss
│ └── clss_bvcc_lb250_s0.yaml
│ ├── rankup
│ └── rankup_bvcc_lb250_s0.yaml
│ └── rankuprda
│ └── rankuprda_bvcc_lb250_s0.yaml
├── results
├── audio_average_log.csv
├── nlp_average_log.csv
├── README.md
└── classic_cv_average_log.csv
├── LICENSE
└── .gitignore
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/semilearn/algorithms/clss/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) 2024 Pin-Yen Huang.
2 | # Licensed under the MIT License.
3 |
4 | from .clss import CLSS
5 |
--------------------------------------------------------------------------------
/semilearn/algorithms/rda/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Licensed under the MIT License.
3 |
4 | from .rda import RDA
5 |
--------------------------------------------------------------------------------
/visualization/requirements.txt:
--------------------------------------------------------------------------------
1 | matplotlib>=3.7.5
2 | numpy>=1.24.4
3 | pandas>=2.0.3
4 | umap-learn>=0.5.7
5 | plotly>=5.24.1
6 | seaborn>=0.13.2
--------------------------------------------------------------------------------
/semilearn/algorithms/ucvme/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) 2024 Pin-Yen Huang.
2 | # Licensed under the MIT License.
3 |
4 | from .ucvme import UCVME
5 |
--------------------------------------------------------------------------------
/semilearn/algorithms/rankup/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Licensed under the MIT License.
3 |
4 | from .rankup import RankUp
5 |
--------------------------------------------------------------------------------
/semilearn/algorithms/mixmatch/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Licensed under the MIT License.
3 |
4 | from .mixmatch import MixMatch
5 |
--------------------------------------------------------------------------------
/semilearn/algorithms/pimodel/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Licensed under the MIT License.
3 |
4 | from .pimodel import PiModel
5 |
--------------------------------------------------------------------------------
/semilearn/algorithms/rankuprda/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Licensed under the MIT License.
3 |
4 | from .rankuprda import RankUpRDA
5 |
--------------------------------------------------------------------------------
/semilearn/algorithms/meanteacher/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Licensed under the MIT License.
3 |
4 | from .meanteacher import MeanTeacher
5 |
--------------------------------------------------------------------------------
/semilearn/algorithms/utils/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Licensed under the MIT License.
3 |
4 | from .misc import *
5 | from .ops import *
6 |
--------------------------------------------------------------------------------
/semilearn/algorithms/fullysupervised/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Licensed under the MIT License.
3 |
4 | from .fullysupervised import FullySupervised
5 |
--------------------------------------------------------------------------------
/semilearn/core/utils/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Licensed under the MIT License.
3 |
4 |
5 | from .build import *
6 | from .misc import *
7 | from .registry import *
8 |
--------------------------------------------------------------------------------
/semilearn/nets/bert/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Modifications Copyright (c) 2024 Pin-Yen Huang.
3 | # Licensed under the MIT License.
4 |
5 | from .bert import bert_base
6 |
--------------------------------------------------------------------------------
/semilearn/nets/resnet/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Modifications Copyright (c) 2024 Pin-Yen Huang.
3 | # Licensed under the MIT License.
4 |
5 | from .resnet import resnet50
6 |
--------------------------------------------------------------------------------
/semilearn/nets/hubert/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Modifications Copyright (c) 2024 Pin-Yen Huang.
3 | # Licensed under the MIT License.
4 |
5 | from .hubert import hubert_base
6 |
--------------------------------------------------------------------------------
/semilearn/nets/whisper/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Modifications Copyright (c) 2024 Pin-Yen Huang.
3 | # Licensed under the MIT License.
4 |
5 | from .whisper import whisper_base
6 |
--------------------------------------------------------------------------------
/semilearn/nets/wave2vecv2/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Modifications Copyright (c) 2024 Pin-Yen Huang.
3 | # Licensed under the MIT License.
4 |
5 | from .wave2vecv2 import wave2vecv2_base
6 |
--------------------------------------------------------------------------------
/semilearn/algorithms/hooks/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Licensed under the MIT License.
3 |
4 | from .pseudo_label import PseudoLabelingHook
5 | from .masking import MaskingHook, FixedThresholdingHook
6 |
--------------------------------------------------------------------------------
/semilearn/datasets/samplers/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Modifications Copyright (c) 2024 Pin-Yen Huang.
3 | # Licensed under the MIT License.
4 |
5 | from .sampler import name2sampler, DistributedSampler
6 |
--------------------------------------------------------------------------------
/semilearn/datasets/audio_datasets/augmentation/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) 2024 Pin-Yen Huang.
2 | # Licensed under the MIT License.
3 |
4 | from .subsample import Subsample, RandomSubsample
5 | from .transforms import AudioTransforms
6 |
--------------------------------------------------------------------------------
/semilearn/datasets/cv_datasets/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Modifications Copyright (c) 2024 Pin-Yen Huang.
3 | # Licensed under the MIT License.
4 |
5 | from .get_dataset import get_cv_dataset
6 | from .utkface import UTKFACE
7 |
--------------------------------------------------------------------------------
/semilearn/nets/vit/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Licensed under the MIT License.
3 |
4 | from .vit import vit_tiny_patch2_32, vit_small_patch2_32, vit_small_patch16_224, vit_base_patch16_224, vit_base_patch16_96
5 | from .vit import VisionTransformer
6 |
--------------------------------------------------------------------------------
/semilearn/nets/wrn/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Modifications Copyright (c) 2024 Pin-Yen Huang.
3 | # Licensed under the MIT License.
4 |
5 | from .wrn import wrn_28_2, wrn_28_8
6 | from .wrn_var import wrn_var_37_2
7 | from .wrn import WideResNet
8 |
--------------------------------------------------------------------------------
/semilearn/datasets/audio_datasets/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Modifications Copyright (c) 2024 Pin-Yen Huang.
3 | # Licensed under the MIT License.
4 |
5 | from .get_dataset import get_audio_dataset
6 | from .bvcc import BVCC
7 | from .vcc2018 import VCC2018
8 |
--------------------------------------------------------------------------------
/semilearn/datasets/collactors/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Licensed under the MIT License.
3 |
4 | from .nlp_collactor import get_bert_base_collactor
5 | from .audio_collactor import get_wave2vecv2_base_collactor, get_hubert_base_collactor, get_whisper_base_collactor
6 |
--------------------------------------------------------------------------------
/semilearn/core/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Modifications Copyright (c) 2024 Pin-Yen Huang.
3 | # Licensed under the MIT License.
4 |
5 | from .algorithmbase import AlgorithmBase
6 | from .utils.registry import import_all_modules_for_register
7 |
8 | import_all_modules_for_register()
9 |
--------------------------------------------------------------------------------
/semilearn/datasets/nlp_datasets/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Modifications Copyright (c) 2024 Pin-Yen Huang.
3 | # Licensed under the MIT License.
4 |
5 | from .get_dataset import get_nlp_dataset
6 | from .yelp_review import YELP_REVIEW
7 | from .amazon_review import AMAZON_REVIEW
8 |
--------------------------------------------------------------------------------
/semilearn/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Licensed under the MIT License.
3 |
4 | from .core.utils import get_dataset, get_data_loader, get_net_builder
5 | from .algorithms import get_algorithm
6 | from .datasets import split_ssl_data
7 | from .datasets.cv_datasets.datasetbase import BasicDataset
8 |
--------------------------------------------------------------------------------
/semilearn/datasets/cv_datasets/augmentation/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Modifications Copyright (c) 2024 Pin-Yen Huang.
3 | # Licensed under the MIT License.
4 |
5 | from .randaugment import RandAugment
6 | from .transforms import get_val_transforms, get_weak_transforms, get_strong_transforms
7 |
--------------------------------------------------------------------------------
/semilearn/core/criterions/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Modifications Copyright (c) 2024 Pin-Yen Huang.
3 | # Licensed under the MIT License.
4 |
5 | from .cross_entropy import ce_loss, CELoss
6 | from .cls_consistency import cls_consistency_loss, ClsConsistencyLoss
7 | from .consistency import consistency_loss, ConsistencyLoss
8 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | audiomentations[extras]>=0.37.0
2 | librosa>=0.10.1
3 | matplotlib>=3.7.5
4 | numpy>=1.24.4
5 | pandas>=2.0.3
6 | Pillow>=10.4.0
7 | progress>=1.6
8 | ruamel.yaml>=0.18.6
9 | ruamel.yaml.clib>=0.2.8
10 | scikit-image>=0.21.0
11 | scikit-learn>=1.3.2
12 | scipy>=1.10.1
13 | tensorboard>=2.14.0
14 | timm>=1.0.11
15 | torch>=2.4.0
16 | torchaudio>=2.4.0
17 | torchvision>=0.19.0
18 | tqdm>=4.66.5
19 | transformers>=4.46.0
20 | wandb
21 | wget
22 | aim
23 |
--------------------------------------------------------------------------------
/semilearn/datasets/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Modifications Copyright (c) 2024 Pin-Yen Huang.
3 | # Licensed under the MIT License.
4 |
5 | from semilearn.datasets.utils import split_ssl_data, get_collactor
6 | from semilearn.datasets.cv_datasets import get_cv_dataset
7 | from semilearn.datasets.nlp_datasets import get_nlp_dataset
8 | from semilearn.datasets.audio_datasets import get_audio_dataset
9 | from semilearn.datasets.samplers import name2sampler, DistributedSampler
10 |
--------------------------------------------------------------------------------
/semilearn/nets/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Modifications Copyright (c) 2024 Pin-Yen Huang.
3 | # Licensed under the MIT License.
4 |
5 | from .resnet import resnet50
6 | from .wrn import wrn_28_2, wrn_28_8, wrn_var_37_2
7 | from .vit import vit_base_patch16_224, vit_small_patch16_224, vit_small_patch2_32, vit_tiny_patch2_32, vit_base_patch16_96
8 | from .bert import bert_base
9 | from .wave2vecv2 import wave2vecv2_base
10 | from .hubert import hubert_base
11 | from .whisper import whisper_base
12 |
--------------------------------------------------------------------------------
/semilearn/core/hooks/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Licensed under the MIT License.
3 |
4 | from .hook import Hook
5 | from .checkpoint import CheckpointHook
6 | from .evaluation import EvaluationHook
7 | from .logging import LoggingHook
8 | from .param_update import ParamUpdateHook
9 | from .priority import Priority, get_priority
10 | from .sampler_seed import DistSamplerSeedHook
11 | from .timer import TimerHook
12 | from .ema import EMAHook
13 | from .wandb import WANDBHook
14 | from .aim import AimHook
15 |
--------------------------------------------------------------------------------
/semilearn/algorithms/__init__.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Licensed under the MIT License.
3 |
4 | from semilearn.core.utils import ALGORITHMS
5 |
6 | name2alg = ALGORITHMS
7 |
8 |
9 | def get_algorithm(args, net_builder, tb_log, logger):
10 | if args.algorithm in ALGORITHMS:
11 | alg = ALGORITHMS[args.algorithm](args=args, net_builder=net_builder, tb_log=tb_log, logger=logger) # name2alg[args.algorithm](
12 | return alg
13 | else:
14 | raise KeyError(f"Unknown algorithm: {str(args.algorithm)}")
15 |
--------------------------------------------------------------------------------
/semilearn/core/hooks/ema.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Licensed under the MIT License.
3 |
4 | from .hook import Hook
5 | from semilearn.core.utils import EMA
6 |
7 |
8 | class EMAHook(Hook):
9 | """
10 | EMA model Hook for updating ema version of the model
11 | """
12 |
13 | def before_run(self, algorithm):
14 | algorithm.ema = EMA(algorithm.model, algorithm.ema_m)
15 | algorithm.ema.register()
16 | if algorithm.resume == True:
17 | algorithm.ema.load(algorithm.ema_model)
18 |
19 | def after_train_step(self, algorithm):
20 | if algorithm.ema is not None:
21 | algorithm.ema.update()
22 | algorithm.ema_model.load_state_dict(algorithm.model.state_dict())
23 | algorithm.ema_model.load_state_dict(algorithm.ema.shadow, strict=False)
24 |
--------------------------------------------------------------------------------
/semilearn/core/hooks/sampler_seed.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Licensed under the MIT License.
3 | # Ref: https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/sampler_seed.py
4 |
5 | from torch.utils.data import DataLoader
6 |
7 | from .hook import Hook
8 | from semilearn.datasets import DistributedSampler
9 |
10 |
11 | class DistSamplerSeedHook(Hook):
12 | """
13 | Distributed sampler seed Hook
14 |
15 | update the samples' epoch in data loader
16 | """
17 |
18 | def before_train_epoch(self, algorithm):
19 | for name, dataloader in algorithm.loader_dict.items():
20 | if not isinstance(dataloader, DataLoader):
21 | continue
22 |
23 | if isinstance(dataloader.sampler, DistributedSampler):
24 | algorithm.loader_dict[name].sampler.set_epoch(algorithm.epoch)
25 |
--------------------------------------------------------------------------------
/semilearn/algorithms/utils/misc.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Modifications Copyright (c) 2024 Pin-Yen Huang.
3 | # Licensed under the MIT License.
4 |
5 | import argparse
6 |
7 |
8 | class SSL_Argument(object):
9 | """
10 | Algorithm specific argument
11 | """
12 |
13 | def __init__(self, name, type, default, help=""):
14 | """
15 | Model specific arguments should be added via this class.
16 | """
17 | self.name = name
18 | self.type = type
19 | self.default = default
20 | self.help = help
21 |
22 |
23 | def str2bool(v):
24 | """
25 | str to bool
26 | """
27 | if isinstance(v, bool):
28 | return v
29 | if v.lower() in ("yes", "true", "t", "y", "1"):
30 | return True
31 | elif v.lower() in ("no", "false", "f", "n", "0"):
32 | return False
33 | else:
34 | raise argparse.ArgumentTypeError("Boolean value expected.")
35 |
--------------------------------------------------------------------------------
/semilearn/core/hooks/checkpoint.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Licensed under the MIT License.
3 | # Ref: https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/checkpoint.py
4 |
5 | import os
6 |
7 | from .hook import Hook
8 |
9 |
10 | class CheckpointHook(Hook):
11 | """
12 | Checkpoint Hook for saving checkpoint
13 | """
14 |
15 | def after_train_step(self, algorithm):
16 | # must be called after evaluation for saving the best
17 | if self.every_n_iters(algorithm, algorithm.num_eval_iter) or self.is_last_iter(algorithm):
18 | save_path = os.path.join(algorithm.save_dir, algorithm.save_name)
19 |
20 | if (not algorithm.distributed) or (algorithm.distributed and algorithm.rank % algorithm.ngpus_per_node == 0):
21 | algorithm.save_model("latest_model.pth", save_path)
22 |
23 | if algorithm.it == algorithm.best_it:
24 | algorithm.save_model("model_best.pth", save_path)
25 |
--------------------------------------------------------------------------------
/semilearn/core/hooks/timer.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Licensed under the MIT License.
3 |
4 | import torch
5 |
6 | from .hook import Hook
7 |
8 |
9 | class TimerHook(Hook):
10 | """
11 | Timer Hook
12 | """
13 |
14 | def before_run(self, algorithm):
15 | algorithm.start_batch = torch.cuda.Event(enable_timing=True)
16 | algorithm.end_batch = torch.cuda.Event(enable_timing=True)
17 |
18 | algorithm.start_run = torch.cuda.Event(enable_timing=True)
19 | algorithm.end_run = torch.cuda.Event(enable_timing=True)
20 | algorithm.start_batch.record()
21 |
22 | def before_train_step(self, algorithm):
23 | algorithm.end_batch.record()
24 |
25 | def after_train_step(self, algorithm):
26 | algorithm.log_dict["lr"] = algorithm.optimizer.param_groups[-1]["lr"]
27 | algorithm.log_dict["train/prefetch_time"] = algorithm.start_batch.elapsed_time(algorithm.end_batch) / 1000.0
28 | algorithm.start_batch.record()
29 |
--------------------------------------------------------------------------------
/config/classic_cv/fullysupervised/fullysupervised_utkface_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: fullysupervised
2 | save_dir: ./saved_models/classic_cv
3 | save_name: fullysupervised_utkface_s0
4 | resume: True
5 | load_path: ./saved_models/classic_cv/fullysupervised_utkface_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 256
11 | num_train_iter: 262144
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | batch_size: 32
15 | eval_batch_size: 256
16 | ema_m: 0.999
17 | optim: SGD
18 | lr: 0.01
19 | momentum: 0.9
20 | weight_decay: 0.001
21 | layer_decay: 1.0
22 | amp: False
23 | clip_grad: 0.0
24 | use_cat: True
25 | criterion: l1
26 | net: wrn_28_2
27 | net_from_name: False
28 | data_dir: ./data
29 | dataset: utkface
30 | train_sampler: RandomSampler
31 | num_workers: 4
32 | crop_ratio: 0.875
33 | img_size: 40
34 | preload: False
35 | seed: 0
36 | world_size: 1
37 | rank: 0
38 | multiprocessing_distributed: False
39 | dist_url: tcp://127.0.0.1:10003
40 | dist_backend: nccl
41 |
--------------------------------------------------------------------------------
/config/classic_cv/supervised/supervised_utkface_lb50_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: supervised
2 | save_dir: ./saved_models/classic_cv
3 | save_name: supervised_utkface_lb50_s0
4 | resume: True
5 | load_path: ./saved_models/classic_cv/supervised_utkface_lb50_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 256
11 | num_train_iter: 262144
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_labels: 50
15 | batch_size: 32
16 | eval_batch_size: 256
17 | ema_m: 0.999
18 | optim: SGD
19 | lr: 0.01
20 | momentum: 0.9
21 | weight_decay: 0.001
22 | layer_decay: 1.0
23 | amp: False
24 | clip_grad: 0.0
25 | use_cat: True
26 | criterion: l1
27 | net: wrn_28_2
28 | net_from_name: False
29 | data_dir: ./data
30 | dataset: utkface
31 | train_sampler: RandomSampler
32 | num_workers: 4
33 | crop_ratio: 0.875
34 | img_size: 40
35 | preload: False
36 | seed: 0
37 | world_size: 1
38 | rank: 0
39 | multiprocessing_distributed: False
40 | dist_url: tcp://127.0.0.1:10001
41 | dist_backend: nccl
42 |
--------------------------------------------------------------------------------
/config/classic_cv/supervised/supervised_utkface_lb250_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: supervised
2 | save_dir: ./saved_models/classic_cv
3 | save_name: supervised_utkface_lb250_s0
4 | resume: True
5 | load_path: ./saved_models/classic_cv/supervised_utkface_lb250_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 256
11 | num_train_iter: 262144
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_labels: 250
15 | batch_size: 32
16 | eval_batch_size: 256
17 | ema_m: 0.999
18 | optim: SGD
19 | lr: 0.01
20 | momentum: 0.9
21 | weight_decay: 0.001
22 | layer_decay: 1.0
23 | amp: False
24 | clip_grad: 0.0
25 | use_cat: True
26 | criterion: l1
27 | net: wrn_28_2
28 | net_from_name: False
29 | data_dir: ./data
30 | dataset: utkface
31 | train_sampler: RandomSampler
32 | num_workers: 4
33 | crop_ratio: 0.875
34 | img_size: 40
35 | preload: False
36 | seed: 0
37 | world_size: 1
38 | rank: 0
39 | multiprocessing_distributed: False
40 | dist_url: tcp://127.0.0.1:10002
41 | dist_backend: nccl
42 |
--------------------------------------------------------------------------------
/config/classic_cv/supervised/supervised_utkface_lb2000_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: supervised
2 | save_dir: ./saved_models/classic_cv
3 | save_name: supervised_utkface_lb2000_s0
4 | resume: True
5 | load_path: ./saved_models/classic_cv/supervised_utkface_lb2000_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 256
11 | num_train_iter: 262144
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_labels: 2000
15 | batch_size: 32
16 | eval_batch_size: 256
17 | ema_m: 0.999
18 | optim: SGD
19 | lr: 0.01
20 | momentum: 0.9
21 | weight_decay: 0.001
22 | layer_decay: 1.0
23 | amp: False
24 | clip_grad: 0.0
25 | use_cat: True
26 | criterion: l1
27 | net: wrn_28_2
28 | net_from_name: False
29 | data_dir: ./data
30 | dataset: utkface
31 | train_sampler: RandomSampler
32 | num_workers: 4
33 | crop_ratio: 0.875
34 | img_size: 40
35 | preload: False
36 | seed: 0
37 | world_size: 1
38 | rank: 0
39 | multiprocessing_distributed: False
40 | dist_url: tcp://127.0.0.1:10003
41 | dist_backend: nccl
42 |
--------------------------------------------------------------------------------
/config/classic_cv/pimodel/pimodel_utkface_lb50_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: pimodel
2 | save_dir: ./saved_models/classic_cv
3 | save_name: pimodel_utkface_lb50_s0
4 | resume: True
5 | load_path: ./saved_models/classic_cv/pimodel_utkface_lb50_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 256
11 | num_train_iter: 262144
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_labels: 50
15 | batch_size: 32
16 | eval_batch_size: 256
17 | ema_m: 0.999
18 | uratio: 1
19 | ulb_loss_ratio: 0.1
20 | unsup_warm_up: 0.4
21 | optim: SGD
22 | lr: 0.01
23 | momentum: 0.9
24 | weight_decay: 0.001
25 | layer_decay: 1.0
26 | amp: False
27 | clip_grad: 0.0
28 | use_cat: True
29 | criterion: l1
30 | net: wrn_28_2
31 | net_from_name: False
32 | data_dir: ./data
33 | dataset: utkface
34 | train_sampler: RandomSampler
35 | num_workers: 4
36 | crop_ratio: 0.875
37 | img_size: 40
38 | preload: False
39 | seed: 0
40 | world_size: 1
41 | rank: 0
42 | multiprocessing_distributed: False
43 | dist_url: tcp://127.0.0.1:10001
44 | dist_backend: nccl
45 |
--------------------------------------------------------------------------------
/config/classic_cv/pimodel/pimodel_utkface_lb250_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: pimodel
2 | save_dir: ./saved_models/classic_cv
3 | save_name: pimodel_utkface_lb250_s0
4 | resume: True
5 | load_path: ./saved_models/classic_cv/pimodel_utkface_lb250_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 256
11 | num_train_iter: 262144
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_labels: 250
15 | batch_size: 32
16 | eval_batch_size: 256
17 | ema_m: 0.999
18 | uratio: 1
19 | ulb_loss_ratio: 0.1
20 | unsup_warm_up: 0.4
21 | optim: SGD
22 | lr: 0.01
23 | momentum: 0.9
24 | weight_decay: 0.001
25 | layer_decay: 1.0
26 | amp: False
27 | clip_grad: 0.0
28 | use_cat: True
29 | criterion: l1
30 | net: wrn_28_2
31 | net_from_name: False
32 | data_dir: ./data
33 | dataset: utkface
34 | train_sampler: RandomSampler
35 | num_workers: 4
36 | crop_ratio: 0.875
37 | img_size: 40
38 | preload: False
39 | seed: 0
40 | world_size: 1
41 | rank: 0
42 | multiprocessing_distributed: False
43 | dist_url: tcp://127.0.0.1:10002
44 | dist_backend: nccl
45 |
--------------------------------------------------------------------------------
/config/nlp/fullysupervised/fullysupervised_yelp_review_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: fullysupervised
2 | save_dir: ./saved_models/nlp
3 | save_name: fullysupervised_yelp_review_s0
4 | resume: True
5 | load_path: ./saved_models/nlp/fullysupervised_yelp_review_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 100
11 | num_train_iter: 102400
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_warmup_iter: 5120
15 | batch_size: 8
16 | eval_batch_size: 8
17 | ema_m: 0.0
18 | optim: AdamW
19 | lr: 1e-05
20 | momentum: 0.9
21 | weight_decay: 0.0005
22 | layer_decay: 0.75
23 | amp: False
24 | clip_grad: 0.0
25 | use_cat: False
26 | criterion: l1
27 | net: bert_base
28 | net_from_name: False
29 | use_pretrain: True
30 | pretrain_path: google/bert_uncased_L-4_H-512_A-8
31 | data_dir: ./data
32 | dataset: yelp_review
33 | train_sampler: RandomSampler
34 | num_workers: 4
35 | max_length: 512
36 | seed: 0
37 | world_size: 1
38 | rank: 0
39 | multiprocessing_distributed: False
40 | dist_url: tcp://127.0.0.1:10001
41 | dist_backend: nccl
42 |
--------------------------------------------------------------------------------
/results/audio_average_log.csv:
--------------------------------------------------------------------------------
1 | exp_name,num_exp,min_MAE,min_MSE,max_R2,max_LCC,max_SRCC,max_KTAU,min_GMAE
2 | clss_bvcc_lb250,3,0.499±0.010,0.385±0.022,0.534±0.027,0.747±0.012,0.748±0.008,0.559±0.009,0.329±0.002
3 | fullysupervised_bvcc,3,0.351±0.003,0.195±0.002,0.764±0.002,0.876±0.001,0.874±0.001,0.698±0.001,0.227±0.004
4 | meanteacher_bvcc_lb250,3,0.532±0.006,0.419±0.014,0.492±0.018,0.735±0.008,0.742±0.008,0.550±0.008,0.362±0.002
5 | mixmatch_bvcc_lb250,3,0.597±0.017,0.535±0.036,0.353±0.044,0.614±0.029,0.626±0.031,0.446±0.026,0.401±0.011
6 | pimodel_bvcc_lb250,3,0.534±0.008,0.422±0.017,0.489±0.021,0.734±0.009,0.740±0.009,0.549±0.009,0.360±0.003
7 | rankuprda_bvcc_lb250,3,0.463±0.013,0.332±0.023,0.598±0.027,0.781±0.011,0.783±0.011,0.591±0.012,0.305±0.007
8 | rankup_bvcc_lb250,3,0.470±0.012,0.340±0.023,0.588±0.028,0.774±0.012,0.776±0.010,0.584±0.010,0.312±0.011
9 | supervised_bvcc_lb250,3,0.533±0.006,0.421±0.014,0.490±0.018,0.734±0.008,0.741±0.009,0.549±0.009,0.362±0.001
10 | ucvme_bvcc_lb250,3,0.498±0.003,0.370±0.009,0.553±0.011,0.770±0.010,0.774±0.008,0.582±0.009,0.333±0.003
11 |
--------------------------------------------------------------------------------
/config/classic_cv/pimodel/pimodel_utkface_lb2000_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: pimodel
2 | save_dir: ./saved_models/classic_cv
3 | save_name: pimodel_utkface_lb2000_s0
4 | resume: True
5 | load_path: ./saved_models/classic_cv/pimodel_utkface_lb2000_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 256
11 | num_train_iter: 262144
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_labels: 2000
15 | batch_size: 32
16 | eval_batch_size: 256
17 | ema_m: 0.999
18 | uratio: 1
19 | ulb_loss_ratio: 0.1
20 | unsup_warm_up: 0.4
21 | optim: SGD
22 | lr: 0.01
23 | momentum: 0.9
24 | weight_decay: 0.001
25 | layer_decay: 1.0
26 | amp: False
27 | clip_grad: 0.0
28 | use_cat: True
29 | criterion: l1
30 | net: wrn_28_2
31 | net_from_name: False
32 | data_dir: ./data
33 | dataset: utkface
34 | train_sampler: RandomSampler
35 | num_workers: 4
36 | crop_ratio: 0.875
37 | img_size: 40
38 | preload: False
39 | seed: 0
40 | world_size: 1
41 | rank: 0
42 | multiprocessing_distributed: False
43 | dist_url: tcp://127.0.0.1:10003
44 | dist_backend: nccl
45 |
--------------------------------------------------------------------------------
/config/classic_cv/rda/rda_utkface_lb50_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: rda
2 | save_dir: ./saved_models/classic_cv
3 | save_name: rda_utkface_lb50_s0
4 | resume: True
5 | load_path: ./saved_models/classic_cv/rda_utkface_lb50_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 256
11 | num_train_iter: 262144
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_labels: 50
15 | batch_size: 32
16 | eval_batch_size: 256
17 | ema_m: 0.999
18 | uratio: 7
19 | ulb_loss_ratio: 1.0
20 | unsup_warm_up: 0.4
21 | rda_num_refine_iter: 1024
22 | optim: SGD
23 | lr: 0.01
24 | momentum: 0.9
25 | weight_decay: 0.001
26 | layer_decay: 1.0
27 | amp: False
28 | clip_grad: 0.0
29 | use_cat: True
30 | criterion: l1
31 | net: wrn_28_2
32 | net_from_name: False
33 | data_dir: ./data
34 | dataset: utkface
35 | train_sampler: RandomSampler
36 | num_workers: 4
37 | crop_ratio: 0.875
38 | img_size: 40
39 | preload: False
40 | seed: 0
41 | world_size: 1
42 | rank: 0
43 | multiprocessing_distributed: False
44 | dist_url: tcp://127.0.0.1:10001
45 | dist_backend: nccl
46 |
--------------------------------------------------------------------------------
/config/classic_cv/ucvme/ucvme_utkface_lb50_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: ucvme
2 | save_dir: ./saved_models/classic_cv
3 | save_name: ucvme_utkface_lb50_s0
4 | resume: True
5 | load_path: ./saved_models/classic_cv/ucvme_utkface_lb50_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 256
11 | num_train_iter: 262144
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_labels: 50
15 | batch_size: 32
16 | eval_batch_size: 256
17 | ema_m: 0.999
18 | uratio: 1
19 | ulb_loss_ratio: 0.05
20 | dropout_rate: 0.05
21 | num_ensemble: 5
22 | optim: SGD
23 | lr: 0.01
24 | momentum: 0.9
25 | weight_decay: 0.001
26 | layer_decay: 1.0
27 | amp: False
28 | clip_grad: 0.0
29 | use_cat: True
30 | criterion: l1
31 | net: wrn_28_2
32 | net_from_name: False
33 | data_dir: ./data
34 | dataset: utkface
35 | train_sampler: RandomSampler
36 | num_workers: 4
37 | crop_ratio: 0.875
38 | img_size: 40
39 | preload: False
40 | seed: 0
41 | world_size: 1
42 | rank: 0
43 | multiprocessing_distributed: False
44 | dist_url: tcp://127.0.0.1:10001
45 | dist_backend: nccl
46 |
--------------------------------------------------------------------------------
/config/classic_cv/rda/rda_utkface_lb250_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: rda
2 | save_dir: ./saved_models/classic_cv
3 | save_name: rda_utkface_lb250_s0
4 | resume: True
5 | load_path: ./saved_models/classic_cv/rda_utkface_lb250_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 256
11 | num_train_iter: 262144
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_labels: 250
15 | batch_size: 32
16 | eval_batch_size: 256
17 | ema_m: 0.999
18 | uratio: 7
19 | ulb_loss_ratio: 1.0
20 | unsup_warm_up: 0.4
21 | rda_num_refine_iter: 1024
22 | optim: SGD
23 | lr: 0.01
24 | momentum: 0.9
25 | weight_decay: 0.001
26 | layer_decay: 1.0
27 | amp: False
28 | clip_grad: 0.0
29 | use_cat: True
30 | criterion: l1
31 | net: wrn_28_2
32 | net_from_name: False
33 | data_dir: ./data
34 | dataset: utkface
35 | train_sampler: RandomSampler
36 | num_workers: 4
37 | crop_ratio: 0.875
38 | img_size: 40
39 | preload: False
40 | seed: 0
41 | world_size: 1
42 | rank: 0
43 | multiprocessing_distributed: False
44 | dist_url: tcp://127.0.0.1:10002
45 | dist_backend: nccl
46 |
--------------------------------------------------------------------------------
/config/classic_cv/ucvme/ucvme_utkface_lb250_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: ucvme
2 | save_dir: ./saved_models/classic_cv
3 | save_name: ucvme_utkface_lb250_s0
4 | resume: True
5 | load_path: ./saved_models/classic_cv/ucvme_utkface_lb250_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 256
11 | num_train_iter: 262144
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_labels: 250
15 | batch_size: 32
16 | eval_batch_size: 256
17 | ema_m: 0.999
18 | uratio: 1
19 | ulb_loss_ratio: 0.05
20 | dropout_rate: 0.05
21 | num_ensemble: 5
22 | optim: SGD
23 | lr: 0.01
24 | momentum: 0.9
25 | weight_decay: 0.001
26 | layer_decay: 1.0
27 | amp: False
28 | clip_grad: 0.0
29 | use_cat: True
30 | criterion: l1
31 | net: wrn_28_2
32 | net_from_name: False
33 | data_dir: ./data
34 | dataset: utkface
35 | train_sampler: RandomSampler
36 | num_workers: 4
37 | crop_ratio: 0.875
38 | img_size: 40
39 | preload: False
40 | seed: 0
41 | world_size: 1
42 | rank: 0
43 | multiprocessing_distributed: False
44 | dist_url: tcp://127.0.0.1:10002
45 | dist_backend: nccl
46 |
--------------------------------------------------------------------------------
/config/nlp/supervised/supervised_yelp_review_lb250_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: supervised
2 | save_dir: ./saved_models/nlp
3 | save_name: supervised_yelp_review_lb250_s0
4 | resume: True
5 | load_path: ./saved_models/nlp/supervised_yelp_review_lb250_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 100
11 | num_train_iter: 102400
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_warmup_iter: 5120
15 | num_labels: 250
16 | batch_size: 8
17 | eval_batch_size: 8
18 | ema_m: 0.0
19 | optim: AdamW
20 | lr: 1e-05
21 | momentum: 0.9
22 | weight_decay: 0.0005
23 | layer_decay: 0.75
24 | amp: False
25 | clip_grad: 0.0
26 | use_cat: False
27 | criterion: l1
28 | net: bert_base
29 | net_from_name: False
30 | use_pretrain: True
31 | pretrain_path: google/bert_uncased_L-4_H-512_A-8
32 | data_dir: ./data
33 | dataset: yelp_review
34 | train_sampler: RandomSampler
35 | num_workers: 4
36 | max_length: 512
37 | seed: 0
38 | world_size: 1
39 | rank: 0
40 | multiprocessing_distributed: False
41 | dist_url: tcp://127.0.0.1:10001
42 | dist_backend: nccl
43 |
--------------------------------------------------------------------------------
/config/audio/fullysupervised/fullysupervised_bvcc_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: fullysupervised
2 | save_dir: ./saved_models/audio
3 | save_name: fullysupervised_bvcc_s0
4 | resume: True
5 | load_path: ./saved_models/audio/fullysupervised_bvcc_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 100
11 | num_train_iter: 102400
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_warmup_iter: 5120
15 | batch_size: 8
16 | eval_batch_size: 16
17 | ema_m: 0.0
18 | optim: AdamW
19 | lr: 2e-06
20 | momentum: 0.9
21 | weight_decay: 2e-05
22 | layer_decay: 0.75
23 | amp: False
24 | clip_grad: 0.0
25 | use_cat: False
26 | criterion: l1
27 | net: whisper_base
28 | net_from_name: False
29 | use_pretrain: True
30 | pretrain_path: openai/whisper-base
31 | data_dir: ./data
32 | dataset: bvcc
33 | train_sampler: RandomSampler
34 | num_workers: 8
35 | max_length_seconds: 6.0
36 | sample_rate: 16000
37 | preload: True
38 | seed: 0
39 | world_size: 1
40 | rank: 0
41 | multiprocessing_distributed: False
42 | dist_url: tcp://127.0.0.1:10001
43 | dist_backend: nccl
44 |
--------------------------------------------------------------------------------
/config/classic_cv/meanteacher/meanteacher_utkface_lb50_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: meanteacher
2 | save_dir: ./saved_models/classic_cv
3 | save_name: meanteacher_utkface_lb50_s0
4 | resume: True
5 | load_path: ./saved_models/classic_cv/meanteacher_utkface_lb50_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 256
11 | num_train_iter: 262144
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_labels: 50
15 | batch_size: 32
16 | eval_batch_size: 256
17 | ema_m: 0.999
18 | uratio: 1
19 | ulb_loss_ratio: 0.1
20 | unsup_warm_up: 0.4
21 | optim: SGD
22 | lr: 0.01
23 | momentum: 0.9
24 | weight_decay: 0.001
25 | layer_decay: 1.0
26 | amp: False
27 | clip_grad: 0.0
28 | use_cat: True
29 | criterion: l1
30 | net: wrn_28_2
31 | net_from_name: False
32 | data_dir: ./data
33 | dataset: utkface
34 | train_sampler: RandomSampler
35 | num_workers: 4
36 | crop_ratio: 0.875
37 | img_size: 40
38 | preload: False
39 | seed: 0
40 | world_size: 1
41 | rank: 0
42 | multiprocessing_distributed: False
43 | dist_url: tcp://127.0.0.1:10001
44 | dist_backend: nccl
45 |
--------------------------------------------------------------------------------
/config/classic_cv/rda/rda_utkface_lb2000_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: rda
2 | save_dir: ./saved_models/classic_cv
3 | save_name: rda_utkface_lb2000_s0
4 | resume: True
5 | load_path: ./saved_models/classic_cv/rda_utkface_lb2000_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 256
11 | num_train_iter: 262144
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_labels: 2000
15 | batch_size: 32
16 | eval_batch_size: 256
17 | ema_m: 0.999
18 | uratio: 7
19 | ulb_loss_ratio: 1.0
20 | unsup_warm_up: 0.4
21 | rda_num_refine_iter: 1024
22 | optim: SGD
23 | lr: 0.01
24 | momentum: 0.9
25 | weight_decay: 0.001
26 | layer_decay: 1.0
27 | amp: False
28 | clip_grad: 0.0
29 | use_cat: True
30 | criterion: l1
31 | net: wrn_28_2
32 | net_from_name: False
33 | data_dir: ./data
34 | dataset: utkface
35 | train_sampler: RandomSampler
36 | num_workers: 4
37 | crop_ratio: 0.875
38 | img_size: 40
39 | preload: False
40 | seed: 0
41 | world_size: 1
42 | rank: 0
43 | multiprocessing_distributed: False
44 | dist_url: tcp://127.0.0.1:10003
45 | dist_backend: nccl
46 |
--------------------------------------------------------------------------------
/config/classic_cv/ucvme/ucvme_utkface_lb2000_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: ucvme
2 | save_dir: ./saved_models/classic_cv
3 | save_name: ucvme_utkface_lb2000_s0
4 | resume: True
5 | load_path: ./saved_models/classic_cv/ucvme_utkface_lb2000_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 256
11 | num_train_iter: 262144
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_labels: 2000
15 | batch_size: 32
16 | eval_batch_size: 256
17 | ema_m: 0.999
18 | uratio: 1
19 | ulb_loss_ratio: 0.05
20 | dropout_rate: 0.05
21 | num_ensemble: 5
22 | optim: SGD
23 | lr: 0.01
24 | momentum: 0.9
25 | weight_decay: 0.001
26 | layer_decay: 1.0
27 | amp: False
28 | clip_grad: 0.0
29 | use_cat: True
30 | criterion: l1
31 | net: wrn_28_2
32 | net_from_name: False
33 | data_dir: ./data
34 | dataset: utkface
35 | train_sampler: RandomSampler
36 | num_workers: 4
37 | crop_ratio: 0.875
38 | img_size: 40
39 | preload: False
40 | seed: 0
41 | world_size: 1
42 | rank: 0
43 | multiprocessing_distributed: False
44 | dist_url: tcp://127.0.0.1:10003
45 | dist_backend: nccl
46 |
--------------------------------------------------------------------------------
/config/classic_cv/meanteacher/meanteacher_utkface_lb250_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: meanteacher
2 | save_dir: ./saved_models/classic_cv
3 | save_name: meanteacher_utkface_lb250_s0
4 | resume: True
5 | load_path: ./saved_models/classic_cv/meanteacher_utkface_lb250_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 256
11 | num_train_iter: 262144
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_labels: 250
15 | batch_size: 32
16 | eval_batch_size: 256
17 | ema_m: 0.999
18 | uratio: 1
19 | ulb_loss_ratio: 0.1
20 | unsup_warm_up: 0.4
21 | optim: SGD
22 | lr: 0.01
23 | momentum: 0.9
24 | weight_decay: 0.001
25 | layer_decay: 1.0
26 | amp: False
27 | clip_grad: 0.0
28 | use_cat: True
29 | criterion: l1
30 | net: wrn_28_2
31 | net_from_name: False
32 | data_dir: ./data
33 | dataset: utkface
34 | train_sampler: RandomSampler
35 | num_workers: 4
36 | crop_ratio: 0.875
37 | img_size: 40
38 | preload: False
39 | seed: 0
40 | world_size: 1
41 | rank: 0
42 | multiprocessing_distributed: False
43 | dist_url: tcp://127.0.0.1:10002
44 | dist_backend: nccl
45 |
--------------------------------------------------------------------------------
/config/classic_cv/mixmatch/mixmatch_utkface_lb50_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: mixmatch
2 | save_dir: ./saved_models/classic_cv
3 | save_name: mixmatch_utkface_lb50_s0
4 | resume: True
5 | load_path: ./saved_models/classic_cv/mixmatch_utkface_lb50_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 256
11 | num_train_iter: 262144
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_labels: 50
15 | batch_size: 32
16 | eval_batch_size: 256
17 | ema_m: 0.999
18 | uratio: 1
19 | ulb_loss_ratio: 0.1
20 | unsup_warm_up: 0.4
21 | mixup_alpha: 0.5
22 | optim: SGD
23 | lr: 0.01
24 | momentum: 0.9
25 | weight_decay: 0.001
26 | layer_decay: 1.0
27 | amp: False
28 | clip_grad: 0.0
29 | use_cat: True
30 | criterion: l1
31 | net: wrn_28_2
32 | net_from_name: False
33 | data_dir: ./data
34 | dataset: utkface
35 | train_sampler: RandomSampler
36 | num_workers: 4
37 | crop_ratio: 0.875
38 | img_size: 40
39 | preload: False
40 | seed: 0
41 | world_size: 1
42 | rank: 0
43 | multiprocessing_distributed: False
44 | dist_url: tcp://127.0.0.1:10001
45 | dist_backend: nccl
46 |
--------------------------------------------------------------------------------
/config/classic_cv/meanteacher/meanteacher_utkface_lb2000_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: meanteacher
2 | save_dir: ./saved_models/classic_cv
3 | save_name: meanteacher_utkface_lb2000_s0
4 | resume: True
5 | load_path: ./saved_models/classic_cv/meanteacher_utkface_lb2000_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 256
11 | num_train_iter: 262144
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_labels: 2000
15 | batch_size: 32
16 | eval_batch_size: 256
17 | ema_m: 0.999
18 | uratio: 1
19 | ulb_loss_ratio: 0.1
20 | unsup_warm_up: 0.4
21 | optim: SGD
22 | lr: 0.01
23 | momentum: 0.9
24 | weight_decay: 0.001
25 | layer_decay: 1.0
26 | amp: False
27 | clip_grad: 0.0
28 | use_cat: True
29 | criterion: l1
30 | net: wrn_28_2
31 | net_from_name: False
32 | data_dir: ./data
33 | dataset: utkface
34 | train_sampler: RandomSampler
35 | num_workers: 4
36 | crop_ratio: 0.875
37 | img_size: 40
38 | preload: False
39 | seed: 0
40 | world_size: 1
41 | rank: 0
42 | multiprocessing_distributed: False
43 | dist_url: tcp://127.0.0.1:10003
44 | dist_backend: nccl
45 |
--------------------------------------------------------------------------------
/config/classic_cv/mixmatch/mixmatch_utkface_lb250_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: mixmatch
2 | save_dir: ./saved_models/classic_cv
3 | save_name: mixmatch_utkface_lb250_s0
4 | resume: True
5 | load_path: ./saved_models/classic_cv/mixmatch_utkface_lb250_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 256
11 | num_train_iter: 262144
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_labels: 250
15 | batch_size: 32
16 | eval_batch_size: 256
17 | ema_m: 0.999
18 | uratio: 1
19 | ulb_loss_ratio: 0.1
20 | unsup_warm_up: 0.4
21 | mixup_alpha: 0.5
22 | optim: SGD
23 | lr: 0.01
24 | momentum: 0.9
25 | weight_decay: 0.001
26 | layer_decay: 1.0
27 | amp: False
28 | clip_grad: 0.0
29 | use_cat: True
30 | criterion: l1
31 | net: wrn_28_2
32 | net_from_name: False
33 | data_dir: ./data
34 | dataset: utkface
35 | train_sampler: RandomSampler
36 | num_workers: 4
37 | crop_ratio: 0.875
38 | img_size: 40
39 | preload: False
40 | seed: 0
41 | world_size: 1
42 | rank: 0
43 | multiprocessing_distributed: False
44 | dist_url: tcp://127.0.0.1:10002
45 | dist_backend: nccl
46 |
--------------------------------------------------------------------------------
/config/audio/supervised/supervised_bvcc_lb250_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: supervised
2 | save_dir: ./saved_models/audio
3 | save_name: supervised_bvcc_lb250_s0
4 | resume: True
5 | load_path: ./saved_models/audio/supervised_bvcc_lb250_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 100
11 | num_train_iter: 102400
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_warmup_iter: 5120
15 | num_labels: 250
16 | batch_size: 8
17 | eval_batch_size: 16
18 | ema_m: 0.0
19 | optim: AdamW
20 | lr: 2e-06
21 | momentum: 0.9
22 | weight_decay: 2e-05
23 | layer_decay: 0.75
24 | amp: False
25 | clip_grad: 0.0
26 | use_cat: False
27 | criterion: l1
28 | net: whisper_base
29 | net_from_name: False
30 | use_pretrain: True
31 | pretrain_path: openai/whisper-base
32 | data_dir: ./data
33 | dataset: bvcc
34 | train_sampler: RandomSampler
35 | num_workers: 8
36 | max_length_seconds: 6.0
37 | sample_rate: 16000
38 | preload: True
39 | seed: 0
40 | world_size: 1
41 | rank: 0
42 | multiprocessing_distributed: False
43 | dist_url: tcp://127.0.0.1:10001
44 | dist_backend: nccl
45 |
--------------------------------------------------------------------------------
/config/classic_cv/mixmatch/mixmatch_utkface_lb2000_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: mixmatch
2 | save_dir: ./saved_models/classic_cv
3 | save_name: mixmatch_utkface_lb2000_s0
4 | resume: True
5 | load_path: ./saved_models/classic_cv/mixmatch_utkface_lb2000_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 256
11 | num_train_iter: 262144
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_labels: 2000
15 | batch_size: 32
16 | eval_batch_size: 256
17 | ema_m: 0.999
18 | uratio: 1
19 | ulb_loss_ratio: 0.1
20 | unsup_warm_up: 0.4
21 | mixup_alpha: 0.5
22 | optim: SGD
23 | lr: 0.01
24 | momentum: 0.9
25 | weight_decay: 0.001
26 | layer_decay: 1.0
27 | amp: False
28 | clip_grad: 0.0
29 | use_cat: True
30 | criterion: l1
31 | net: wrn_28_2
32 | net_from_name: False
33 | data_dir: ./data
34 | dataset: utkface
35 | train_sampler: RandomSampler
36 | num_workers: 4
37 | crop_ratio: 0.875
38 | img_size: 40
39 | preload: False
40 | seed: 0
41 | world_size: 1
42 | rank: 0
43 | multiprocessing_distributed: False
44 | dist_url: tcp://127.0.0.1:10003
45 | dist_backend: nccl
46 |
--------------------------------------------------------------------------------
/config/classic_cv/clss/clss_utkface_lb50_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: clss
2 | save_dir: ./saved_models/classic_cv
3 | save_name: clss_utkface_lb50_s0
4 | resume: True
5 | load_path: ./saved_models/classic_cv/clss_utkface_lb50_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 256
11 | num_train_iter: 262144
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_labels: 50
15 | batch_size: 32
16 | eval_batch_size: 256
17 | ema_m: 0.999
18 | uratio: 0.25
19 | lb_ctr_loss_ratio: 1.0
20 | ulb_ctr_loss_ratio: 0.05
21 | ulb_rank_loss_ratio: 0.01
22 | lambda_val: 2.0
23 | optim: SGD
24 | lr: 0.01
25 | momentum: 0.9
26 | weight_decay: 0.001
27 | layer_decay: 1.0
28 | amp: False
29 | clip_grad: 0.0
30 | use_cat: True
31 | criterion: l1
32 | net: wrn_28_2
33 | net_from_name: False
34 | data_dir: ./data
35 | dataset: utkface
36 | train_sampler: RandomSampler
37 | num_workers: 4
38 | crop_ratio: 0.875
39 | img_size: 40
40 | preload: False
41 | seed: 0
42 | world_size: 1
43 | rank: 0
44 | multiprocessing_distributed: False
45 | dist_url: tcp://127.0.0.1:10001
46 | dist_backend: nccl
47 |
--------------------------------------------------------------------------------
/config/classic_cv/clss/clss_utkface_lb2000_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: clss
2 | save_dir: ./saved_models/classic_cv
3 | save_name: clss_utkface_lb2000_s0
4 | resume: True
5 | load_path: ./saved_models/classic_cv/clss_utkface_lb2000_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 256
11 | num_train_iter: 262144
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_labels: 2000
15 | batch_size: 32
16 | eval_batch_size: 256
17 | ema_m: 0.999
18 | uratio: 0.25
19 | lb_ctr_loss_ratio: 1.0
20 | ulb_ctr_loss_ratio: 0.05
21 | ulb_rank_loss_ratio: 0.01
22 | lambda_val: 2.0
23 | optim: SGD
24 | lr: 0.01
25 | momentum: 0.9
26 | weight_decay: 0.001
27 | layer_decay: 1.0
28 | amp: False
29 | clip_grad: 0.0
30 | use_cat: True
31 | criterion: l1
32 | net: wrn_28_2
33 | net_from_name: False
34 | data_dir: ./data
35 | dataset: utkface
36 | train_sampler: RandomSampler
37 | num_workers: 4
38 | crop_ratio: 0.875
39 | img_size: 40
40 | preload: False
41 | seed: 0
42 | world_size: 1
43 | rank: 0
44 | multiprocessing_distributed: False
45 | dist_url: tcp://127.0.0.1:10003
46 | dist_backend: nccl
47 |
--------------------------------------------------------------------------------
/config/classic_cv/clss/clss_utkface_lb250_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: clss
2 | save_dir: ./saved_models/classic_cv
3 | save_name: clss_utkface_lb250_s0
4 | resume: True
5 | load_path: ./saved_models/classic_cv/clss_utkface_lb250_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 256
11 | num_train_iter: 262144
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_labels: 250
15 | batch_size: 32
16 | eval_batch_size: 256
17 | ema_m: 0.999
18 | uratio: 0.25
19 | lb_ctr_loss_ratio: 1.0
20 | ulb_ctr_loss_ratio: 0.05
21 | ulb_rank_loss_ratio: 0.01
22 | lambda_val: 2.0
23 | optim: SGD
24 | lr: 0.01
25 | momentum: 0.9
26 | weight_decay: 0.001
27 | layer_decay: 1.0
28 | amp: False
29 | clip_grad: 0.0
30 | use_cat: True
31 | criterion: l1
32 | net: wrn_28_2
33 | net_from_name: False
34 | data_dir: ./data
35 | dataset: utkface
36 | train_sampler: RandomSampler
37 | num_workers: 4
38 | crop_ratio: 0.875
39 | img_size: 40
40 | preload: False
41 | seed: 0
42 | world_size: 1
43 | rank: 0
44 | multiprocessing_distributed: False
45 | dist_url: tcp://127.0.0.1:10002
46 | dist_backend: nccl
47 |
--------------------------------------------------------------------------------
/config/classic_cv/rankup/rankup_utkface_lb50_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: rankup
2 | save_dir: ./saved_models/classic_cv
3 | save_name: rankup_utkface_lb50_s0
4 | resume: True
5 | load_path: ./saved_models/classic_cv/rankup_utkface_lb50_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 256
11 | num_train_iter: 262144
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_labels: 50
15 | batch_size: 32
16 | eval_batch_size: 256
17 | ema_m: 0.999
18 | uratio: 7
19 | arc_loss_ratio: 0.2
20 | arc_ulb_loss_ratio: 1.0
21 | hard_label: True
22 | T: 0.5
23 | p_cutoff: 0.95
24 | optim: SGD
25 | lr: 0.01
26 | momentum: 0.9
27 | weight_decay: 0.001
28 | layer_decay: 1.0
29 | amp: False
30 | clip_grad: 0.0
31 | use_cat: True
32 | criterion: l1
33 | net: wrn_28_2
34 | net_from_name: False
35 | data_dir: ./data
36 | dataset: utkface
37 | train_sampler: RandomSampler
38 | num_workers: 4
39 | crop_ratio: 0.875
40 | img_size: 40
41 | preload: False
42 | seed: 0
43 | world_size: 1
44 | rank: 0
45 | multiprocessing_distributed: False
46 | dist_url: tcp://127.0.0.1:10001
47 | dist_backend: nccl
48 |
--------------------------------------------------------------------------------
/config/classic_cv/rankup/rankup_utkface_lb2000_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: rankup
2 | save_dir: ./saved_models/classic_cv
3 | save_name: rankup_utkface_lb2000_s0
4 | resume: True
5 | load_path: ./saved_models/classic_cv/rankup_utkface_lb2000_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 256
11 | num_train_iter: 262144
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_labels: 2000
15 | batch_size: 32
16 | eval_batch_size: 256
17 | ema_m: 0.999
18 | uratio: 7
19 | arc_loss_ratio: 0.2
20 | arc_ulb_loss_ratio: 1.0
21 | hard_label: True
22 | T: 0.5
23 | p_cutoff: 0.95
24 | optim: SGD
25 | lr: 0.01
26 | momentum: 0.9
27 | weight_decay: 0.001
28 | layer_decay: 1.0
29 | amp: False
30 | clip_grad: 0.0
31 | use_cat: True
32 | criterion: l1
33 | net: wrn_28_2
34 | net_from_name: False
35 | data_dir: ./data
36 | dataset: utkface
37 | train_sampler: RandomSampler
38 | num_workers: 4
39 | crop_ratio: 0.875
40 | img_size: 40
41 | preload: False
42 | seed: 0
43 | world_size: 1
44 | rank: 0
45 | multiprocessing_distributed: False
46 | dist_url: tcp://127.0.0.1:10003
47 | dist_backend: nccl
48 |
--------------------------------------------------------------------------------
/config/classic_cv/rankup/rankup_utkface_lb250_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: rankup
2 | save_dir: ./saved_models/classic_cv
3 | save_name: rankup_utkface_lb250_s0
4 | resume: True
5 | load_path: ./saved_models/classic_cv/rankup_utkface_lb250_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 256
11 | num_train_iter: 262144
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_labels: 250
15 | batch_size: 32
16 | eval_batch_size: 256
17 | ema_m: 0.999
18 | uratio: 7
19 | arc_loss_ratio: 0.2
20 | arc_ulb_loss_ratio: 1.0
21 | hard_label: True
22 | T: 0.5
23 | p_cutoff: 0.95
24 | optim: SGD
25 | lr: 0.01
26 | momentum: 0.9
27 | weight_decay: 0.001
28 | layer_decay: 1.0
29 | amp: False
30 | clip_grad: 0.0
31 | use_cat: True
32 | criterion: l1
33 | net: wrn_28_2
34 | net_from_name: False
35 | data_dir: ./data
36 | dataset: utkface
37 | train_sampler: RandomSampler
38 | num_workers: 4
39 | crop_ratio: 0.875
40 | img_size: 40
41 | preload: False
42 | seed: 0
43 | world_size: 1
44 | rank: 0
45 | multiprocessing_distributed: False
46 | dist_url: tcp://127.0.0.1:10002
47 | dist_backend: nccl
48 |
--------------------------------------------------------------------------------
/config/nlp/pimodel/pimodel_yelp_review_lb250_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: pimodel
2 | save_dir: ./saved_models/nlp
3 | save_name: pimodel_yelp_review_lb250_s0
4 | resume: True
5 | load_path: ./saved_models/nlp/pimodel_yelp_review_lb250_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 100
11 | num_train_iter: 102400
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_warmup_iter: 5120
15 | num_labels: 250
16 | batch_size: 8
17 | eval_batch_size: 8
18 | ema_m: 0.0
19 | uratio: 1
20 | ulb_loss_ratio: 0.1
21 | unsup_warm_up: 0.4
22 | optim: AdamW
23 | lr: 1e-05
24 | momentum: 0.9
25 | weight_decay: 0.0005
26 | layer_decay: 0.75
27 | amp: False
28 | clip_grad: 0.0
29 | use_cat: False
30 | criterion: l1
31 | net: bert_base
32 | net_from_name: False
33 | use_pretrain: True
34 | pretrain_path: google/bert_uncased_L-4_H-512_A-8
35 | data_dir: ./data
36 | dataset: yelp_review
37 | train_sampler: RandomSampler
38 | num_workers: 4
39 | max_length: 512
40 | seed: 0
41 | world_size: 1
42 | rank: 0
43 | multiprocessing_distributed: False
44 | dist_url: tcp://127.0.0.1:10001
45 | dist_backend: nccl
46 |
--------------------------------------------------------------------------------
/results/nlp_average_log.csv:
--------------------------------------------------------------------------------
1 | exp_name,num_exp,min_MAE,min_MSE,max_R2,max_LCC,max_SRCC,max_KTAU,min_GMAE
2 | clss_yelp_review_lb250,3,0.721±0.010,0.913±0.022,0.543±0.011,0.744±0.001,0.748±0.002,0.599±0.002,0.307±0.026
3 | fullysupervised_yelp_review,3,0.418±0.003,0.402±0.004,0.799±0.002,0.898±0.001,0.896±0.001,0.766±0.001,0.150±0.005
4 | meanteacher_yelp_review_lb250,3,0.730±0.024,0.870±0.037,0.565±0.019,0.763±0.011,0.769±0.009,0.619±0.009,0.420±0.018
5 | mixmatch_yelp_review_lb250,3,0.886±0.004,1.238±0.017,0.381±0.008,0.643±0.003,0.660±0.004,0.511±0.003,0.587±0.003
6 | pimodel_yelp_review_lb250,3,0.730±0.024,0.870±0.037,0.565±0.019,0.763±0.011,0.769±0.009,0.619±0.009,0.420±0.018
7 | rankuprda_yelp_review_lb250,3,0.632±0.009,0.698±0.015,0.651±0.007,0.809±0.005,0.810±0.005,0.659±0.005,0.389±0.011
8 | rankup_yelp_review_lb250,3,0.661±0.018,0.711±0.025,0.645±0.013,0.817±0.003,0.829±0.002,0.681±0.002,0.391±0.013
9 | supervised_yelp_review_lb250,3,0.723±0.023,0.868±0.038,0.566±0.019,0.762±0.012,0.769±0.010,0.619±0.009,0.392±0.015
10 | ucvme_yelp_review_lb250,3,0.775±0.006,0.921±0.011,0.540±0.005,0.754±0.007,0.763±0.005,0.611±0.005,0.526±0.007
11 |
--------------------------------------------------------------------------------
/config/nlp/rda/rda_yelp_review_lb250_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: rda
2 | save_dir: ./saved_models/nlp
3 | save_name: rda_yelp_review_lb250_s0
4 | resume: True
5 | load_path: ./saved_models/nlp/rda_yelp_review_lb250_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 100
11 | num_train_iter: 102400
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_warmup_iter: 5120
15 | num_labels: 250
16 | batch_size: 8
17 | eval_batch_size: 8
18 | ema_m: 0.0
19 | uratio: 1
20 | ulb_loss_ratio: 1.0
21 | unsup_warm_up: 0.4
22 | rda_num_refine_iter: 1024
23 | optim: AdamW
24 | lr: 1e-05
25 | momentum: 0.9
26 | weight_decay: 0.0005
27 | layer_decay: 0.75
28 | amp: False
29 | clip_grad: 0.0
30 | use_cat: False
31 | criterion: l1
32 | net: bert_base
33 | net_from_name: False
34 | use_pretrain: True
35 | pretrain_path: google/bert_uncased_L-4_H-512_A-8
36 | data_dir: ./data
37 | dataset: yelp_review
38 | train_sampler: RandomSampler
39 | num_workers: 4
40 | max_length: 512
41 | seed: 0
42 | world_size: 1
43 | rank: 0
44 | multiprocessing_distributed: False
45 | dist_url: tcp://127.0.0.1:10001
46 | dist_backend: nccl
47 |
--------------------------------------------------------------------------------
/config/nlp/ucvme/ucvme_yelp_review_lb250_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: ucvme
2 | save_dir: ./saved_models/nlp
3 | save_name: ucvme_yelp_review_lb250_s0
4 | resume: True
5 | load_path: ./saved_models/nlp/ucvme_yelp_review_lb250_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 100
11 | num_train_iter: 102400
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_warmup_iter: 5120
15 | num_labels: 250
16 | batch_size: 8
17 | eval_batch_size: 8
18 | ema_m: 0.0
19 | uratio: 1
20 | ulb_loss_ratio: 0.05
21 | dropout_rate: 0.05
22 | num_ensemble: 5
23 | optim: AdamW
24 | lr: 1e-05
25 | momentum: 0.9
26 | weight_decay: 0.0005
27 | layer_decay: 0.75
28 | amp: False
29 | clip_grad: 0.0
30 | use_cat: False
31 | criterion: l1
32 | net: bert_base
33 | net_from_name: False
34 | use_pretrain: True
35 | pretrain_path: google/bert_uncased_L-4_H-512_A-8
36 | data_dir: ./data
37 | dataset: yelp_review
38 | train_sampler: RandomSampler
39 | num_workers: 4
40 | max_length: 512
41 | seed: 0
42 | world_size: 1
43 | rank: 0
44 | multiprocessing_distributed: False
45 | dist_url: tcp://127.0.0.1:10001
46 | dist_backend: nccl
47 |
--------------------------------------------------------------------------------
/config/audio/pimodel/pimodel_bvcc_lb250_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: pimodel
2 | save_dir: ./saved_models/audio
3 | save_name: pimodel_bvcc_lb250_s0
4 | resume: True
5 | load_path: ./saved_models/audio/pimodel_bvcc_lb250_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 100
11 | num_train_iter: 102400
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_warmup_iter: 5120
15 | num_labels: 250
16 | batch_size: 8
17 | eval_batch_size: 16
18 | ema_m: 0.0
19 | uratio: 1
20 | ulb_loss_ratio: 0.1
21 | unsup_warm_up: 0.4
22 | optim: AdamW
23 | lr: 2e-06
24 | momentum: 0.9
25 | weight_decay: 2e-05
26 | layer_decay: 0.75
27 | amp: False
28 | clip_grad: 0.0
29 | use_cat: False
30 | criterion: l1
31 | net: whisper_base
32 | net_from_name: False
33 | use_pretrain: True
34 | pretrain_path: openai/whisper-base
35 | data_dir: ./data
36 | dataset: bvcc
37 | train_sampler: RandomSampler
38 | num_workers: 8
39 | max_length_seconds: 6.0
40 | sample_rate: 16000
41 | preload: True
42 | seed: 0
43 | world_size: 1
44 | rank: 0
45 | multiprocessing_distributed: False
46 | dist_url: tcp://127.0.0.1:10001
47 | dist_backend: nccl
48 |
--------------------------------------------------------------------------------
/config/nlp/meanteacher/meanteacher_yelp_review_lb250_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: meanteacher
2 | save_dir: ./saved_models/nlp
3 | save_name: meanteacher_yelp_review_lb250_s0
4 | resume: True
5 | load_path: ./saved_models/nlp/meanteacher_yelp_review_lb250_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 100
11 | num_train_iter: 102400
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_warmup_iter: 5120
15 | num_labels: 250
16 | batch_size: 8
17 | eval_batch_size: 8
18 | ema_m: 0.0
19 | uratio: 1
20 | ulb_loss_ratio: 0.1
21 | unsup_warm_up: 0.4
22 | optim: AdamW
23 | lr: 1e-05
24 | momentum: 0.9
25 | weight_decay: 0.0005
26 | layer_decay: 0.75
27 | amp: False
28 | clip_grad: 0.0
29 | use_cat: False
30 | criterion: l1
31 | net: bert_base
32 | net_from_name: False
33 | use_pretrain: True
34 | pretrain_path: google/bert_uncased_L-4_H-512_A-8
35 | data_dir: ./data
36 | dataset: yelp_review
37 | train_sampler: RandomSampler
38 | num_workers: 4
39 | max_length: 512
40 | seed: 0
41 | world_size: 1
42 | rank: 0
43 | multiprocessing_distributed: False
44 | dist_url: tcp://127.0.0.1:10001
45 | dist_backend: nccl
46 |
--------------------------------------------------------------------------------
/config/audio/rda/rda_bvcc_lb250_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: rda
2 | save_dir: ./saved_models/audio
3 | save_name: rda_bvcc_lb250_s0
4 | resume: True
5 | load_path: ./saved_models/audio/rda_bvcc_lb250_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 100
11 | num_train_iter: 102400
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_warmup_iter: 5120
15 | num_labels: 250
16 | batch_size: 8
17 | eval_batch_size: 16
18 | ema_m: 0.0
19 | uratio: 1
20 | ulb_loss_ratio: 1.0
21 | unsup_warm_up: 0.4
22 | rda_num_refine_iter: 1024
23 | optim: AdamW
24 | lr: 2e-06
25 | momentum: 0.9
26 | weight_decay: 2e-05
27 | layer_decay: 0.75
28 | amp: False
29 | clip_grad: 0.0
30 | use_cat: False
31 | criterion: l1
32 | net: whisper_base
33 | net_from_name: False
34 | use_pretrain: True
35 | pretrain_path: openai/whisper-base
36 | data_dir: ./data
37 | dataset: bvcc
38 | train_sampler: RandomSampler
39 | num_workers: 8
40 | max_length_seconds: 6.0
41 | sample_rate: 16000
42 | preload: True
43 | seed: 0
44 | world_size: 1
45 | rank: 0
46 | multiprocessing_distributed: False
47 | dist_url: tcp://127.0.0.1:10001
48 | dist_backend: nccl
49 |
--------------------------------------------------------------------------------
/config/audio/ucvme/ucvme_bvcc_lb250_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: ucvme
2 | save_dir: ./saved_models/audio
3 | save_name: ucvme_bvcc_lb250_s0
4 | resume: True
5 | load_path: ./saved_models/audio/ucvme_bvcc_lb250_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 100
11 | num_train_iter: 102400
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_warmup_iter: 5120
15 | num_labels: 250
16 | batch_size: 8
17 | eval_batch_size: 16
18 | ema_m: 0.0
19 | uratio: 1
20 | ulb_loss_ratio: 0.05
21 | dropout_rate: 0.05
22 | num_ensemble: 5
23 | optim: AdamW
24 | lr: 2e-06
25 | momentum: 0.9
26 | weight_decay: 2e-05
27 | layer_decay: 0.75
28 | amp: False
29 | clip_grad: 0.0
30 | use_cat: False
31 | criterion: l1
32 | net: whisper_base
33 | net_from_name: False
34 | use_pretrain: True
35 | pretrain_path: openai/whisper-base
36 | data_dir: ./data
37 | dataset: bvcc
38 | train_sampler: RandomSampler
39 | num_workers: 8
40 | max_length_seconds: 6.0
41 | sample_rate: 16000
42 | preload: True
43 | seed: 0
44 | world_size: 1
45 | rank: 0
46 | multiprocessing_distributed: False
47 | dist_url: tcp://127.0.0.1:10001
48 | dist_backend: nccl
49 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) Microsoft Corporation
4 | Copyright (c) 2024 Pin-Yen Huang
5 |
6 | Permission is hereby granted, free of charge, to any person obtaining a copy
7 | of this software and associated documentation files (the "Software"), to deal
8 | in the Software without restriction, including without limitation the rights
9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | copies of the Software, and to permit persons to whom the Software is
11 | furnished to do so, subject to the following conditions:
12 |
13 | The above copyright notice and this permission notice shall be included in all
14 | copies or substantial portions of the Software.
15 |
16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | SOFTWARE.
--------------------------------------------------------------------------------
/config/audio/meanteacher/meanteacher_bvcc_lb250_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: meanteacher
2 | save_dir: ./saved_models/audio
3 | save_name: meanteacher_bvcc_lb250_s0
4 | resume: True
5 | load_path: ./saved_models/audio/meanteacher_bvcc_lb250_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 100
11 | num_train_iter: 102400
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_warmup_iter: 5120
15 | num_labels: 250
16 | batch_size: 8
17 | eval_batch_size: 16
18 | ema_m: 0.0
19 | uratio: 1
20 | ulb_loss_ratio: 0.1
21 | unsup_warm_up: 0.4
22 | optim: AdamW
23 | lr: 2e-06
24 | momentum: 0.9
25 | weight_decay: 2e-05
26 | layer_decay: 0.75
27 | amp: False
28 | clip_grad: 0.0
29 | use_cat: False
30 | criterion: l1
31 | net: whisper_base
32 | net_from_name: False
33 | use_pretrain: True
34 | pretrain_path: openai/whisper-base
35 | data_dir: ./data
36 | dataset: bvcc
37 | train_sampler: RandomSampler
38 | num_workers: 8
39 | max_length_seconds: 6.0
40 | sample_rate: 16000
41 | preload: True
42 | seed: 0
43 | world_size: 1
44 | rank: 0
45 | multiprocessing_distributed: False
46 | dist_url: tcp://127.0.0.1:10001
47 | dist_backend: nccl
48 |
--------------------------------------------------------------------------------
/config/audio/mixmatch/mixmatch_bvcc_lb250_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: mixmatch
2 | save_dir: ./saved_models/audio
3 | save_name: mixmatch_bvcc_lb250_s0
4 | resume: True
5 | load_path: ./saved_models/audio/mixmatch_bvcc_lb250_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 100
11 | num_train_iter: 102400
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_warmup_iter: 5120
15 | num_labels: 250
16 | batch_size: 8
17 | eval_batch_size: 16
18 | ema_m: 0.0
19 | uratio: 1
20 | ulb_loss_ratio: 0.1
21 | unsup_warm_up: 0.4
22 | mixup_alpha: 0.5
23 | optim: AdamW
24 | lr: 2e-06
25 | momentum: 0.9
26 | weight_decay: 2e-05
27 | layer_decay: 0.75
28 | amp: False
29 | clip_grad: 0.0
30 | use_cat: False
31 | criterion: l1
32 | net: whisper_base
33 | net_from_name: False
34 | use_pretrain: True
35 | pretrain_path: openai/whisper-base
36 | data_dir: ./data
37 | dataset: bvcc
38 | train_sampler: RandomSampler
39 | num_workers: 8
40 | max_length_seconds: 6.0
41 | sample_rate: 16000
42 | preload: True
43 | seed: 0
44 | world_size: 1
45 | rank: 0
46 | multiprocessing_distributed: False
47 | dist_url: tcp://127.0.0.1:10001
48 | dist_backend: nccl
49 |
--------------------------------------------------------------------------------
/config/nlp/clss/clss_yelp_review_lb250_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: clss
2 | save_dir: ./saved_models/nlp
3 | save_name: clss_yelp_review_lb250_s0
4 | resume: True
5 | load_path: ./saved_models/nlp/clss_yelp_review_lb250_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 100
11 | num_train_iter: 102400
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_warmup_iter: 5120
15 | num_labels: 250
16 | batch_size: 8
17 | eval_batch_size: 8
18 | ema_m: 0.0
19 | uratio: 0.25
20 | lb_ctr_loss_ratio: 1.0
21 | ulb_ctr_loss_ratio: 0.05
22 | ulb_rank_loss_ratio: 0.01
23 | lambda_val: 2.0
24 | optim: AdamW
25 | lr: 1e-05
26 | momentum: 0.9
27 | weight_decay: 0.0005
28 | layer_decay: 0.75
29 | amp: False
30 | clip_grad: 0.0
31 | use_cat: False
32 | criterion: l1
33 | net: bert_base
34 | net_from_name: False
35 | use_pretrain: True
36 | pretrain_path: google/bert_uncased_L-4_H-512_A-8
37 | data_dir: ./data
38 | dataset: yelp_review
39 | train_sampler: RandomSampler
40 | num_workers: 4
41 | max_length: 512
42 | seed: 0
43 | world_size: 1
44 | rank: 0
45 | multiprocessing_distributed: False
46 | dist_url: tcp://127.0.0.1:10001
47 | dist_backend: nccl
48 |
--------------------------------------------------------------------------------
/config/nlp/mixmatch/mixmatch_yelp_review_lb250_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: mixmatch
2 | save_dir: ./saved_models/nlp
3 | save_name: mixmatch_yelp_review_lb250_s0
4 | resume: True
5 | load_path: ./saved_models/nlp/mixmatch_yelp_review_lb250_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 100
11 | num_train_iter: 102400
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_warmup_iter: 5120
15 | num_labels: 250
16 | batch_size: 8
17 | eval_batch_size: 8
18 | ema_m: 0.0
19 | uratio: 1
20 | ulb_loss_ratio: 0.1
21 | unsup_warm_up: 0.4
22 | mixup_alpha: 0.5
23 | mixup_manifold: True
24 | optim: AdamW
25 | lr: 1e-05
26 | momentum: 0.9
27 | weight_decay: 0.0005
28 | layer_decay: 0.75
29 | amp: False
30 | clip_grad: 0.0
31 | use_cat: False
32 | criterion: l1
33 | net: bert_base
34 | net_from_name: False
35 | use_pretrain: True
36 | pretrain_path: google/bert_uncased_L-4_H-512_A-8
37 | data_dir: ./data
38 | dataset: yelp_review
39 | train_sampler: RandomSampler
40 | num_workers: 4
41 | max_length: 512
42 | seed: 0
43 | world_size: 1
44 | rank: 0
45 | multiprocessing_distributed: False
46 | dist_url: tcp://127.0.0.1:10001
47 | dist_backend: nccl
48 |
--------------------------------------------------------------------------------
/config/nlp/rankup/rankup_yelp_review_lb250_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: rankup
2 | save_dir: ./saved_models/nlp
3 | save_name: rankup_yelp_review_lb250_s0
4 | resume: True
5 | load_path: ./saved_models/nlp/rankup_yelp_review_lb250_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 100
11 | num_train_iter: 102400
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_warmup_iter: 5120
15 | num_labels: 250
16 | batch_size: 8
17 | eval_batch_size: 8
18 | ema_m: 0.0
19 | uratio: 1
20 | arc_loss_ratio: 0.2
21 | arc_ulb_loss_ratio: 1.0
22 | hard_label: True
23 | T: 0.5
24 | p_cutoff: 0.95
25 | optim: AdamW
26 | lr: 1e-05
27 | momentum: 0.9
28 | weight_decay: 0.0005
29 | layer_decay: 0.75
30 | amp: False
31 | clip_grad: 0.0
32 | use_cat: False
33 | criterion: l1
34 | net: bert_base
35 | net_from_name: False
36 | use_pretrain: True
37 | pretrain_path: google/bert_uncased_L-4_H-512_A-8
38 | data_dir: ./data
39 | dataset: yelp_review
40 | train_sampler: RandomSampler
41 | num_workers: 4
42 | max_length: 512
43 | seed: 0
44 | world_size: 1
45 | rank: 0
46 | multiprocessing_distributed: False
47 | dist_url: tcp://127.0.0.1:10001
48 | dist_backend: nccl
49 |
--------------------------------------------------------------------------------
/config/audio/clss/clss_bvcc_lb250_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: clss
2 | save_dir: ./saved_models/audio
3 | save_name: clss_bvcc_lb250_s0
4 | resume: True
5 | load_path: ./saved_models/audio/clss_bvcc_lb250_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 100
11 | num_train_iter: 102400
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_warmup_iter: 5120
15 | num_labels: 250
16 | batch_size: 8
17 | eval_batch_size: 16
18 | ema_m: 0.0
19 | uratio: 1
20 | lb_ctr_loss_ratio: 1.0
21 | ulb_ctr_loss_ratio: 0.05
22 | ulb_rank_loss_ratio: 0.01
23 | lambda_val: 2.0
24 | optim: AdamW
25 | lr: 2e-06
26 | momentum: 0.9
27 | weight_decay: 2e-05
28 | layer_decay: 0.75
29 | amp: False
30 | clip_grad: 0.0
31 | use_cat: False
32 | criterion: l1
33 | net: whisper_base
34 | net_from_name: False
35 | use_pretrain: True
36 | pretrain_path: openai/whisper-base
37 | data_dir: ./data
38 | dataset: bvcc
39 | train_sampler: RandomSampler
40 | num_workers: 8
41 | max_length_seconds: 6.0
42 | sample_rate: 16000
43 | preload: True
44 | seed: 0
45 | world_size: 1
46 | rank: 0
47 | multiprocessing_distributed: False
48 | dist_url: tcp://127.0.0.1:10001
49 | dist_backend: nccl
50 |
--------------------------------------------------------------------------------
/config/audio/rankup/rankup_bvcc_lb250_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: rankup
2 | save_dir: ./saved_models/audio
3 | save_name: rankup_bvcc_lb250_s0
4 | resume: True
5 | load_path: ./saved_models/audio/rankup_bvcc_lb250_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 100
11 | num_train_iter: 102400
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_warmup_iter: 5120
15 | num_labels: 250
16 | batch_size: 8
17 | eval_batch_size: 16
18 | ema_m: 0.0
19 | uratio: 1
20 | arc_loss_ratio: 0.2
21 | arc_ulb_loss_ratio: 1.0
22 | hard_label: True
23 | T: 0.5
24 | p_cutoff: 0.95
25 | optim: AdamW
26 | lr: 2e-06
27 | momentum: 0.9
28 | weight_decay: 2e-05
29 | layer_decay: 0.75
30 | amp: False
31 | clip_grad: 0.0
32 | use_cat: False
33 | criterion: l1
34 | net: whisper_base
35 | net_from_name: False
36 | use_pretrain: True
37 | pretrain_path: openai/whisper-base
38 | data_dir: ./data
39 | dataset: bvcc
40 | train_sampler: RandomSampler
41 | num_workers: 8
42 | max_length_seconds: 6.0
43 | sample_rate: 16000
44 | preload: True
45 | seed: 0
46 | world_size: 1
47 | rank: 0
48 | multiprocessing_distributed: False
49 | dist_url: tcp://127.0.0.1:10001
50 | dist_backend: nccl
51 |
--------------------------------------------------------------------------------
/config/classic_cv/rankuprda/rankuprda_utkface_lb50_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: rankuprda
2 | save_dir: ./saved_models/classic_cv
3 | save_name: rankuprda_utkface_lb50_s0
4 | resume: True
5 | load_path: ./saved_models/classic_cv/rankuprda_utkface_lb50_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 256
11 | num_train_iter: 262144
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_labels: 50
15 | batch_size: 32
16 | eval_batch_size: 256
17 | ema_m: 0.999
18 | uratio: 7
19 | ulb_loss_ratio: 1.0
20 | unsup_warm_up: 0.4
21 | rda_num_refine_iter: 1024
22 | arc_loss_ratio: 0.2
23 | arc_ulb_loss_ratio: 1.0
24 | hard_label: True
25 | T: 0.5
26 | p_cutoff: 0.95
27 | optim: SGD
28 | lr: 0.01
29 | momentum: 0.9
30 | weight_decay: 0.001
31 | layer_decay: 1.0
32 | amp: False
33 | clip_grad: 0.0
34 | use_cat: True
35 | criterion: l1
36 | net: wrn_28_2
37 | net_from_name: False
38 | data_dir: ./data
39 | dataset: utkface
40 | train_sampler: RandomSampler
41 | num_workers: 4
42 | crop_ratio: 0.875
43 | img_size: 40
44 | preload: False
45 | seed: 0
46 | world_size: 1
47 | rank: 0
48 | multiprocessing_distributed: False
49 | dist_url: tcp://127.0.0.1:10001
50 | dist_backend: nccl
51 |
--------------------------------------------------------------------------------
/config/classic_cv/rankuprda/rankuprda_utkface_lb2000_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: rankuprda
2 | save_dir: ./saved_models/classic_cv
3 | save_name: rankuprda_utkface_lb2000_s0
4 | resume: True
5 | load_path: ./saved_models/classic_cv/rankuprda_utkface_lb2000_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 256
11 | num_train_iter: 262144
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_labels: 2000
15 | batch_size: 32
16 | eval_batch_size: 256
17 | ema_m: 0.999
18 | uratio: 7
19 | ulb_loss_ratio: 1.0
20 | unsup_warm_up: 0.4
21 | rda_num_refine_iter: 1024
22 | arc_loss_ratio: 0.2
23 | arc_ulb_loss_ratio: 1.0
24 | hard_label: True
25 | T: 0.5
26 | p_cutoff: 0.95
27 | optim: SGD
28 | lr: 0.01
29 | momentum: 0.9
30 | weight_decay: 0.001
31 | layer_decay: 1.0
32 | amp: False
33 | clip_grad: 0.0
34 | use_cat: True
35 | criterion: l1
36 | net: wrn_28_2
37 | net_from_name: False
38 | data_dir: ./data
39 | dataset: utkface
40 | train_sampler: RandomSampler
41 | num_workers: 4
42 | crop_ratio: 0.875
43 | img_size: 40
44 | preload: False
45 | seed: 0
46 | world_size: 1
47 | rank: 0
48 | multiprocessing_distributed: False
49 | dist_url: tcp://127.0.0.1:10003
50 | dist_backend: nccl
51 |
--------------------------------------------------------------------------------
/config/classic_cv/rankuprda/rankuprda_utkface_lb250_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: rankuprda
2 | save_dir: ./saved_models/classic_cv
3 | save_name: rankuprda_utkface_lb250_s0
4 | resume: True
5 | load_path: ./saved_models/classic_cv/rankuprda_utkface_lb250_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 256
11 | num_train_iter: 262144
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_labels: 250
15 | batch_size: 32
16 | eval_batch_size: 256
17 | ema_m: 0.999
18 | uratio: 7
19 | ulb_loss_ratio: 1.0
20 | unsup_warm_up: 0.4
21 | rda_num_refine_iter: 1024
22 | arc_loss_ratio: 0.2
23 | arc_ulb_loss_ratio: 1.0
24 | hard_label: True
25 | T: 0.5
26 | p_cutoff: 0.95
27 | optim: SGD
28 | lr: 0.01
29 | momentum: 0.9
30 | weight_decay: 0.001
31 | layer_decay: 1.0
32 | amp: False
33 | clip_grad: 0.0
34 | use_cat: True
35 | criterion: l1
36 | net: wrn_28_2
37 | net_from_name: False
38 | data_dir: ./data
39 | dataset: utkface
40 | train_sampler: RandomSampler
41 | num_workers: 4
42 | crop_ratio: 0.875
43 | img_size: 40
44 | preload: False
45 | seed: 0
46 | world_size: 1
47 | rank: 0
48 | multiprocessing_distributed: False
49 | dist_url: tcp://127.0.0.1:10002
50 | dist_backend: nccl
51 |
--------------------------------------------------------------------------------
/config/nlp/rankuprda/rankuprda_yelp_review_lb250_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: rankuprda
2 | save_dir: ./saved_models/nlp
3 | save_name: rankuprda_yelp_review_lb250_s0
4 | resume: True
5 | load_path: ./saved_models/nlp/rankuprda_yelp_review_lb250_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 100
11 | num_train_iter: 102400
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_warmup_iter: 5120
15 | num_labels: 250
16 | batch_size: 8
17 | eval_batch_size: 8
18 | ema_m: 0.0
19 | uratio: 1
20 | ulb_loss_ratio: 1.0
21 | unsup_warm_up: 0.4
22 | rda_num_refine_iter: 1024
23 | arc_loss_ratio: 0.2
24 | arc_ulb_loss_ratio: 1.0
25 | hard_label: True
26 | T: 0.5
27 | p_cutoff: 0.95
28 | optim: AdamW
29 | lr: 1e-05
30 | momentum: 0.9
31 | weight_decay: 0.0005
32 | layer_decay: 0.75
33 | amp: False
34 | clip_grad: 0.0
35 | use_cat: False
36 | criterion: l1
37 | net: bert_base
38 | net_from_name: False
39 | use_pretrain: True
40 | pretrain_path: google/bert_uncased_L-4_H-512_A-8
41 | data_dir: ./data
42 | dataset: yelp_review
43 | train_sampler: RandomSampler
44 | num_workers: 4
45 | max_length: 512
46 | seed: 0
47 | world_size: 1
48 | rank: 0
49 | multiprocessing_distributed: False
50 | dist_url: tcp://127.0.0.1:10001
51 | dist_backend: nccl
52 |
--------------------------------------------------------------------------------
/config/audio/rankuprda/rankuprda_bvcc_lb250_s0.yaml:
--------------------------------------------------------------------------------
1 | algorithm: rankuprda
2 | save_dir: ./saved_models/audio
3 | save_name: rankuprda_bvcc_lb250_s0
4 | resume: True
5 | load_path: ./saved_models/audio/rankuprda_bvcc_lb250_s0/latest_model.pth
6 | overwrite: True
7 | use_tensorboard: True
8 | use_wandb: False
9 | use_aim: False
10 | epoch: 100
11 | num_train_iter: 102400
12 | num_eval_iter: 1024
13 | num_log_iter: 256
14 | num_warmup_iter: 5120
15 | num_labels: 250
16 | batch_size: 8
17 | eval_batch_size: 16
18 | ema_m: 0.0
19 | uratio: 1
20 | ulb_loss_ratio: 1.0
21 | unsup_warm_up: 0.4
22 | rda_num_refine_iter: 1024
23 | arc_loss_ratio: 0.2
24 | arc_ulb_loss_ratio: 1.0
25 | hard_label: True
26 | T: 0.5
27 | p_cutoff: 0.95
28 | optim: AdamW
29 | lr: 2e-06
30 | momentum: 0.9
31 | weight_decay: 2e-05
32 | layer_decay: 0.75
33 | amp: False
34 | clip_grad: 0.0
35 | use_cat: False
36 | criterion: l1
37 | net: whisper_base
38 | net_from_name: False
39 | use_pretrain: True
40 | pretrain_path: openai/whisper-base
41 | data_dir: ./data
42 | dataset: bvcc
43 | train_sampler: RandomSampler
44 | num_workers: 8
45 | max_length_seconds: 6.0
46 | sample_rate: 16000
47 | preload: True
48 | seed: 0
49 | world_size: 1
50 | rank: 0
51 | multiprocessing_distributed: False
52 | dist_url: tcp://127.0.0.1:10001
53 | dist_backend: nccl
54 |
--------------------------------------------------------------------------------
/semilearn/core/hooks/hook.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Licensed under the MIT License.
3 | # Ref: https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/hook.py
4 |
5 |
6 | class Hook:
7 | stages = ("before_run", "before_train_epoch", "before_train_step", "after_train_step", "after_train_epoch", "after_run")
8 |
9 | def before_train_epoch(self, algorithm):
10 | pass
11 |
12 | def after_train_epoch(self, algorithm):
13 | pass
14 |
15 | def before_train_step(self, algorithm):
16 | pass
17 |
18 | def after_train_step(self, algorithm):
19 | pass
20 |
21 | def before_run(self, algorithm):
22 | pass
23 |
24 | def after_run(self, algorithm):
25 | pass
26 |
27 | def every_n_epochs(self, algorithm, n):
28 | return (algorithm.epoch + 1) % n == 0 if n > 0 else False
29 |
30 | def every_n_iters(self, algorithm, n):
31 | return (algorithm.it + 1) % n == 0 if n > 0 else False
32 |
33 | def end_of_epoch(self, algorithm):
34 | return algorithm.it + 1 % len(algorithm.data_loader["train_lb"]) == 0
35 |
36 | def is_last_epoch(self, algorithm):
37 | return algorithm.epoch + 1 == algorithm.epochs
38 |
39 | def is_last_iter(self, algorithm):
40 | return algorithm.it + 1 == algorithm.num_train_iter
41 |
--------------------------------------------------------------------------------
/semilearn/core/criterions/cross_entropy.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Licensed under the MIT License.
3 |
4 | import torch
5 | import torch.nn as nn
6 |
7 | from torch.nn import functional as F
8 |
9 |
10 | def ce_loss(logits, targets, reduction="none"):
11 | """
12 | cross entropy loss in pytorch.
13 |
14 | Args:
15 | logits: logit values, shape=[Batch size, # of classes]
16 | targets: integer or vector, shape=[Batch size] or [Batch size, # of classes]
17 | # use_hard_labels: If True, targets have [Batch size] shape with int values. If False, the target is vector (default True)
18 | reduction: the reduction argument
19 | """
20 | if logits.shape == targets.shape:
21 | # one-hot target
22 | log_pred = F.log_softmax(logits, dim=-1)
23 | nll_loss = torch.sum(-targets * log_pred, dim=1)
24 | if reduction == "none":
25 | return nll_loss
26 | else:
27 | return nll_loss.mean()
28 | else:
29 | log_pred = F.log_softmax(logits, dim=-1)
30 | return F.nll_loss(log_pred, targets, reduction=reduction)
31 |
32 |
33 | class CELoss(nn.Module):
34 | """
35 | Wrapper for ce loss
36 | """
37 |
38 | def forward(self, logits, targets, reduction="none"):
39 | return ce_loss(logits, targets, reduction)
40 |
--------------------------------------------------------------------------------
/semilearn/core/criterions/consistency.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Modifications Copyright (c) 2024 Pin-Yen Huang.
3 | # Licensed under the MIT License.
4 |
5 | import torch.nn as nn
6 | from torch.nn import functional as F
7 |
8 |
9 | def consistency_loss(logits, targets, name="mse", mask=None):
10 | """
11 | consistency regularization loss in semi-supervised learning (regression).
12 |
13 | Args:
14 | logits: logit to calculate the loss on and back-propagation, usually being the strong-augmented unlabeled samples
15 | targets: pseudo-labels (either hard label or soft label)
16 | name: use mean-absolute-error ('l1') or mean-squared-error ('mse') to calculate loss
17 | mask: masks to mask-out samples when calculating the loss, usually being used as confidence-masking-out
18 | """
19 |
20 | assert name in ["l1", "mse"]
21 | # logits_w = logits_w.detach()
22 | if name == "l1":
23 | loss = F.l1_loss(logits, targets, reduction="none")
24 | else:
25 | loss = F.mse_loss(logits, targets, reduction="none")
26 |
27 | if mask is not None:
28 | # mask must not be boolean type
29 | loss = loss * mask
30 |
31 | return loss.mean()
32 |
33 |
34 | class ConsistencyLoss(nn.Module):
35 | """
36 | Wrapper for consistency loss
37 | """
38 |
39 | def forward(self, logits, targets, name="mse", mask=None):
40 | return consistency_loss(logits, targets, name, mask)
41 |
--------------------------------------------------------------------------------
/semilearn/algorithms/utils/ops.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Modifications Copyright (c) 2024 Pin-Yen Huang.
3 | # Licensed under the MIT License.
4 |
5 | import torch
6 | import numpy as np
7 |
8 |
9 | @torch.no_grad()
10 | def concat_all_gather(tensor):
11 | """
12 | Performs all_gather operation on the provided tensors.
13 | *** Warning ***: torch.distributed.all_gather has no gradient.
14 | """
15 | tensors_gather = [torch.ones_like(tensor) for _ in range(torch.distributed.get_world_size())]
16 | torch.distributed.all_gather(tensors_gather, tensor)
17 |
18 | output = torch.cat(tensors_gather, dim=0)
19 | return output
20 |
21 |
22 | @torch.no_grad()
23 | def mixup_one_target(x, y, alpha=1.0, is_bias=False):
24 | """Returns mixed inputs, mixed targets, and lambda"""
25 | if alpha > 0:
26 | lam = np.random.beta(alpha, alpha)
27 | else:
28 | lam = 1
29 | if is_bias:
30 | lam = max(lam, 1 - lam)
31 |
32 | index = torch.randperm(x.size(0)).to(x.device)
33 |
34 | mixed_x = lam * x + (1 - lam) * x[index]
35 | mixed_y = lam * y + (1 - lam) * y[index]
36 | return mixed_x, mixed_y, lam
37 |
38 |
39 | @torch.no_grad()
40 | def smooth_targets(logits, targets, smoothing=0.1):
41 | """
42 | label smoothing
43 | """
44 | true_dist = torch.zeros_like(logits)
45 | true_dist.fill_(smoothing / (logits.shape[-1] - 1))
46 | true_dist.scatter_(1, targets.data.unsqueeze(1), (1 - smoothing))
47 | return true_dist
48 |
--------------------------------------------------------------------------------
/semilearn/core/criterions/cls_consistency.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Modifications Copyright (c) 2024 Pin-Yen Huang.
3 | # Licensed under the MIT License.
4 |
5 | import torch
6 | import torch.nn as nn
7 | from torch.nn import functional as F
8 |
9 | from .cross_entropy import ce_loss
10 |
11 |
12 | def cls_consistency_loss(logits, targets, name="ce", mask=None):
13 | """
14 | consistency regularization loss in semi-supervised learning (classification).
15 |
16 | Args:
17 | logits: logit to calculate the loss on and back-propagation, usually being the strong-augmented unlabeled samples
18 | targets: pseudo-labels (either hard label or soft label)
19 | name: use cross-entropy ('ce') or mean-squared-error ('mse') to calculate loss
20 | mask: masks to mask-out samples when calculating the loss, usually being used as confidence-masking-out
21 | """
22 |
23 | assert name in ["ce", "mse"]
24 | # logits_w = logits_w.detach()
25 | if name == "mse":
26 | probs = torch.softmax(logits, dim=-1)
27 | loss = F.mse_loss(probs, targets, reduction="none").mean(dim=1)
28 | else:
29 | loss = ce_loss(logits, targets, reduction="none")
30 |
31 | if mask is not None:
32 | # mask must not be boolean type
33 | loss = loss * mask
34 |
35 | return loss.mean()
36 |
37 |
38 | class ClsConsistencyLoss(nn.Module):
39 | """
40 | Wrapper for consistency loss
41 | """
42 |
43 | def forward(self, logits, targets, name="ce", mask=None):
44 | return cls_consistency_loss(logits, targets, name, mask)
45 |
--------------------------------------------------------------------------------
/semilearn/datasets/audio_datasets/augmentation/transforms.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) 2024 Pin-Yen Huang.
2 | # Licensed under the MIT License.
3 |
4 | import random
5 | import warnings
6 |
7 | from audiomentations import *
8 |
9 |
10 | class AudioTransforms:
11 | """
12 | Strong transformation function for audio data.
13 |
14 | Args:
15 | max_length_seconds (float): Maximum output length of the audio in seconds.
16 | dataset (str): Name of the dataset.
17 | """
18 |
19 | def __init__(self, max_length_seconds, dataset_name=""):
20 | self.max_length_seconds = max_length_seconds
21 | self.effects_list, self.n = self.get_effects_list(dataset_name)
22 | self.adjust_duration = AdjustDuration(duration_seconds=max_length_seconds, p=1.0)
23 |
24 | def get_effects_list(self, dataset_name):
25 | if dataset_name.lower() in ["bvcc", "vcc2018"]:
26 | effects_list = [TimeMask(p=1.0), Trim(p=1.0), Padding(p=1.0)]
27 | num_effects = 1
28 | else:
29 | effects_list = [Gain(p=1.0), PitchShift(p=1.0), TimeStretch(p=1.0), RoomSimulator(p=1.0)]
30 | num_effects = 2
31 | return effects_list, num_effects
32 |
33 | def __call__(self, audio, sample_rate):
34 | transform = Compose(random.choices(self.effects_list, k=self.n))
35 | with warnings.catch_warnings():
36 | warnings.filterwarnings("ignore", message="Possible clipped samples in output.")
37 | aug_wav = transform(samples=audio, sample_rate=sample_rate)
38 | aug_wav = self.adjust_duration(aug_wav, sample_rate=sample_rate)
39 | return aug_wav
40 |
--------------------------------------------------------------------------------
/semilearn/datasets/cv_datasets/augmentation/transforms.py:
--------------------------------------------------------------------------------
1 | from torchvision import transforms
2 |
3 | from .randaugment import RandAugment
4 |
5 |
6 | mean, std = {}, {}
7 | mean["utkface"] = [0.59632254, 0.45671629, 0.39103324]
8 | std["utkface"] = [0.25907077, 0.23132719, 0.22686818]
9 |
10 |
11 | def get_val_transforms(crop_size, dataset_name):
12 | return transforms.Compose(
13 | [
14 | transforms.Resize(crop_size),
15 | transforms.ToTensor(),
16 | transforms.Normalize(
17 | mean[dataset_name.lower()],
18 | std[dataset_name.lower()],
19 | ),
20 | ]
21 | )
22 |
23 |
24 | def get_weak_transforms(crop_size, crop_ratio, dataset_name):
25 | return transforms.Compose(
26 | [
27 | transforms.Resize(crop_size),
28 | transforms.RandomCrop(crop_size, padding=int(crop_size * (1 - crop_ratio)), padding_mode="reflect"),
29 | transforms.RandomHorizontalFlip(),
30 | transforms.ToTensor(),
31 | transforms.Normalize(mean[dataset_name.lower()], std[dataset_name.lower()]),
32 | ]
33 | )
34 |
35 |
36 | def get_strong_transforms(crop_size, crop_ratio, dataset_name):
37 | return transforms.Compose(
38 | [
39 | transforms.Resize(crop_size),
40 | transforms.RandomCrop(crop_size, padding=int(crop_size * (1 - crop_ratio)), padding_mode="reflect"),
41 | transforms.RandomHorizontalFlip(),
42 | RandAugment(3, 5),
43 | transforms.ToTensor(),
44 | transforms.Normalize(mean[dataset_name.lower()], std[dataset_name.lower()]),
45 | ]
46 | )
47 |
--------------------------------------------------------------------------------
/semilearn/core/hooks/param_update.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Licensed under the MIT License.
3 |
4 | import torch
5 |
6 | from .hook import Hook
7 |
8 |
9 | class ParamUpdateHook(Hook):
10 | """
11 | Parameter Update Hook
12 |
13 | necessary for update the model parameters
14 | """
15 |
16 | def before_train_step(self, algorithm):
17 | if hasattr(algorithm, "start_run"):
18 | torch.cuda.synchronize()
19 | algorithm.start_run.record()
20 |
21 | # call after each train_step to update parameters
22 | def after_train_step(self, algorithm):
23 | loss = algorithm.out_dict["loss"]
24 | # algorithm.optimizer.zero_grad()
25 | # update parameters
26 | if algorithm.use_amp:
27 | algorithm.loss_scaler.scale(loss).backward()
28 | if algorithm.clip_grad > 0:
29 | algorithm.loss_scaler.unscale_(algorithm.optimizer)
30 | torch.nn.utils.clip_grad_norm_(algorithm.model.parameters(), algorithm.clip_grad)
31 | algorithm.loss_scaler.step(algorithm.optimizer)
32 | algorithm.loss_scaler.update()
33 | else:
34 | loss.backward()
35 | if algorithm.clip_grad > 0:
36 | torch.nn.utils.clip_grad_norm_(algorithm.model.parameters(), algorithm.clip_grad)
37 | algorithm.optimizer.step()
38 |
39 | if algorithm.scheduler is not None:
40 | algorithm.scheduler.step()
41 | algorithm.model.zero_grad()
42 |
43 | if hasattr(algorithm, "end_run"):
44 | algorithm.end_run.record()
45 | torch.cuda.synchronize()
46 | algorithm.log_dict["train/run_time"] = algorithm.start_run.elapsed_time(algorithm.end_run) / 1000.0
47 |
--------------------------------------------------------------------------------
/semilearn/algorithms/hooks/pseudo_label.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Licensed under the MIT License.
3 |
4 | import torch
5 |
6 | from semilearn.core.hooks import Hook
7 | from semilearn.algorithms.utils import smooth_targets
8 |
9 |
10 | class PseudoLabelingHook(Hook):
11 | """
12 | Pseudo Labeling Hook
13 | """
14 |
15 | def __init__(self):
16 | super().__init__()
17 |
18 | @torch.no_grad()
19 | def gen_ulb_targets(
20 | self,
21 | algorithm,
22 | logits,
23 | use_hard_label=True,
24 | T=1.0,
25 | softmax=True, # whether to compute softmax for logits, input must be logits
26 | label_smoothing=0.0,
27 | ):
28 | """
29 | generate pseudo-labels from logits/probs
30 |
31 | Args:
32 | algorithm: base algorithm
33 | logits: logits (or probs, need to set softmax to False)
34 | use_hard_label: flag of using hard labels instead of soft labels
35 | T: temperature parameters
36 | softmax: flag of using softmax on logits
37 | label_smoothing: label_smoothing parameter
38 | """
39 |
40 | logits = logits.detach()
41 | if use_hard_label:
42 | # return hard label directly
43 | pseudo_label = torch.argmax(logits, dim=-1)
44 | if label_smoothing:
45 | pseudo_label = smooth_targets(logits, pseudo_label, label_smoothing)
46 | return pseudo_label
47 |
48 | # return soft label
49 | if softmax:
50 | # pseudo_label = torch.softmax(logits / T, dim=-1)
51 | pseudo_label = algorithm.compute_prob(logits / T)
52 | else:
53 | # inputs logits converted to probabilities already
54 | pseudo_label = logits
55 | return pseudo_label
56 |
--------------------------------------------------------------------------------
/semilearn/core/hooks/evaluation.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Modifications Copyright (c) 2024 Pin-Yen Huang.
3 | # Licensed under the MIT License.
4 | # Ref: https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/evaluation.py
5 |
6 | import os
7 |
8 | from .hook import Hook
9 |
10 |
11 | class EvaluationHook(Hook):
12 | """
13 | Evaluation Hook for validation during training
14 | """
15 |
16 | def after_train_step(self, algorithm):
17 | if self.every_n_iters(algorithm, algorithm.num_eval_iter) or self.is_last_iter(algorithm):
18 | algorithm.print_fn("validating...")
19 | eval_dict = algorithm.evaluate("eval")
20 | algorithm.log_dict.update(eval_dict)
21 |
22 | # update best metrics
23 | if algorithm.log_dict["eval/mae"] < algorithm.best_eval_mae:
24 | algorithm.best_eval_mae = algorithm.log_dict["eval/mae"]
25 | algorithm.best_it = algorithm.it
26 |
27 | def after_run(self, algorithm):
28 | if not algorithm.args.multiprocessing_distributed or (
29 | algorithm.args.multiprocessing_distributed and algorithm.args.rank % algorithm.ngpus_per_node == 0
30 | ):
31 | save_path = os.path.join(algorithm.save_dir, algorithm.save_name)
32 | algorithm.save_model("latest_model.pth", save_path)
33 |
34 | results_dict = {"eval/mae": algorithm.best_eval_mae, "eval/best_it": algorithm.best_it}
35 | if "test" in algorithm.loader_dict:
36 | # load the best model and evaluate on test dataset
37 | best_model_path = os.path.join(algorithm.args.save_dir, algorithm.args.save_name, "model_best.pth")
38 | algorithm.load_model(best_model_path)
39 | test_dict = algorithm.evaluate("test")
40 | results_dict["test/best_mae"] = test_dict["test/mae"]
41 | algorithm.results_dict = results_dict
42 |
--------------------------------------------------------------------------------
/semilearn/algorithms/rda/utils.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) 2024 Pin-Yen Huang.
2 | # Licensed under the MIT License.
3 |
4 | import torch
5 | import numpy as np
6 |
7 | from semilearn.core.hooks import Hook
8 |
9 |
10 | class RDAHook(Hook):
11 | """
12 | RDA Hook
13 | """
14 |
15 | def __init__(self, train_ulb_len, lb_targets, num_refine_iter=1024):
16 | super(RDAHook, self).__init__()
17 | self.train_ulb_len = train_ulb_len
18 | self.sorted_lb_targets, _ = torch.sort(torch.tensor(lb_targets))
19 | self.num_refine_iter = num_refine_iter
20 |
21 | self.pseudo_raw = torch.ones(self.train_ulb_len, dtype=torch.float32)
22 | self.pseudo_refine = torch.ones(self.train_ulb_len, dtype=torch.float32)
23 |
24 | @torch.no_grad()
25 | def gen_ulb_targets(self, algorithm, logits):
26 | logits = logits.detach()
27 | pseudo_label = self.refine_pseudo_labels(algorithm.idx_ulb, logits, algorithm.it, algorithm.epoch)
28 | return pseudo_label.to(logits.device)
29 |
30 | @torch.no_grad()
31 | def refine_pseudo_labels(self, idx_ulb, logits_x_ulb, it, epoch):
32 | self.pseudo_raw[idx_ulb.to(self.pseudo_raw.device)] = logits_x_ulb.data.cpu().to(self.pseudo_raw.dtype)
33 | if it % self.num_refine_iter == 0:
34 | self.apply_dist_align()
35 | if epoch > 0:
36 | logits_x_ulb = self.pseudo_refine[idx_ulb.to(self.pseudo_raw.device)].detach()
37 | return logits_x_ulb
38 |
39 | @torch.no_grad()
40 | def apply_dist_align(self):
41 | """
42 | Apply distribution alignment to refine pseudo labels.
43 | """
44 | cdf_pseudo = np.linspace(0, 1, len(self.pseudo_raw))
45 | cdf_target = np.linspace(0, 1, len(self.sorted_lb_targets))
46 | pseudo_refine = np.interp(cdf_pseudo, cdf_target, self.sorted_lb_targets.cpu().numpy())
47 | idxes = torch.argsort(self.pseudo_raw)
48 | self.pseudo_refine[idxes] = torch.FloatTensor(pseudo_refine).to(self.pseudo_refine.device)
49 |
--------------------------------------------------------------------------------
/semilearn/core/hooks/priority.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Licensed under the MIT License.
3 | # Ref: https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/priority.py
4 |
5 | from enum import Enum
6 | from typing import Union
7 |
8 |
9 | class Priority(Enum):
10 | """Hook priority levels.
11 | +--------------+------------+
12 | | Level | Value |
13 | +==============+============+
14 | | HIGHEST | 0 |
15 | +--------------+------------+
16 | | VERY_HIGH | 10 |
17 | +--------------+------------+
18 | | HIGH | 30 |
19 | +--------------+------------+
20 | | ABOVE_NORMAL | 40 |
21 | +--------------+------------+
22 | | NORMAL | 50 |
23 | +--------------+------------+
24 | | BELOW_NORMAL | 60 |
25 | +--------------+------------+
26 | | LOW | 70 |
27 | +--------------+------------+
28 | | VERY_LOW | 90 |
29 | +--------------+------------+
30 | | LOWEST | 100 |
31 | +--------------+------------+
32 | """
33 |
34 | HIGHEST = 0
35 | VERY_HIGH = 10
36 | HIGH = 30
37 | ABOVE_NORMAL = 40
38 | NORMAL = 50
39 | BELOW_NORMAL = 60
40 | LOW = 70
41 | VERY_LOW = 90
42 | LOWEST = 100
43 |
44 |
45 | def get_priority(priority: Union[int, str, Priority]) -> int:
46 | """Get priority value.
47 | Args:
48 | priority (int or str or :obj:`Priority`): Priority.
49 | Returns:
50 | int: The priority value.
51 | """
52 | if isinstance(priority, int):
53 | if priority < 0 or priority > 100:
54 | raise ValueError("priority must be between 0 and 100")
55 | return priority
56 | elif isinstance(priority, Priority):
57 | return priority.value
58 | elif isinstance(priority, str):
59 | return Priority[priority.upper()].value
60 | else:
61 | raise TypeError("priority must be an integer or Priority enum value")
62 |
--------------------------------------------------------------------------------
/semilearn/algorithms/rankuprda/rda.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) 2024 Pin-Yen Huang.
2 | # Licensed under the MIT License.
3 |
4 | import torch
5 | import numpy as np
6 |
7 | from semilearn.core.hooks import Hook
8 |
9 |
10 | class RDAHook(Hook):
11 | """
12 | RDA Hook
13 | """
14 |
15 | def __init__(self, train_ulb_len, lb_targets, num_refine_iter=1024):
16 | super(RDAHook, self).__init__()
17 | self.train_ulb_len = train_ulb_len
18 | self.sorted_lb_targets, _ = torch.sort(torch.tensor(lb_targets))
19 | self.num_refine_iter = num_refine_iter
20 |
21 | self.pseudo_raw = torch.ones(self.train_ulb_len, dtype=torch.float32)
22 | self.pseudo_refine = torch.ones(self.train_ulb_len, dtype=torch.float32)
23 |
24 | @torch.no_grad()
25 | def gen_ulb_targets(self, algorithm, logits):
26 | logits = logits.detach()
27 | pseudo_label = self.refine_pseudo_labels(algorithm.idx_ulb, logits, algorithm.it, algorithm.epoch)
28 | return pseudo_label.to(logits.device)
29 |
30 | @torch.no_grad()
31 | def refine_pseudo_labels(self, idx_ulb, logits_x_ulb, it, epoch):
32 | self.pseudo_raw[idx_ulb.to(self.pseudo_raw.device)] = logits_x_ulb.data.cpu().to(self.pseudo_raw.dtype)
33 | if it % self.num_refine_iter == 0:
34 | self.apply_dist_align()
35 | if epoch > 0:
36 | logits_x_ulb = self.pseudo_refine[idx_ulb.to(self.pseudo_raw.device)].detach()
37 | return logits_x_ulb
38 |
39 | @torch.no_grad()
40 | def apply_dist_align(self):
41 | """
42 | Apply distribution alignment to refine pseudo labels.
43 | """
44 | cdf_pseudo = np.linspace(0, 1, len(self.pseudo_raw))
45 | cdf_target = np.linspace(0, 1, len(self.sorted_lb_targets))
46 | pseudo_refine = np.interp(cdf_pseudo, cdf_target, self.sorted_lb_targets.cpu().numpy())
47 | idxes = torch.argsort(self.pseudo_raw)
48 | self.pseudo_refine[idxes] = torch.FloatTensor(pseudo_refine).to(self.pseudo_refine.device)
49 |
--------------------------------------------------------------------------------
/semilearn/core/hooks/logging.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Modifications Copyright (c) 2024 Pin-Yen Huang.
3 | # Licensed under the MIT License.
4 | # Ref:https://github.com/open-mmlab/mmcv/blob/master/mmcv/runner/hooks/logger/base.py
5 |
6 | from .hook import Hook
7 |
8 |
9 | class LoggingHook(Hook):
10 | """
11 | Logging Hook for print information and log into tensorboard
12 | """
13 |
14 | def after_train_step(self, algorithm):
15 | """must be called after evaluation"""
16 | if self.every_n_iters(algorithm, algorithm.num_eval_iter):
17 | if not algorithm.distributed or (algorithm.distributed and algorithm.rank % algorithm.ngpus_per_node == 0):
18 | print_text = f"[{algorithm.it + 1} iteration] USE_EMA: {algorithm.ema_m != 0}, "
19 | for i, (key, item) in enumerate(algorithm.log_dict.items()):
20 | print_text += "{:s}: {:.4f}, ".format(key, item)
21 | print_text += "BEST_EVAL_MAE: {:.4f}, at {:d} iters".format(algorithm.best_eval_mae, algorithm.best_it + 1)
22 | algorithm.print_fn(print_text)
23 |
24 | if algorithm.tb_log is not None:
25 | algorithm.tb_log.update(algorithm.log_dict, algorithm.it)
26 | algorithm.tb_log.update({"eval/best-mae": algorithm.best_eval_mae}, algorithm.it)
27 |
28 | elif self.every_n_iters(algorithm, algorithm.num_log_iter):
29 | if not algorithm.distributed or (algorithm.distributed and algorithm.rank % algorithm.ngpus_per_node == 0):
30 | print_text = f"{algorithm.it + 1} iteration, "
31 | for i, (key, item) in enumerate(algorithm.log_dict.items()):
32 | print_text += "{:s}: {:.4f}".format(key, item)
33 | if i != len(algorithm.log_dict) - 1:
34 | print_text += ", "
35 | else:
36 | print_text += " "
37 | algorithm.print_fn(print_text)
38 |
39 | if algorithm.tb_log is not None:
40 | algorithm.tb_log.update(algorithm.log_dict, algorithm.it)
41 |
--------------------------------------------------------------------------------
/semilearn/algorithms/rankup/rankup_net.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) 2024 Pin-Yen Huang.
2 | # Licensed under the MIT License.
3 |
4 | import torch
5 | import torch.nn as nn
6 |
7 | from semilearn.nets.utils import init_weights
8 |
9 |
10 | class RankUp_Net(nn.Module):
11 | """
12 | RankUp_Net implementation.
13 |
14 | Attributes:
15 | backbone (nn.Module): The underlying backbone model.
16 | num_features (int): Number of features from the model's hidden layer.
17 | arc_classifier (nn.Linear): Linear layer for Auxiliary Ranking Classifier (ARC) with two output classes.
18 | """
19 |
20 | def __init__(self, backbone):
21 | super().__init__()
22 | self.backbone = backbone
23 | self.num_features = backbone.num_features
24 |
25 | # Auxiliary Ranking Classifier (ARC)
26 | self.arc_classifier = nn.Linear(self.num_features, 2)
27 | self.arc_classifier.apply(init_weights)
28 |
29 | def forward(self, x, use_arc=False, targets=None, **kwargs):
30 | if not use_arc:
31 | return self.backbone(x, **kwargs)
32 | feat = self.backbone(x, only_feat=True)
33 | logits = self.backbone(feat, only_fc=True)
34 | logits_arc = self.arc_classifier(feat)
35 | logits_mat, targets_mat = self.compute_rank_logits(logits_arc, targets)
36 | return {"logits": logits, "logits_arc": logits_mat, "feat": feat, "targets_arc": targets_mat}
37 |
38 | def compute_rank_logits(self, logits, targets=None):
39 | logits_mat = logits.unsqueeze(dim=0) - logits.unsqueeze(dim=1)
40 | logits_mat = logits_mat.flatten(0, 1)
41 | if targets is not None:
42 | targets_mat = (1 + torch.sign(targets.unsqueeze(dim=0) - targets.unsqueeze(dim=1))) / 2
43 | targets_mat = targets_mat.flatten(0, 1)
44 | # one-hot encode the targets_mat
45 | targets_onehot = torch.zeros((targets_mat.shape[0], 2)).to(targets_mat.device)
46 | targets_onehot[:, 0] = targets_mat
47 | targets_onehot[:, 1] = 1 - targets_mat
48 | return logits_mat, targets_onehot
49 | return logits_mat, None
50 |
51 | def group_matcher(self, coarse=False):
52 | matcher = self.backbone.group_matcher(coarse, prefix="backbone.")
53 | return matcher
54 |
--------------------------------------------------------------------------------
/semilearn/algorithms/rankuprda/rankup_net.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) 2024 Pin-Yen Huang.
2 | # Licensed under the MIT License.
3 |
4 | import torch
5 | import torch.nn as nn
6 |
7 | from semilearn.nets.utils import init_weights
8 |
9 |
10 | class RankUp_Net(nn.Module):
11 | """
12 | RankUp_Net implementation.
13 |
14 | Attributes:
15 | backbone (nn.Module): The underlying backbone model.
16 | num_features (int): Number of features from the model's hidden layer.
17 | arc_classifier (nn.Linear): Linear layer for Auxiliary Ranking Classifier (ARC) with two output classes.
18 | """
19 |
20 | def __init__(self, backbone):
21 | super().__init__()
22 | self.backbone = backbone
23 | self.num_features = backbone.num_features
24 |
25 | # Auxiliary Ranking Classifier (ARC)
26 | self.arc_classifier = nn.Linear(self.num_features, 2)
27 | self.arc_classifier.apply(init_weights)
28 |
29 | def forward(self, x, use_arc=False, targets=None, **kwargs):
30 | if not use_arc:
31 | return self.backbone(x, **kwargs)
32 | feat = self.backbone(x, only_feat=True)
33 | logits = self.backbone(feat, only_fc=True)
34 | logits_arc = self.arc_classifier(feat)
35 | logits_mat, targets_mat = self.compute_rank_logits(logits_arc, targets)
36 | return {"logits": logits, "logits_arc": logits_mat, "feat": feat, "targets_arc": targets_mat}
37 |
38 | def compute_rank_logits(self, logits, targets=None):
39 | logits_mat = logits.unsqueeze(dim=0) - logits.unsqueeze(dim=1)
40 | logits_mat = logits_mat.flatten(0, 1)
41 | if targets is not None:
42 | targets_mat = (1 + torch.sign(targets.unsqueeze(dim=0) - targets.unsqueeze(dim=1))) / 2
43 | targets_mat = targets_mat.flatten(0, 1)
44 | # one-hot encode the targets_mat
45 | targets_onehot = torch.zeros((targets_mat.shape[0], 2)).to(targets_mat.device)
46 | targets_onehot[:, 0] = targets_mat
47 | targets_onehot[:, 1] = 1 - targets_mat
48 | return logits_mat, targets_onehot
49 | return logits_mat, None
50 |
51 | def group_matcher(self, coarse=False):
52 | matcher = self.backbone.group_matcher(coarse, prefix="backbone.")
53 | return matcher
54 |
--------------------------------------------------------------------------------
/semilearn/algorithms/hooks/masking.py:
--------------------------------------------------------------------------------
1 | # Copyright (c) Microsoft Corporation.
2 | # Licensed under the MIT License.
3 |
4 | import torch
5 | import numpy as np
6 | from semilearn.core.hooks import Hook
7 |
8 |
9 | class MaskingHook(Hook):
10 | """
11 | Base MaskingHook, used for computing the mask of unlabeled (consistency) loss
12 | define MaskingHook in each algorithm when needed, and call hook inside each train_step
13 | easy support for other settings
14 | """
15 |
16 | def __init__(self, *args, **kwargs) -> None:
17 | super().__init__()
18 |
19 | def update(self, *args, **kwargs):
20 | pass
21 |
22 | @torch.no_grad()
23 | def masking(
24 | self, algorithm, logits_x_lb=None, logits_x_ulb=None, idx_lb=None, idx_ulb=None, softmax_x_lb=True, softmax_x_ulb=True, *args, **kwargs
25 | ):
26 | """
27 | generate mask for unlabeled loss
28 |
29 | Args:
30 | algorithm: base algorithm
31 | logits_x_lb: labeled batch logits (or probs, need to set softmax_x_lb to False)
32 | logits_x_ulb: unlabeled batch logits (or probs, need to set softmax_x_ulb to False)
33 | idx_lb: labeled batch index
34 | idx_ulb: unlabeled batch index
35 | softmax_x_lb: flag of using softmax on labeled logits
36 | softmax_x_ulb: flag of using softmax on unlabeled logits
37 | """
38 | raise NotImplementedError
39 |
40 |
41 | class FixedThresholdingHook(MaskingHook):
42 | """
43 | Common Fixed Threshold used in fixmatch, uda, pseudo label, et. al.
44 | """
45 |
46 | @torch.no_grad()
47 | def masking(self, algorithm, logits_x_ulb, softmax_x_ulb=True, *args, **kwargs):
48 | if softmax_x_ulb:
49 | # probs_x_ulb = torch.softmax(logits_x_ulb.detach(), dim=-1)
50 | probs_x_ulb = algorithm.compute_prob(logits_x_ulb.detach())
51 | else:
52 | # logits is already probs
53 | probs_x_ulb = logits_x_ulb.detach()
54 | max_probs, _ = torch.max(probs_x_ulb, dim=-1)
55 | mask = max_probs.ge(algorithm.p_cutoff).to(max_probs.dtype)
56 | return mask
57 |
58 |
59 | # class RampupWeightingHook(MaskingHook):
60 | # """
61 | # Common Rampup weight used in mean teacher, pi model, et. al.
62 | # """
63 | # def masking(self, algorithm, *args, **kwargs):
64 | # return np.clip(algorithm.it / (algorithm.unsup_warm_up * algorithm.num_train_iter), a_min=0.0, a_max=1.0)
65 |
--------------------------------------------------------------------------------
/results/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Benchmark Results
4 |
5 | 📋 Table of Contents
7 |
8 |
12 |