Transformers 文档

ViTMSN

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

ViTMSN

PyTorch FlashAttention SDPA

概述

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。 该论文介绍了一种联合嵌入架构,用于匹配掩码补丁的原型和未掩码补丁的原型。 通过这种设置,他们的方法在少样本和极端少样本情况下产生了出色的性能。

该论文的摘要如下

我们提出了掩码 Siamese 网络 (MSN),这是一种用于学习图像表示的自监督学习框架。 我们的方法将包含随机掩码补丁的图像视图的表示与原始未掩码图像的表示相匹配。 当应用于 Vision Transformers 时,这种自监督预训练策略尤其具有可扩展性,因为网络仅处理未掩码的补丁。 因此,MSN 提高了联合嵌入架构的可扩展性,同时产生了高语义级别的表示,这些表示在少样本图像分类方面具有竞争力。 例如,在 ImageNet-1K 上,仅使用 5,000 个带注释的图像,我们的基本 MSN 模型实现了 72.4% 的 top-1 准确率,而使用 1% 的 ImageNet-1K 标签,我们实现了 75.7% 的 top-1 准确率,为该基准上的自监督学习设定了新的最先进水平。

drawing MSN 架构。 取自原始论文。

此模型由 sayakpaul 贡献。 原始代码可以在这里找到。

使用技巧

  • MSN(掩码 Siamese 网络)是一种用于 Vision Transformers (ViTs) 自监督预训练的方法。 预训练目标是将分配给图像未掩码视图的原型与分配给同一图像掩码视图的原型相匹配。
  • 作者仅发布了骨干网络的预训练权重(ImageNet-1k 预训练)。 因此,要在您自己的图像分类数据集上使用它,请使用从 ViTMSNModel 初始化的 ViTMSNForImageClassification 类。 请参考 此 notebook 以获取关于微调的详细教程。
  • MSN 在少样本和极端少样本情况下特别有用。 值得注意的是,在微调后,它仅使用 1% 的 ImageNet-1K 标签就实现了 75.7% 的 top-1 准确率。

使用缩放点积注意力 (SDPA)

PyTorch 包含一个原生的缩放点积注意力 (SDPA) 运算符,作为 torch.nn.functional 的一部分。 此函数包含多个实现,可以根据输入和正在使用的硬件应用。 有关更多信息,请参阅官方文档GPU 推理页面。

当实现可用时,torch>=2.1.1 默认使用 SDPA,但您也可以在 from_pretrained() 中设置 attn_implementation="sdpa" 以显式请求使用 SDPA。

from transformers import ViTMSNForImageClassification
model = ViTMSNForImageClassification.from_pretrained("facebook/vit-msn-base", attn_implementation="sdpa", torch_dtype=torch.float16)
...

为了获得最佳加速,我们建议以半精度加载模型(例如 torch.float16torch.bfloat16)。

在本地基准测试(A100-40GB,PyTorch 2.3.0,操作系统 Ubuntu 22.04)中使用 float32facebook/vit-msn-base 模型,我们在推理期间看到了以下加速。

批大小 平均推理时间 (毫秒), 渴望模式 平均推理时间 (毫秒), sdpa 模型 加速, Sdpa / 渴望模式 (倍)
1 7 6 1.17
2 8 6 1.33
4 8 6 1.33
8 8 6 1.33

资源

官方 Hugging Face 和社区(🌎 表示)资源列表,可帮助您开始使用 ViT MSN。

图像分类

如果您有兴趣提交资源以包含在此处,请随时打开 Pull Request,我们将对其进行审核! 该资源最好展示一些新的东西,而不是复制现有资源。

ViTMSNConfig

class transformers.ViTMSNConfig

< >

( hidden_size = 768 num_hidden_layers = 12 num_attention_heads = 12 intermediate_size = 3072 hidden_act = 'gelu' hidden_dropout_prob = 0.0 attention_probs_dropout_prob = 0.0 initializer_range = 0.02 layer_norm_eps = 1e-06 image_size = 224 patch_size = 16 num_channels = 3 qkv_bias = True **kwargs )

