Как ответить
Подать изображение на вход энкодера (например, трансформера или RNN) напрямую не получится — это двумерный тензор. Поэтому его превращают в последовательность векторов фиксированной длины. В современных моделях (ViT) стандартный способ — разбить изображение на прямоугольные патчи и спроецировать каждый в эмбеддинг.
Подробный процесс:
- Исходное изображение — тензор формы
[C, H, W](или[H, W, C]), где C — число каналов (например, 3 для RGB). - Нарезка на патчи: разбиваем на квадратные патчи размера P × P. Количество патчей N = (H / P) × (W / P). Обычно H и W делятся на P нацело.
- Выравнивание (flatten): каждый патч размером P × P × C разворачиваем в одномерный вектор длины C × P².
- Линейная проекция: полученный вектор умножаем на обучаемую матрицу
Eразмером (C × P²) × d, где d — размер эмбеддинга модели. Получаем вектор-токен длины d. - Позиционное кодирование: добавляем к каждому вектору информацию о положении патча (sin/cos или обучаемые позиционные эмбеддинги). Без этого порядок для трансформера неразличим.
- Специальный токен (для классификации): в начало последовательности добавляем обучаемый вектор [CLS] — он потом передаётся в голову классификатора.
Итоговая последовательность: [CLS] + N патчей — это и подаётся на вход энкодеру. Для типичного ViT (например, ViT-B/16) P=16, H=W=224, N=196, d=768.
Если энкодер — RNN (редкий случай), вместо патчей обычно выравнивают пиксели или используют свёртки для уменьшения размера, а затем flatten строк или столбцов. Но для трансформеров патчевый подход — основной.