Dasslは、プロジェクトドメイン適応アンサンブル学習(DAEL)向けに最初に開発されたPytorchツールボックスであり、ドメインの適応と一般化の研究をサポートしています。ドメインの適応が半教師の学習と密接に関連していることを考えると、両方とも非標識データを活用する方法を研究する---後者の研究をサポートするコンポーネントも組み込んでいます。
なぜ「dassl」という名前がありますか? Dasslは、ドメイン適応(DA)と半監視学習(SSL)のイニシャルを組み合わせて、自然で有益に聞こえます。
Dasslには、モジュラー設計と統一インターフェイスがあり、新しいDA/DG/SSLメソッドの高速プロトタイピングと実験が可能です。 Dasslを使用すると、数行のコードでのみ新しいメソッドを実装できます。信じない?多くの既存の方法の実装を含むエンジンフォルダーをご覧ください(その後、戻ってきて、このレポを主演します)。 :-)
基本的に、Dasslは次の分野で研究を行うのに最適です。
しかし、きちんとしたデザインのおかげで、Dasslはコードベースとして使用して、このような深い学習プロジェクトを開発することもできます。 :-)
DASSLの欠点は、分散マルチGPUトレーニングをサポートしていないことです(DASSLはDataParallel DistributedDataParallel使用してモデルをラップします。
私たちの別のプロジェクトとは異なり、Dasslの詳細なドキュメントを提供していません。これは、Dasslが研究目的のために開発されており、研究者として、ソースコードを読むことができることが重要であると考えており、そうすることを強くお勧めします。 :-)
v0.6.0 : cfg.TRAINER.METHOD_NAMEをメソッドクラス名と一致させます。v0.5.0 : transforms.pyに加えられた重要な変更。 1) center_crop 、テストでデフォルトの変換になります(画像のアスペクト比を維持するために、より小さなエッジを特定のサイズにサイズに変更した後に適用されます)。 2)トレーニングの場合、 random_cropまたはrandom_resized_cropが使用されるとResize(cfg.INPUT.SIZE)が非アクティブ化されます。これらの変更は、既存の構成ファイルで使用されるトレーニング変換や、生の画像が四角ではない限り、テスト変換にも違いはありません(唯一の違いは、イメージアスペクト比が尊重されていることです)。v0.4.3 : self.dm (データマネージャー)の属性をSimpleTrainer DataManagerコピーし、 self.dmオプションにします。v0.4.2 :重要な更新はdrop_last=is_train and len(data_source)>=batch_size設定することです。 Dasslは次の方法を実装しています。
シングルソースドメインの適応
マルチソースドメインの適応
ドメイン一般化
半教師の学習
他の人がベンチマークを簡単にするために、ここにメソッドを追加するためにPRを自由に作成してください!
Dasslは次のデータセットをサポートしています。
ドメインの適応
ドメイン一般化
半教師の学習
Condaが適切にインストールされていることを確認してください。
# Clone this repo
git clone https://github.com/KaiyangZhou/Dassl.pytorch.git
cd Dassl.pytorch/
# Create a conda environment
conda create -y -n dassl python=3.8
# Activate the environment
conda activate dassl
# Install torch (requires version >= 1.8.1) and torchvision
# Please refer to https://pytorch.org/ if you need a different cuda version
conda install pytorch torchvision cudatoolkit=10.2 -c pytorch
# Install dependencies
pip install -r requirements.txt
# Install this library (no need to re-build if the source code is modified)
python setup.py developデータセットを事前に処理するために、データセットの指示に従ってください。
メインインターフェイスはtools/train.pyに実装されています。
cfg = setup_cfg(args)で構成を初期化します。ここで、 argsはコマンドライン入力が含まれています(入力引数のリストについてはtools/train.pyを参照)。build_trainer(cfg)を使用してtrainerをインスタンス化します。trainer.train()に電話してください。以下に、人気のあるドメイン適応データセット、Office-31でソースのみのベースラインをトレーニングする例を示します。
CUDA_VISIBLE_DEVICES=0 python tools/train.py
--root $DATA
--trainer SourceOnly
--source-domains amazon
--target-domains webcam
--dataset-config-file configs/datasets/da/office31.yaml
--config-file configs/trainers/da/source_only/office31.yaml
--output-dir output/source_only_office31 $DATAデータセットがインストールされている場所を示します。 --dataset-config-file画像サイズやモデルアーキテクチャなど、データセット(この場合はOffice-31)の共通設定をロードします。 --config-fileハイパーパラメーターや最適化パラメーターなどのアルゴリズム固有の設定をロードします。
複数のソース、つまりマルチソースドメイン適応タスクを使用するには、 --source-domainsにさらにソースを追加する必要があります。たとえば、Minidomainnetでソースのみのベースラインをトレーニングするために、できること
CUDA_VISIBLE_DEVICES=0 python tools/train.py
--root $DATA
--trainer SourceOnly
--source-domains clipart painting real
--target-domains sketch
--dataset-config-file configs/datasets/da/mini_domainnet.yaml
--config-file configs/trainers/da/source_only/mini_domainnet.yaml
--output-dir output/source_only_minidnトレーニングが終了した後、モデルの重みは指定された出力ディレクトリの下に保存され、視覚化用のログファイルとテンソルボードファイルが保存されます。
ログファイルに保存された結果を印刷するには(そのため、すべてのログファイルを徹底的に実行して平均/STDを自分で計算する必要はありません)、 tools/parse_test_res.pyを使用できます。命令はコードに記載されています。
MCDなどの他のトレーナーの場合、構成ファイルを変更せずに--trainer MCD設定できます。つまり、 SourceOnlyと同じトレーニングパラメーターを使用します(最も単純な場合)。 N_STEP_F (機能抽出器を更新する手順数)など、MCDのハイパーパラメーターを変更するには、 TRAINER.MCD.N_STEP_F 4既存の入力引数に追加できます(そうでなければ、デフォルト値が使用されます)。または、新しい.yaml設定ファイルを作成して、カスタム設定を保存することもできます。アルゴリズム固有のハイパーパラメーターの完全なリストについては、こちらをご覧ください。
モデルテストは、 --eval-onlyを使用して実行できます。これにより、コードにtrainer.test()を実行するように依頼します。また、訓練されたモデルを提供し、使用するモデルファイル(EPOCHで保存された)を指定する必要があります。たとえば、 output/source_only_office31/modelで保存されたmodel.pth.tar-20を使用するには、できる
CUDA_VISIBLE_DEVICES=0 python tools/train.py
--root $DATA
--trainer SourceOnly
--source-domains amazon
--target-domains webcam
--dataset-config-file configs/datasets/da/office31.yaml
--config-file configs/trainers/da/source_only/office31.yaml
--output-dir output/source_only_office31_test
--eval-only
--model-dir output/source_only_office31
--load-epoch 20 --model-dirトレーニング段階で--output-dirで指定されたディレクトリパスを入力することに注意してください。
良い習慣は、 dassl/engine/trainer.pyを通過して、ジェネリック機能とトレーニングループを提供するベーストレーナークラスに慣れることです。ドメインの適応または半監視学習のためのトレーナークラスを作成するために、新しいクラスはTrainerXUをサブセルできます。ドメイン一般化の場合、新しいクラスはTrainerXをサブクラスできます。特に、 TrainerXUとTrainerX 、ラベルのないデータにデータローダーを使用するかどうかが主に異なります。基本クラスを使用すると、新しいトレーナーは、損失計算とモデルの更新を実行するforward_backward()メソッドを実装するだけでいい場合があります。たとえば、 dassl/enigne/da/source_only.py参照してください。
backbone 、特徴抽出を実行する畳み込みニューラルネットワークモデルに対応します。 head (オプションのモジュール)は、さらに処理するためにbackboneの上に取り付けられています。これは、たとえばMLPになります。 backboneとhead 、タスクの主要なモデルとして機能するSimpleNet()を構築するための基本的なビルディングブロックです( dassl/engine/trainer.pyを参照)。 networkには、画像ジェネレーターなどのカスタムニューラルネットワークモデルが含まれています。
新しいモジュール、つまりバックボーン/ヘッド/ネットワークを追加するには、最初に対応するregistry 、つまりbackboneのBACKBONE_REGISTRY HEAD_REGISTRY head用のhead_registry、 network用のNETWORK_RESIGTRYを使用してモジュールを登録する必要があります。新しいbackboneの場合、 dassl/modeling/backbone/backbone.pyで定義されているように、モデルがバックボーンをサブクラスなBackboneに必要とし、 self._out_features属性を指定する必要があることに注意してください。
新しいbackboneを追加する方法については、以下の例を示します。
from dassl . modeling import Backbone , BACKBONE_REGISTRY
class MyBackbone ( Backbone ):
def __init__ ( self ):
super (). __init__ ()
# Create layers
self . conv = ...
self . _out_features = 2048
def forward ( self , x ):
# Extract and return features
@ BACKBONE_REGISTRY . register ()
def my_backbone ( ** kwargs ):
return MyBackbone ()次に、 MODEL.BACKBONE.NAMEをmy_backboneに設定して、独自のアーキテクチャを使用できます。詳細については、 dassl/modelingのソースコードを参照してください。
コード構造の例を以下に示します。 DatasetBaseをサブクラス化し、 @DATASET_REGISTRY.register()にデータセットを登録してください。必要なのは、 train_x 、 train_u (オプション)、 val (オプション)、およびtest train_uロードすることNone val 。これらの各変数には、 Datumオブジェクトのリストが含まれています。 Datumオブジェクト(ここに実装)には、 impath (String)やlabel (int)などの単一の画像の情報が含まれています。
from dassl . data . datasets import DATASET_REGISTRY , Datum , DatasetBase
@ DATASET_REGISTRY . register ()
class NewDataset ( DatasetBase ):
dataset_dir = ''
def __init__ ( self , cfg ):
train_x = ...
train_u = ... # optional, can be None
val = ... # optional, can be None
test = ...
super (). __init__ ( train_x = train_x , train_u = train_u , val = val , test = test )Dasslの上に構築されているこのようないくつかのプロジェクトのデータセットコードを見てみることをお勧めします。
Dasslに関連する研究をここで共有したいと思います。
このコードがあなたの研究に役立つと思う場合は、次の論文にクレジットを与えてください
@article{zhou2022domain,
title={Domain generalization: A survey},
author={Zhou, Kaiyang and Liu, Ziwei and Qiao, Yu and Xiang, Tao and Loy, Chen Change},
journal={IEEE Transactions on Pattern Analysis and Machine Intelligence},
year={2022},
publisher={IEEE}
}
@article{zhou2021domain,
title={Domain adaptive ensemble learning},
author={Zhou, Kaiyang and Yang, Yongxin and Qiao, Yu and Xiang, Tao},
journal={IEEE Transactions on Image Processing},
volume={30},
pages={8008--8018},
year={2021},
publisher={IEEE}
}