参数

  • hidden_size (int, 可选, 默认为 768) — 编码器层和池化层的维度。
  • num_hidden_layers (int, 可选, 默认为 12) — Transformer 编码器中隐藏层的数量。
  • num_attention_heads (int, 可选, 默认为 12) — Transformer 编码器中每个注意力层的注意力头数。
  • intermediate_size (int, optional, defaults to 3072) — Transformer 编码器中“中间层”(即,前馈层)的维度。
  • hidden_act (strfunction, optional, defaults to "gelu") — 编码器和池化器中的非线性激活函数(函数或字符串)。如果为字符串,则支持 "gelu""relu""selu""gelu_new"
  • hidden_dropout_prob (float, optional, defaults to 0.0) — 嵌入层、编码器和池化器中所有全连接层的 dropout 概率。
  • attention_probs_dropout_prob (float, optional, defaults to 0.0) — attention 概率的 dropout 比率。
  • initializer_range (float, optional, defaults to 0.02) — 用于初始化所有权重矩阵的 truncated_normal_initializer 的标准差。
  • layer_norm_eps (float, optional, defaults to 1e-06) — 层归一化层使用的 epsilon 值。
  • image_size (int, optional, defaults to 224) — 每张图片的大小(分辨率)。
  • patch_size (int, optional, defaults to 16) — 每个 patch 的大小(分辨率)。
  • num_channels (int, optional, defaults to 3) — 输入通道的数量。
  • qkv_bias (bool, optional, defaults to True) — 是否向 queries、keys 和 values 添加偏置。

这是用于存储 ViTMSNModel 配置的配置类。 它用于根据指定的参数实例化 ViT MSN 模型,定义模型架构。 使用默认值实例化配置将产生与 ViT 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.config

ViTMSNModel

class transformers.ViTMSNModel

< >

( config: ViTMSNConfig use_mask_token: bool = False )

参数

  • config (ViTMSNConfig) — 带有模型所有参数的模型配置类。 使用配置文件初始化不会加载与模型关联的权重,仅加载配置。 查看 from_pretrained() 方法以加载模型权重。

裸 ViTMSN 模型输出原始隐藏状态,顶部没有任何特定的 head。 该模型是 PyTorch torch.nn.Module 子类。 将其用作常规 PyTorch 模块,并参阅 PyTorch 文档以了解与常规用法和行为相关的所有事项。

forward

< >

( pixel_values: typing.Optional[torch.Tensor] = None bool_masked_pos: typing.Optional[torch.BoolTensor] = None head_mask: typing.Optional[torch.Tensor] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None interpolate_pos_encoding: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None ) transformers.modeling_outputs.BaseModelOutputtuple(torch.FloatTensor)

参数

  • pixel_values (torch.FloatTensor,形状为 (batch_size, num_channels, height, width)) — 像素值。 像素值可以使用 AutoImageProcessor 获得。 有关详细信息,请参阅 ViTImageProcessor.call()
  • head_mask (torch.FloatTensor,形状为 (num_heads,)(num_layers, num_heads), optional) — 用于 nullify 自注意力模块的选定 head 的 Mask。 在 [0, 1] 中选择的 Mask 值:

    • 1 表示 head 未被 Mask
    • 0 表示 head 已被 Mask
  • output_attentions (bool, optional) — 是否返回所有 attention 层的 attention tensors。 有关更多详细信息,请参见返回的 tensors 下的 attentions
  • output_hidden_states (bool, optional) — 是否返回所有层的隐藏状态。 有关更多详细信息,请参见返回的 tensors 下的 hidden_states
  • interpolate_pos_encoding (bool, optional) — 是否插值预训练的位置编码。
  • return_dict (bool, optional) — 是否返回 ModelOutput 而不是普通 tuple。
  • bool_masked_pos (torch.BoolTensor,形状为 (batch_size, num_patches), optional) — 布尔 Masked 位置。 指示哪些 patch 被 Mask(1),哪些未被 Mask(0)。

返回值

transformers.modeling_outputs.BaseModelOutputtuple(torch.FloatTensor)

transformers.modeling_outputs.BaseModelOutputtorch.FloatTensor 的 tuple(如果传递了 return_dict=False 或当 config.return_dict=False 时),其中包含各种元素,具体取决于配置 (ViTMSNConfig) 和输入。

  • last_hidden_state (torch.FloatTensor,形状为 (batch_size, sequence_length, hidden_size)) — 模型最后一层的输出处的隐藏状态序列。

  • hidden_states (tuple(torch.FloatTensor), optional, 当传递了 output_hidden_states=True 或当 config.output_hidden_states=True 时返回) — torch.FloatTensor 的 Tuple(如果模型具有嵌入层,则一个用于嵌入的输出,+ 每个层的输出各一个),形状为 (batch_size, sequence_length, hidden_size)

    模型在每一层输出端的隐藏状态,加上可选的初始嵌入输出。

  • attentions (tuple(torch.FloatTensor), optional, 当传递了 output_attentions=True 或当 config.output_attentions=True 时返回) — torch.FloatTensor 的 Tuple(每层一个),形状为 (batch_size, num_heads, sequence_length, sequence_length)

    attention softmax 之后的 Attention 权重,用于计算自注意力 head 中的加权平均值。

