Transformers documentation
ViTMSN
Эта модель была опубликована в HF papers 14.04.2022 и добавлена в Hugging Face Transformers 22.09.2022.
ViTMSN
Обзор
Модель ViTMSN была предложена в статье Masked Siamese Networks for Label-Efficient Learning авторами Mahmoud Assran, Mathilde Caron, Ishan Misra, Piotr Bojanowski, Florian Bordes, Pascal Vincent, Armand Joulin, Michael Rabbat, Nicolas Ballas. В статье представлена архитектура совместного встраивания, сопоставляющая прототипы замаскированных патчей с прототипами незамаскированных. Благодаря такому подходу их метод обеспечивает превосходные результаты в режимах low-shot и extreme low-shot.
Аннотация из статьи следующая:
Мы предлагаем Masked Siamese Networks (MSN) — фреймворк самообучения для получения представлений изображений. Наш подход сопоставляет представление вида изображения, содержащего случайно замаскированные патчи, с представлением исходного изображения без маски. Эта стратегия самообучения особенно масштабируема при применении к Vision Transformers, поскольку сетью обрабатываются только незамаскированные патчи. В результате MSN повышают масштабируемость архитектур совместного встраивания, одновременно формируя представления высокого семантического уровня, которые демонстрируют конкурентоспособные результаты в задаче классификации изображений с малым количеством примеров. Например, на ImageNet-1K, используя всего 5 000 размеченных изображений, наша базовая модель MSN достигает точности top-1 72,4%, а при использовании 1% меток ImageNet-1K мы получаем точность top-1 75,7%, что устанавливает новый рекорд для самообучения на этом бенчмарке.
MSN architecture. Taken from the original paper. Эта модель была предоставлена пользователем sayakpaul. Исходный код можно найти здесь.
Советы по использованию
- MSN (masked siamese networks) — это метод самообучаемой предварительной настройки Vision Transformers (ViTs). Целью предварительной настройки является сопоставление прототипов, назначенных для немаскированных представлений изображений, с прототипами маскированных представлений тех же изображений.
- Авторы опубликовали только предобученные веса базовой модели (предобучение на ImageNet-1k). Поэтому, чтобы использовать её на собственном наборе данных для классификации изображений, используйте класс ViTMSNForImageClassification, который инициализируется из ViTMSNModel. Подробное руководство по дообучению приведено в этом ноутбуке.
- MSN особенно полезен в режимах low-shot и extreme low-shot. Примечательно, что при дообучении он достигает точности top-1 75,7% с использованием лишь 1% меток ImageNet-1K.
Использование масштабированного внимания на основе скалярного произведения (SDPA)
PyTorch включает в себя нативный оператор масштабированного внимания по скалярному произведению (SDPA) в составе torch.nn.functional. Эта функция объединяет несколько реализаций, выбор которых зависит от входных данных и используемого оборудования. Подробнее см. в официальной документации или на странице GPU Inference.
SDPA используется по умолчанию для torch>=2.1.1, когда доступна соответствующая реализация, но вы также можете установить attn_implementation="sdpa" в from_pretrained(), чтобы явно запросить использование SDPA.
from transformers import ViTMSNForImageClassification
model = ViTMSNForImageClassification.from_pretrained("facebook/vit-msn-base", attn_implementation="sdpa", device_map="auto")
...Для достижения максимального ускорения мы рекомендуем загружать модель в половинной точности (например, torch.float16 или torch.bfloat16).
На локальном бенчмарке (A100-40GB, PyTorch 2.3.0, ОС Ubuntu 22.04) с float32 и моделью facebook/vit-msn-base мы наблюдали следующие ускорения при инференсе.
| Размер пакета | Среднее время вывода (мс), режим eager | Среднее время инференса (мс), модель sdpa | Ускорение, Sdpa / Eager (x) |
|---|---|---|---|
| 1 | 7 | 6 | 1.17 |
| 2 | 8 | 6 | 1.33 |
| 4 | 8 | 6 | 1.33 |
| 8 | 8 | 6 | 1.33 |
Ресурсы
Список официальных ресурсов Hugging Face и сообщества (отмечены значком 🌎), которые помогут вам начать работу с ViT MSN.
- ViTMSNForImageClassification поддерживается в этом ноутбуке.
- См. также: Руководство по задаче классификации изображений
Если вы хотите предложить ресурс для включения в этот раздел, пожалуйста, создайте Pull Request, и мы его рассмотрим! В идеале ресурс должен демонстрировать что-то новое, а не дублировать уже имеющийся.
ViTMSNConfig
класс transformers.ViTMSNConfig
< source >( transformers_version: str | None = Nonearchitectures: list[str] | None = Noneoutput_hidden_states: bool | None = Falsereturn_dict: bool | None = Truedtype: str | torch.dtype | None = Nonechunk_size_feed_forward: int = 0is_encoder_decoder: bool = Falseid2label: dict[int, str] | dict[str, str] | None = Nonelabel2id: dict[str, int] | dict[str, str] | None = Noneproblem_type: Literal['regression', 'single_label_classification', 'multi_label_classification'] | None = Nonehidden_size: int = 768num_hidden_layers: int = 12num_attention_heads: int = 12intermediate_size: int = 3072hidden_act: str = 'gelu'hidden_dropout_prob: float | int = 0.0attention_probs_dropout_prob: float | int = 0.0initializer_range: float = 0.02layer_norm_eps: float = 1e-06image_size: int | list[int] | tuple[int, int] = 224patch_size: int | list[int] | tuple[int, int] = 16num_channels: int = 3qkv_bias: bool = True )
Параметры
- hidden_size (
int, необязательный, по умолчанию768) — Размерность скрытых представлений. - num_hidden_layers (
int, необязательный, по умолчанию12) — Количество скрытых слоев в декодере Transformer. - num_attention_heads (
int, необязательный, по умолчанию12) — Количество головок внимания в каждом слое внимания декодера Transformer. - intermediate_size (
int, необязательный, по умолчанию3072) — Размерность представлений MLP. - hidden_act (
str, необязательный, по умолчаниюgelu) — Нелинейная функция активации (функция или строка) в декодере. Например,"gelu","relu","silu"и т. д. - hidden_dropout_prob (
Union[float, int], необязательный, по умолчанию0.0) — Вероятность dropout для всех полносвязных слоёв в блоках эмбеддингов, энкодера и пуллера. - attention_probs_dropout_prob (
Union[float, int], необязательный, по умолчанию0.0) — Коэффициент dropout для вероятностей внимания. - initializer_range (
float, необязательный, по умолчанию0.02) — Стандартное отклонение truncated_normal_initializer, используемое для инициализации всех матриц весов. - layer_norm_eps (
float, необязательный, по умолчанию1e-06) — Значение epsilon, используемое слоями нормализации. - image_size (
Union[int, list[int], tuple[int, int]], необязательный, по умолчанию224) — Размер (разрешение) каждого изображения. - patch_size (
Union[int, list[int], tuple[int, int]], необязательный, по умолчанию16) — Размер (разрешение) каждого патча. - num_channels (
int, необязательный, по умолчанию3) — Количество входных каналов. - qkv_bias (
bool, необязательный, по умолчаниюTrue) — Добавлять ли смещение к запросам, ключам и значениям.
Это класс конфигурации для хранения настроек модели ViTMSNModel. Он используется для создания модели Vit Msn в соответствии с указанными аргументами, определяя архитектуру модели. Создание конфигурации с параметрами по умолчанию даст конфигурацию, аналогичную конфигурации facebook/vit_msn_base
Объекты конфигурации наследуются от PreTrainedConfig и могут использоваться для управления выводами модели. Подробнее читайте в документации PreTrainedConfig.
Пример:
>>> from transformers import ViTMSNModel, ViTMSNConfig
>>> # Initializing a ViT MSN vit-msn-base style configuration
>>> configuration = ViTConfig()
>>> # Initializing a model from the vit-msn-base style configuration
>>> model = ViTMSNModel(configuration)
>>> # Accessing the model configuration
>>> configuration = model.configViTMSNModel
класс transformers.ViTMSNModel
< source >( config: ViTMSNConfiguse_mask_token: bool = False )
Параметры
- config (ViTMSNConfig) — Класс конфигурации модели, содержащий все параметры модели. Инициализация по файлу конфигурации не загружает веса, связанные с моделью, а только конфигурацию. Используйте метод from_pretrained() для загрузки весов модели.
- use_mask_token (
bool, необязательный, по умолчаниюFalse) — Использовать ли токен маски для моделирования изображений с масками.
Модель Vit Msn без дополнительных слоёв, выводящая необработанные скрытые состояния.
Эта модель наследуется от PreTrainedModel. См. документацию родительского класса для общих методов, которые библиотека реализует для всех своих моделей (например, загрузка или сохранение, изменение размера входных эмбеддингов, обрезка голов и т. д.)
Эта модель также является подклассом torch.nn.Module в PyTorch. Используйте её как обычный модуль PyTorch и обращайтесь к документации PyTorch по всем вопросам, связанным с общим использованием и поведением.
forward
< source >( pixel_values: typing.Optional[torch.Tensor] = Nonebool_masked_pos: typing.Optional[torch.BoolTensor] = Noneinterpolate_pos_encoding: bool | None = Noneattention_mask: typing.Optional[torch.Tensor] = None**kwargs: *<class 'transformers.utils.generic.TransformersKwargs'> ) → BaseModelOutput or tuple(torch.FloatTensor)
Параметры
- pixel_values (
torch.Tensorформы(batch_size, num_channels, image_size, image_size), необязательный) — Тензоры, соответствующие входным изображениям. Значения пикселей можно получить с помощью ViTImageProcessor. Подробности см. в ViTImageProcessor.call() (processor_classиспользует ViTImageProcessor для обработки изображений). - bool_masked_pos (
torch.BoolTensorформы(batch_size, num_patches), необязательный) — Логические позиции маски. Указывает, какие патчи замаскированы (1), а какие нет (0). - interpolate_pos_encoding (
bool, необязательный) — Указывает, следует ли интерполировать предобученные позиционные кодировки. - attention_mask (
torch.Tensorформы(batch_size, sequence_length), , необязательный) — Маска для исключения токенов-заполнителей из внимания. Значения маски из диапазона[0, 1]:- 1 для токенов, которые не замаскированы,
- 0 для токенов, которые замаскированы.
Возвращает
BaseModelOutput или tuple(torch.FloatTensor)
Объект BaseModelOutput или кортеж из
torch.FloatTensor (если передано return_dict=False или если config.return_dict=False), содержащий различные
элементы в зависимости от конфигурации (ViTMSNConfig) и входных данных.
Метод forward модели ViTMSNModel переопределяет специальный метод __call__.
Хотя рецепт для прямого прохода должен быть определён внутри этой функции, после этого следует вызывать экземпляр
Module, а не эту функцию, поскольку первый вариант обеспечивает выполнение шагов предварительной и последующей обработки, тогда как второй молча их игнорирует.
last_hidden_state (
torch.FloatTensorформы(batch_size, sequence_length, hidden_size)) — Последовательность скрытых состояний на выходе последнего слоя модели.hidden_states (
tuple(torch.FloatTensor), необязательный, возвращается, если переданоoutput_hidden_states=Trueили еслиconfig.output_hidden_states=True) — кортеж изtorch.FloatTensor(один для вывода слоя встраиваний, если модель имеет такой слой, + один для вывода каждого слоя) формы(batch_size, sequence_length, hidden_size).Скрытые состояния модели на выходе каждого слоя, а также необязательные выходные значения начального слоя встраивания.
attentions (
tuple(torch.FloatTensor), необязательный, возвращается, если переданоoutput_attentions=Trueили еслиconfig.output_attentions=True) — Кортежtorch.FloatTensor(по одному для каждого слоя) формы(batch_size, num_heads, sequence_length, sequence_length).Веса внимания после softmax в механизме внимания, используемые для вычисления взвешенного среднего в головах само-внимания.
Примеры:
>>> from transformers import AutoImageProcessor, ViTMSNModel
>>> import torch
>>> from PIL import Image
>>> from huggingface_hub.utils import httpx
>>> from io import BytesIO
>>> url = "http://images.cocodataset.org/val2017/000000039769.jpg"
>>> with httpx.stream("GET", url) as response:
... image = Image.open(BytesIO(response.read()))
>>> image_processor = AutoImageProcessor.from_pretrained("facebook/vit-msn-small")
>>> model = ViTMSNModel.from_pretrained("facebook/vit-msn-small")
>>> inputs = image_processor(images=image, return_tensors="pt")
>>> with torch.no_grad():
... outputs = model(**inputs)
>>> last_hidden_states = outputs.last_hidden_stateViTMSNForImageClassification
класс transformers.ViTMSNForImageClassification
< source >( config: ViTMSNConfig )
Параметры
- config (ViTMSNConfig) — Класс конфигурации модели, содержащий все параметры модели. Инициализация с помощью файла конфигурации не загружает веса, связанные с моделью, а только конфигурацию. Чтобы загрузить веса модели, используйте метод from_pretrained().
Модель Vit Msn с головкой для классификации изображений, например, для ImageNet.
Эта модель наследуется от PreTrainedModel. См. документацию родительского класса для общих методов, которые библиотека реализует для всех своих моделей (например, загрузка или сохранение, изменение размера входных эмбеддингов, обрезка голов и т. д.)
Эта модель также является подклассом torch.nn.Module в PyTorch. Используйте её как обычный модуль PyTorch и обращайтесь к документации PyTorch по всем вопросам, связанным с общим использованием и поведением.
forward
< source >( pixel_values: typing.Optional[torch.Tensor] = Nonelabels: typing.Optional[torch.Tensor] = Noneinterpolate_pos_encoding: bool | None = Noneattention_mask: typing.Optional[torch.Tensor] = None**kwargs: *<class 'transformers.utils.generic.TransformersKwargs'> ) → ImageClassifierOutput or tuple(torch.FloatTensor)
Параметры
- pixel_values (
torch.Tensorформы(batch_size, num_channels, image_size, image_size), необязательный) — Тензоры, соответствующие входным изображениям. Значения пикселей можно получить с помощью ViTImageProcessor. Подробности см. в ViTImageProcessor.call() (processor_classиспользует ViTImageProcessor для обработки изображений). - labels (
torch.LongTensorформы(batch_size,), необязательный) — Метки для вычисления функции потерь классификации/регрессии изображений. - interpolate_pos_encoding (
bool, необязательный) — Указывает, следует ли интерполировать предобученные позиционные кодировки. - attention_mask (
torch.Tensorформы(batch_size, sequence_length), , необязательный) — Маска для исключения токенов-заполнителей из внимания. Значения маски из диапазона[0, 1]:- 1 для токенов, которые не замаскированы,
- 0 для токенов, которые замаскированы.
Возвращает
ImageClassifierOutput или tuple(torch.FloatTensor)
Объект ImageClassifierOutput или кортеж из
torch.FloatTensor (если передано return_dict=False или если config.return_dict=False), содержащий различные
элементы в зависимости от конфигурации (ViTMSNConfig) и входных данных.
Метод forward класса ViTMSNForImageClassification переопределяет специальный метод __call__.
Хотя рецепт для прямого прохода должен быть определён внутри этой функции, после этого следует вызывать экземпляр
Module, а не эту функцию, поскольку первый вариант обеспечивает выполнение шагов предварительной и последующей обработки, тогда как второй молча их игнорирует.
loss (
torch.FloatTensorформы(1,), необязательный, возвращается, если переданlabels) — Потери классификации (или регрессии, если config.num_labels==1).logits (
torch.FloatTensorформы(batch_size, config.num_labels)) — оценки для классификации (или регрессии, если config.num_labels==1) (до применения SoftMax).hidden_states (
tuple(torch.FloatTensor), необязательный, возвращается, если переданоoutput_hidden_states=Trueили еслиconfig.output_hidden_states=True) — Кортежtorch.FloatTensor(один для вывода слоя встраиваний, если модель имеет такой слой, + один для вывода каждого этапа) формы(batch_size, sequence_length, hidden_size). Скрытые состояния (также называемые картами признаков) модели на выходе каждого этапа.attentions (
tuple(torch.FloatTensor), необязательный, возвращается при передачеoutput_attentions=Trueили приconfig.output_attentions=True) — кортежtorch.FloatTensor(по одному на каждый слой) формы(batch_size, num_heads, patch_size, sequence_length).Веса внимания после softmax в механизме внимания, используемые для вычисления взвешенного среднего в головах само-внимания.
Примеры:
>>> from transformers import AutoImageProcessor, ViTMSNForImageClassification
>>> import torch
>>> from PIL import Image
>>> from huggingface_hub.utils import httpx
>>> from io import BytesIO
>>> torch.manual_seed(2)
>>> url = "http://images.cocodataset.org/val2017/000000039769.jpg"
>>> with httpx.stream("GET", url) as response:
... image = Image.open(BytesIO(response.read())).convert("RGB")
>>> image_processor = AutoImageProcessor.from_pretrained("facebook/vit-msn-small")
>>> model = ViTMSNForImageClassification.from_pretrained("facebook/vit-msn-small")
>>> inputs = image_processor(images=image, return_tensors="pt")
>>> with torch.no_grad():
... logits = model(**inputs).logits
>>> # model predicts one of the 1000 ImageNet classes
>>> predicted_label = logits.argmax(-1).item()
>>> print(model.config.id2label[predicted_label])
tusker