DASSL عبارة عن صندوق أدوات Pytorch تم تطويره في البداية لمجالنا التكيفي التعلم (DAEL) لدعم الأبحاث في تكيف المجال وتعميمه --- لأننا ندرس في 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) للتدريب ، يتم إلغاء تنشيط Resize(cfg.INPUT.SIZE) عند استخدام random_crop أو random_resized_crop . لن تحدث هذه التغييرات أي فرق في تحويلات التدريب المستخدمة في ملفات التكوين الحالية ، ولا إلى تحويلات الاختبار ما لم تكن الصور الخام مربعة (الفرق الوحيد هو أن نسبة عرض ارتفاع الصورة الآن محترمة).v0.4.3 : انسخ السمات DataManager self.dm (مدير البيانات) إلى SimpleTrainer وجعل self.dmv0.4.2 : يتمثل التحديث المهم في تعيين drop_last=is_train and len(data_source)>=batch_size عند إنشاء محمل بيانات لتجنب طول 0. نفذت Dassl الطرق التالية:
تكيف المجال واحد المصدر
تكيف المجال متعدد المصدر
تعميم المجال
التعلم شبه الخاضع للإشراف
لا تتردد في جعل العلاقات العامة لإضافة أساليبك هنا لتسهيل على الآخرين القياس!
يدعم Dassl مجموعات البيانات التالية:
التكيف المجال
تعميم المجال
التعلم شبه الخاضع للإشراف
تأكد من تثبيت كوندا بشكل صحيح.
# 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اتبع الإرشادات في مجموعات البيانات. 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 مع الحفاظ على ملف التكوين دون تغيير ، أي باستخدام نفس معلمات التدريب مثل SourceOnly (في أبسط حالة). لتعديل المقاييس المفرطة في MCD ، مثل N_STEP_F (عدد الخطوات لتحديث مستخرج الميزات) ، يمكنك إلحاق TRAINER.MCD.N_STEP_F 4 إلى وسيطات الإدخال الحالية (وإلا سيتم استخدام القيمة الافتراضية). بدلاً من ذلك ، يمكنك إنشاء ملف config .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 على نماذج شبكات عصبية مخصصة ، مثل مولد الصور.
لإضافة وحدة جديدة ، أي العمود الفقري/الشبكة/الشبكة ، تحتاج أولاً إلى تسجيل الوحدة النمطية باستخدام 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 .
يظهر بنية رمز مثال أدناه. تأكد من قيامك DatasetBase الفرعية وتسجيل مجموعة البيانات باستخدام @DATASET_REGISTRY.register() . كل ما تحتاجه هو تحميل train_x و train_u (اختياري) و val (اختياري) test ، من بينها None يمكن تجاهل train_u و 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}
}