Dassl เป็นกล่องเครื่องมือ Pytorch ที่พัฒนาขึ้นสำหรับโครงการ Domain Adaptive Ensemble Learning (DAEL) ของเราเพื่อสนับสนุนการวิจัยในการปรับตัวของโดเมนและการวางนัยทั่วไป --- เนื่องจากใน DAEL เราศึกษาวิธีการรวมปัญหาทั้งสองนี้ไว้ในกรอบการเรียนรู้ครั้งเดียว เนื่องจากการปรับตัวของโดเมนนั้นเกี่ยวข้องอย่างใกล้ชิดกับการเรียนรู้แบบกึ่งผู้ดูแล --- ทั้งการศึกษาวิธีการใช้ประโยชน์จากข้อมูลที่ไม่มีป้ายกำกับ --- เรายังรวมส่วนประกอบที่สนับสนุนการวิจัยสำหรับหลัง
ทำไมชื่อ "Dassl"? Dassl รวมชื่อย่อของการปรับโดเมน (DA) และการเรียนรู้แบบกึ่งดูแล (SSL) ซึ่งฟังดูเป็นธรรมชาติและให้ข้อมูล
Dassl มีการออกแบบแบบแยกส่วนและอินเทอร์เฟซแบบครบวงจรช่วยให้การสร้างต้นแบบอย่างรวดเร็วและการทดลองวิธี DA/DG/SSL ใหม่ ด้วย Dassl วิธีการใหม่สามารถนำไปใช้กับรหัสเพียงไม่กี่บรรทัด ไม่เชื่อ? ดูโฟลเดอร์เครื่องยนต์ซึ่งมีการใช้งานของวิธีการที่มีอยู่มากมาย (จากนั้นคุณจะกลับมาและแสดง repo นี้) -
โดยพื้นฐานแล้ว Dassl เหมาะสำหรับการวิจัยในพื้นที่ต่อไปนี้:
แต่ด้วยการออกแบบที่ประณีตทำให้ Dassl สามารถใช้เป็น codebase เพื่อพัฒนาโครงการการเรียนรู้ที่ลึกซึ้งเช่นนี้ -
ข้อเสียเปรียบของ Dassl คือมันยังไม่สนับสนุนการฝึกอบรมแบบหลาย GPU แบบกระจาย (Dassl ใช้ DataParallel เพื่อห่อโมเดลซึ่งมีประสิทธิภาพน้อยกว่า DistributedDataParallel )
เราไม่ได้จัดทำเอกสารรายละเอียดสำหรับ Dassl ซึ่งแตกต่างจากโครงการอื่นของเรา นี่เป็นเพราะ Dassl ได้รับการพัฒนาเพื่อวัตถุประสงค์ในการวิจัยและในฐานะนักวิจัยเราคิดว่ามันสำคัญที่จะต้องอ่านซอร์สโค้ดและเราขอแนะนำให้คุณทำเช่นนั้น --- ไม่ใช่เพราะเราขี้เกียจ -
v0.6.0 : ทำให้ cfg.TRAINER.METHOD_NAME สอดคล้องกับชื่อคลาสเมธอดv0.5.0 : การเปลี่ยนแปลงที่สำคัญ ทำให้เกิด transforms.py 1) center_crop กลายเป็นการแปลงเริ่มต้นในการทดสอบ (ใช้หลังจากปรับขนาดขอบที่เล็กลงให้เป็นขนาดที่แน่นอนเพื่อรักษาอัตราส่วนภาพ) 2) สำหรับการฝึกอบรม Resize(cfg.INPUT.SIZE) ถูกปิดการใช้งานเมื่อใช้ random_crop หรือ random_resized_crop การเปลี่ยนแปลงเหล่านี้จะไม่สร้างความแตกต่างใด ๆ กับการแปลงการฝึกอบรมที่ใช้ในไฟล์กำหนดค่าที่มีอยู่หรือการแปลงการทดสอบเว้นแต่ว่าภาพดิบจะไม่ยกกำลังสอง (ความแตกต่างเพียงอย่างเดียวคือตอนนี้อัตราส่วนภาพของภาพได้รับการเคารพ)v0.4.3 : คัดลอกแอตทริบิวต์ใน self.dm (ตัวจัดการข้อมูล) ไปยัง SimpleTrainer และสร้างตัวเลือก self.dm ซึ่งหมายความว่านับจากนี้คุณสามารถสร้างตัวโหลดข้อมูลจากแหล่งใด ๆ ที่คุณต้องการแทนที่จะถูกบังคับให้ใช้ DataManagerv0.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ทำตามคำแนะนำใน Datasets.md เพื่อประมวลผลชุดข้อมูลล่วงหน้า
อินเทอร์เฟซหลักถูกนำไปใช้ใน tools/train.py ซึ่งโดยทั่วไปจะทำ
cfg = setup_cfg(args) โดยที่ args มีอินพุตบรรทัดคำสั่ง (ดู tools/train.py สำหรับรายการอาร์กิวเมนต์อินพุต);trainer ด้วย build_trainer(cfg) ซึ่งโหลดชุดข้อมูลและสร้างโมเดลเครือข่ายประสาทลึก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หลังจากการฝึกอบรมเสร็จสิ้นน้ำหนักของโมเดลจะถูกบันทึกภายใต้ไดเรกทอรีเอาต์พุตที่ระบุพร้อมกับไฟล์บันทึกและไฟล์ tensorboard สำหรับการสร้างภาพ
ในการพิมพ์ผลลัพธ์ที่บันทึกไว้ในไฟล์บันทึก (ดังนั้นคุณไม่จำเป็นต้องผ่านไฟล์บันทึกทั้งหมดอย่างละเอียดและคำนวณค่าเฉลี่ย/std ด้วยตัวเอง) คุณสามารถใช้ tools/parse_test_res.py คำสั่งสามารถพบได้ในรหัส
สำหรับผู้ฝึกสอนคนอื่น ๆ เช่น MCD คุณสามารถตั้งค่า --trainer MCD ในขณะที่เก็บไฟล์ config ไม่เปลี่ยนแปลงเช่นใช้พารามิเตอร์การฝึกอบรมเช่นเดียวกับ SourceOnly (ในกรณีที่ง่ายที่สุด) ในการแก้ไขพารามิเตอร์ไฮเปอร์ใน MCD เช่น N_STEP_F (จำนวนขั้นตอนในการอัปเดตฟีเจอร์สกัด) คุณสามารถต่อท้าย TRAINER.MCD.N_STEP_F 4 ไปยังอาร์กิวเมนต์อินพุตที่มีอยู่ (มิฉะนั้นจะใช้ค่าเริ่มต้น) หรือคุณสามารถสร้างไฟล์กำหนดค่า .yaml ใหม่เพื่อจัดเก็บการตั้งค่าที่คุณกำหนดเอง ดูที่นี่สำหรับรายการที่สมบูรณ์ของอัลกอริทึมเฉพาะพารามิเตอร์ hyper-parameters
การทดสอบแบบจำลองสามารถทำได้โดยใช้ --eval-only ซึ่งขอให้รหัสเรียกใช้ trainer.test() คุณต้องจัดทำโมเดลที่ผ่านการฝึกอบรมและระบุว่าไฟล์โมเดล (เช่นบันทึกไว้ที่ Epoch) ที่จะใช้ ตัวอย่างเช่นในการใช้ 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 เพื่อให้ได้มาซึ่งคลาสเทรนเนอร์พื้นฐานซึ่งให้ฟังก์ชั่นทั่วไปและลูปฝึกอบรม ในการเขียนชั้นเรียนเทรนเนอร์สำหรับการปรับตัวโดเมนหรือการเรียนรู้แบบกึ่งผู้ดูแลชั้นเรียนใหม่สามารถฝึกอบรม subclass TrainerXU สำหรับการวางนัยทั่วไปโดเมนคลาสใหม่สามารถ subclass TrainerX ได้ โดยเฉพาะอย่างยิ่ง TrainerXU และ TrainerX นั้นแตกต่างกันไปในการใช้ตัวโหลดข้อมูลสำหรับข้อมูลที่ไม่มีป้ายกำกับหรือไม่ ด้วยคลาสพื้นฐานผู้ฝึกสอนคนใหม่อาจต้องใช้วิธีการ forward_backward() เท่านั้นซึ่งทำการคำนวณการสูญเสียและการอัปเดตแบบจำลอง ดู dassl/enigne/da/source_only.py ตัวอย่างเช่น
backbone สอดคล้องกับโมเดลเครือข่ายประสาทแบบ convolutional ซึ่งทำการแยกคุณสมบัติ head (ซึ่งเป็นโมดูลเสริม) ติดตั้งที่ด้านบนของ backbone สำหรับการประมวลผลเพิ่มเติมซึ่งสามารถเป็นตัวอย่าง MLP backbone และ head เป็นหน่วยการสร้างพื้นฐานสำหรับการสร้าง SimpleNet() (ดู dassl/engine/trainer.py ) ซึ่งทำหน้าที่เป็นแบบจำลองหลักสำหรับงาน network มีโมเดลเครือข่ายประสาทที่กำหนดเองเช่นเครื่องกำเนิดภาพ
ในการเพิ่มโมดูลใหม่คือ Backbone/Head/Network คุณต้องลงทะเบียนโมดูลก่อนโดยใช้ registry ที่เกี่ยวข้องเช่น BACKBONE_REGISTRY สำหรับ backbone , HEAD_REGISTRY สำหรับ head และ NETWORK_RESIGTRY สำหรับ network โปรดทราบว่าสำหรับ backbone ใหม่เรากำหนดให้โมเดลเป็น Backbone ย่อยตามที่กำหนดไว้ใน dassl/modeling/backbone/backbone.py และระบุแอตทริบิวต์ 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
โครงสร้างโค้ดตัวอย่างแสดงด้านล่าง ตรวจสอบให้แน่ใจว่าคุณ Subclass 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}
}