ViTMSNModel 的 forward 方法覆盖了 __call__ 特殊方法。

尽管 forward 传递的配方需要在该函数内定义,但之后应该调用 Module 实例而不是此函数,因为前者负责运行预处理和后处理步骤,而后者会静默地忽略它们。

示例

>>> from transformers import AutoImageProcessor, ViTMSNModel
>>> import torch
>>> from PIL import Image
>>> import requests

>>> url = "http://images.cocodataset.org/val2017/000000039769.jpg"
>>> image = Image.open(requests.get(url, stream=True).raw)

>>> 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_state

ViTMSNForImageClassification

class transformers.ViTMSNForImageClassification

< >

( config: ViTMSNConfig )

参数

  • config (ViTMSNConfig) — 包含模型所有参数的模型配置类。使用配置文件初始化不会加载与模型相关的权重,仅加载配置。查看 from_pretrained() 方法以加载模型权重。

ViTMSN 模型,顶部带有图像分类头,例如用于 ImageNet。

此模型是 PyTorch torch.nn.Module 的子类。像常规 PyTorch 模块一样使用它,并参考 PyTorch 文档了解所有与通用用法和行为相关的事项。

forward

< >

( pixel_values: typing.Optional[torch.Tensor] = None head_mask: typing.Optional[torch.Tensor] = None labels: typing.Optional[torch.Tensor] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None interpolate_pos_encoding: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None ) transformers.modeling_outputs.ImageClassifierOutput or tuple(torch.FloatTensor)

参数

  • pixel_values (torch.FloatTensor of shape (batch_size, num_channels, height, width)) — 像素值。像素值可以使用 AutoImageProcessor 获得。有关详细信息,请参阅 ViTImageProcessor.call()
  • head_mask (torch.FloatTensor of shape (num_heads,) or (num_layers, num_heads), optional) — 用于使自注意力模块的选定头无效的掩码。掩码值在 [0, 1] 中选择:

    • 1 表示头未被掩蔽
    • 0 表示头被掩蔽
  • output_attentions (bool, optional) — 是否返回所有注意力层的注意力张量。有关更多详细信息,请参阅返回张量下的 attentions
  • output_hidden_states (bool, optional) — 是否返回所有层的隐藏状态。有关更多详细信息,请参阅返回张量下的 hidden_states
  • interpolate_pos_encoding (bool, optional) — 是否插值预训练的位置编码。
  • return_dict (bool, optional) — 是否返回 ModelOutput 而不是普通元组。

返回值

transformers.modeling_outputs.ImageClassifierOutput or tuple(torch.FloatTensor)

一个 transformers.modeling_outputs.ImageClassifierOutput 或一个 torch.FloatTensor 元组(如果传递了 return_dict=False 或当 config.return_dict=False 时),包含各种元素,具体取决于配置 (ViTMSNConfig) 和输入。

  • loss (torch.FloatTensor of shape (1,), optional, returned when labels is provided) — 分类(或回归,如果 config.num_labels==1)损失。

  • logits (torch.FloatTensor of shape (batch_size, config.num_labels)) — 分类(或回归,如果 config.num_labels==1)分数(在 SoftMax 之前)。

  • hidden_states (tuple(torch.FloatTensor), optional, returned when output_hidden_states=True is passed or when config.output_hidden_states=True) — torch.FloatTensor 元组(如果模型具有嵌入层,则为嵌入输出提供一个,+ 每个阶段的输出提供一个),形状为 (batch_size, sequence_length, hidden_size)。模型在每个阶段输出的隐藏状态(也称为特征图)。

  • attentions (tuple(torch.FloatTensor), optional, returned when output_attentions=True is passed or when config.output_attentions=True) — torch.FloatTensor 元组(每层一个),形状为 (batch_size, num_heads, patch_size, sequence_length)

    attention softmax 之后的 Attention 权重,用于计算自注意力 head 中的加权平均值。

ViTMSNForImageClassification forward 方法覆盖了 __call__ 特殊方法。

尽管 forward 传递的配方需要在该函数内定义,但之后应该调用 Module 实例而不是此函数,因为前者负责运行预处理和后处理步骤,而后者会静默地忽略它们。

示例

>>> from transformers import AutoImageProcessor, ViTMSNForImageClassification
>>> import torch
>>> from PIL import Image
>>> import requests

>>> torch.manual_seed(2)
>>> url = "http://images.cocodataset.org/val2017/000000039769.jpg"
>>> image = Image.open(requests.get(url, stream=True).raw)

>>> 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
< > 在 GitHub 更新