DASSL是最初為我們的項目領域自適應集合學習(DAEL)開發的Pytorch工具箱,以支持域自適應和泛化的研究 - 因為在Dael中,我們研究瞭如何在單個學習框架中統一這兩個問題。鑑於域的適應性與半監督學習密切相關 - 兩者都研究如何利用未標記的數據 - 我們還合併了支持後者研究的組件。
為什麼名稱為“ dassl”? DASSL結合了域的適應性(DA)和半監督學習(SSL)的縮寫,這聽起來很自然和信息。
DASSL具有模塊化設計和統一界面,可快速原型製作和實驗新的DA/DG/SSL方法。使用DASSL,只需幾行代碼就可以實現一種新方法。不相信?看一下發動機文件夾,其中包含許多現有方法的實現(然後您將回來並播放此存儲庫)。 :-)
基本上,DASSL非常適合在以下領域進行研究:
但是,由於設計了整潔的設計,DASSL也可以用作代碼庫來開發任何深度學習項目。 :-)
DASSL的缺點是(目前是?hmm)支持分佈式多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中並製作self.dm可選,這意味著從現在開始,您可以從您喜歡的任何來源構建數據加載程序,而不是被迫使用DataManager 。v0.4.2 :一個重要的更新是設置drop_last=is_train and len(data_source)>=batch_size在構造數據加載器時避免0。 DASSL實施了以下方法:
單源域的適應
多源域的適應
域的概括
半監督學習
隨時在此處添加您的方法,以使其他人更容易基準!
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按照DataSet.MD中的說明進行預處理。
主界面在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即可。例如,要訓練縮影上的僅源基線,一個人可以做
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相同的培訓參數(在最簡單的情況下)。要修改MCD中的超參數,例如N_STEP_F (更新功能提取器的步驟數),您可以將TRAINER.MCD.N_STEP_F 4附加到現有輸入參數(否則將使用默認值)。另外,您可以創建一個新的.yaml配置文件來存儲自定義設置。有關算法特定的超參數的完整列表,請參見此處。
模型測試可以通過使用--eval-only使用,該測試要求代碼運行trainer.test() 。您還需要提供訓練有素的模型並指定要使用的模型文件(即保存在哪個時期)。例如,使用model.pth.tar-20保存在output/source_only_office31/model上,您可以執行
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包含自定義神經網絡模型,例如圖像生成器。
要添加一個新的模塊,即head /頭/網絡,您需要首先使用相應的registry ,即骨乾為backbone , BACKBONE_REGISTRY , HEAD_REGISTRY for Head和NETWORK_RESIGTRY進行network 。請注意,對於新的backbone ,我們需要模型來按dassl/modeling/backbone/backbone.py中定義的self._out_features類Backbone 。
我們在下面提供了一個示例,涉及如何添加新的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和val可能None或簡單地被忽略。這些變量中的每一個都包含一個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}
}