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 : Скопируйте атрибуты в self.dm (Data Manager), чтобы 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Следуйте инструкциям в 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 , сохраняя при этом файл конфигурации без изменений, то есть, используя те же параметры обучения, что и SourceOnly (в самом простом случае). Чтобы изменить гиперпараметры в MCD, например N_STEP_F (количество шагов для обновления экстрактора функции), вы можете добавить TRAINER.MCD.N_STEP_F 4 к существующим входным аргументам (в противном случае будет использоваться значение по умолчанию). В качестве альтернативы, вы можете создать новый файл конфигурации .yaml для хранения пользовательской настройки. Смотрите здесь полный список гиперпараметров, специфичных для алгоритма.
Модель тестирования может быть выполнено с помощью --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 чтобы получить Familes с классами базовых тренеров, которые обеспечивают общие функции и тренировочные петли. Чтобы написать класс тренера для адаптации доменов или полупрофильного обучения, новый класс CAN CAN 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 , среди которых 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}
}