В этой домашке вам предстоит сделать следующие вещи:
- Реализовать свой маленький
ViT
; - Обучить его на задаче классификации головных уборов. Не гонитесь за качеством на валидации или на тесте, просто убедитесь, что модель учится на тренировочном наборе данных (лосс падает);
[*]
Реализовать трюк с ускорением подсчета self-attention;[*]
Заставить обученныйViT
работать на другом разрешении.
Ваша задача написать код модели ViT
, основываясь на
ViT
paper;- Статья от
DeepSchool
. В целом, вы можете пользоваться любыми материалами, лишь бы вам было понятно то, что вы делаете, и в конце концов у вас собралась модель.
Мы ожидаем, что вы реализуете модель модульно, т.е. у вас будут следующие блоки:
PatchEmbedder
- модуль, отвечающий за перевод изображения в патчи. Можете сделать хоть сверточный вариант, хоть линейный. Делайте, какой больше нравится;LinearProjector
- на вход изображение, а на выходе патчи в виде векторов, сложенные с позиционными эмбеддингами;ScaledDotProductAttention
- модуль, считающий атеншн; 4MultiHeadSelfAttention
- модуль, содержащий в себе несколько головScaledDotProductAttention
;EncoderBlock
- модуль, реализующий один блок энкодераViT
.ViT
- модуль, реализующий самViT
с помощью всех предыдущих блоков.
Конечно, это необязательно требование, и вы можете реализовать модельку как вашей душе угодно, но проверяющим будет проще, если у вас будут эти блоки.
Вам нужно сделать следующее:
- Взять вот этот набор данных головных уборов. Он очень маленький, скачать его не составит труда;
- Взять вашу реализацию модели
ViT
из предыдущего пунка; - Написать обучалку, как вас учили на первых лекциях с блекджеком, логгингом в
ClearML
и прочими простыми радостями мл инженера; - Запустить обучалку и убедиться, что модель учится. Не нужно пытаться выбивать заоблачную метрику на валидационной\тестовой выборках. Нужно просто убедиться, что моделька учится и получается какой-то
accuracy > 0.05
. В качестве гиперпараметров для обучения можно взять настройки прям из исходной статьи поViT
.
Мы считаем Q, K, V
отдельными линейными слоями с весами W_q, W_k, W_v
. Можно сделать умнее и посчитать их одним линейным слоем с расширенной матрицей весов W
. Схематически это отображено на следующей картинке:
Представим, что вы обучили ваш супер-дупер-фенси-шменси ViT
на разрешении 224x224x3
.
К вам приходит ваш бородатый тимлид и говорит, что инференс хотим делать на изображениях размера
384x384x3
, но вот незадача - ваш ViT
из коробки не может работать на изображениях другого разрешения.
Ваша задача внимательно прочитать статьи, перечисленные в задании по реализации ViT
, понять, как эту проблему
предлагают решать авторы оригинальной статьи и реализовать этот способ.