Vision Transformer(ViT)
原始文本:
huggingface.co/docs/transformers/v4.37.2/en/model_doc/vit
概述
Vision Transformer(ViT)模型是由 Alexey Dosovitskiy、Lucas Beyer、Alexander Kolesnikov、Dirk Weissenborn、Xiaohua Zhai、Thomas Unterthiner、Mostafa Dehghani、Matthias Minderer、Georg Heigold、Sylvain Gelly、Jakob Uszkoreit、Neil Houlsby 在一张图值 16x16 个词:用于大规模图像识别的 Transformer中提出的。这是第一篇成功在 ImageNet 上训练 Transformer 编码器的论文,与熟悉的卷积架构相比取得了非常好的结果。
论文的摘要如下:
尽管 Transformer 架构已经成为自然语言处理任务的事实标准,但它在计算机视觉中的应用仍然有限。在视觉中,注意力要么与卷积网络一起应用,要么用来替换卷积网络的某些组件,同时保持它们的整体结构。我们表明,在图像分类任务中,这种对 CNN 的依赖是不必要的,直接应用于图像块序列的纯 Transformer 可以在大量数据上进行预训练,并转移到多个中等或小型图像识别基准(ImageNet、CIFAR-100、VTAB 等)时,Vision Transformer(ViT)取得了与最先进的卷积网络相比的优异结果,同时需要较少的计算资源来训练。
ViT 架构。摘自原始论文。
在原始 Vision Transformer 之后,已经进行了一些后续工作:
- DeiT(高效数据图像 Transformer)由 Facebook AI 提出。DeiT 模型是经过蒸馏的视觉 Transformer。DeiT 的作者还发布了更高效训练的 ViT 模型,您可以直接将其插入 ViTModel 或 ViTForImageClassification。有 4 个变体可用(3 种不同大小):facebook/deit-tiny-patch16-224、facebook/deit-small-patch16-224、facebook/deit-base-patch16-224和facebook/deit-base-patch16-384。请注意,应使用 DeiTImageProcessor 来为模型准备图像。
- BEiT(图像 Transformer 的 BERT 预训练)由微软研究院。BEiT 模型通过受 BERT 启发的自监督方法(遮蔽图像建模)和基于 VQ-VAE 的方法,优于使用监督预训练的视觉 Transformer。
- DINO(一种用于自监督训练的 Vision Transformer 方法)由 Facebook AI 提出。使用 DINO 方法训练的 Vision Transformer 展现出与卷积模型不同的非常有趣的特性。它们能够分割对象,而无需经过训练。可以在hub上找到 DINO 的检查点。
- MAE(遮蔽自动编码器)由 Facebook AI 提出。通过预训练 Vision Transformer 来重建 75%的遮蔽补丁的像素值(使用不对称的编码器-解码器架构),作者表明,这种简单方法在微调后优于监督预训练。
此模型由nielsr贡献。原始代码(使用 JAX 编写)可在此处找到。
请注意,我们从 Ross Wightman 的timm 库中转换了权重,他已经将权重从 JAX 转换为 PyTorch。感谢他!
使用提示
- 为了将图像馈送到 Transformer 编码器中,每个图像被分割成一系列固定大小且不重叠的补丁,然后进行线性嵌入。添加了一个[CLS]标记,用作整个图像的表示,可用于分类。作者还添加了绝对位置嵌入,并将结果向量序列馈送到标准 Transformer 编码器。
- 由于 Vision Transformer 期望每个图像具有相同的大小(分辨率),因此可以使用 ViTImageProcessor 来调整(或重新缩放)和规范化图像以供模型使用。
- 在预训练或微调期间使用的补丁分辨率和图像分辨率反映在每个检查点的名称中。例如,
google/vit-base-patch16-224指的是一个基本大小的架构,补丁分辨率为 16x16,微调分辨率为 224x224。所有检查点都可以在hub上找到。 - 可用的检查点要么(1)仅在ImageNet-21k(一个包含 1400 万图像和 21k 类别的集合)上进行了预训练,要么(2)还在ImageNet(也称为 ILSVRC 2012,一个包含 130 万图像和 1000 类别的集合)上进行了微调。
- Vision Transformer 是使用分辨率为 224x224 进行预训练的。在微调期间,通常比预训练使用更高的分辨率有益(Touvron 等人,2019),(Kolesnikov 等人,2020)。为了在更高分辨率下微调,作者对预训练的位置嵌入进行了 2D 插值,根据它们在原始图像中的位置。
- 最佳结果是通过监督预训练获得的,这在 NLP 中并非如此。作者还进行了一个实验,使用自监督预训练目标,即掩码补丁预测(受到掩码语言建模的启发)。通过这种方法,较小的 ViT-B/16 模型在 ImageNet 上实现了 79.9%的准确率,比从头开始训练提高了 2%,但仍然落后于监督预训练 4%。
资源
关于推理以及在自定义数据上微调 ViT 的演示笔记本可以在这里找到。这里列出了官方 Hugging Face 和社区(由🌎表示)资源的列表,以帮助您开始使用 ViT。如果您有兴趣提交资源以包含在此处,请随时打开一个 Pull Request,我们将对其进行审查!资源应该理想地展示一些新东西,而不是重复现有资源。
ViTForImageClassification由以下支持:
图像分类
- 关于如何使用 Hugging Face Transformers 对图像分类进行微调的博客文章
- 关于使用 Hugging Face Transformers 和
Keras进行图像分类的博客文章 - 关于使用 Hugging Face Transformers 进行图像分类的微调的笔记
- 关于如何使用 Hugging Face Trainer 在 CIFAR-10 上微调 Vision Transformer 的笔记
- 关于如何在 CIFAR-10 上使用 PyTorch Lightning 对 Vision Transformer 进行微调的笔记
⚗️ 优化
- 关于如何使用 Optimum 对 Vision Transformer(ViT)进行量化加速的博客文章
⚡️ 推理
🚀 部署
- 一篇关于在 Hugging Face 中使用 TF Serving 部署 Tensorflow 视觉模型的博客文章
- 一篇关于在 Vertex AI 上部署 Hugging Face ViT的博客文章
- 一篇关于在 Kubernetes 上使用 TF Serving 部署 Hugging Face ViT的博客文章
ViTConfig
class transformers.ViTConfig
( 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-12 image_size = 224 patch_size = 16 num_channels = 3 qkv_bias = True encoder_stride = 16 **kwargs )
参数
hidden_size(int,可选,默认为 768) — 编码器层和池化器层的维度。num_hidden_layers(int,可选,默认为 12) — Transformer 编码器中的隐藏层数量。num_attention_heads(int,可选,默认为 12) — Transformer 编码器中每个注意力层的注意力头数。intermediate_size(int,可选,默认为 3072) — Transformer 编码器中“中间”(即前馈)层的维度。hidden_act(str或function,可选,默认为"gelu") — 编码器和池化器中的非线性激活函数(函数或字符串)。如果是字符串,支持"gelu","relu","selu"和"gelu_new"。hidden_dropout_prob(float,可选,默认为 0.0) — 嵌入层、编码器和池化器中所有全连接层的丢失概率。attention_probs_dropout_prob(float,可选,默认为 0.0) — 注意力概率的丢失比率。initializer_range(float,可选,默认为 0.02) — 用于初始化所有权重矩阵的截断正态初始化器的标准差。layer_norm_eps(float,可选,默认为 1e-12) — 层归一化层使用的 epsilon。image_size(int,可选,默认为 224) — 每个图像的大小(分辨率)。patch_size(int,可选,默认为 16) — 每个补丁的大小(分辨率)。num_channels(int,可选,默认为 3) — 输入通道数。qkv_bias(bool,可选,默认为True) — 是否为查询、键和值添加偏置。encoder_stride(int,可选,默认为 16) — 用于在解码器头部增加空间分辨率的因子,用于遮蔽图像建模。
这是用于存储 ViTModel 配置的配置类。它用于根据指定的参数实例化 ViT 模型,定义模型架构。使用默认值实例化配置将产生类似于 ViT google/vit-base-patch16-224 架构的配置。
配置对象继承自 PretrainedConfig,可用于控制模型输出。阅读 PretrainedConfig 的文档以获取更多信息。
示例:
>>> from transformers import ViTConfig, ViTModel >>> # Initializing a ViT vit-base-patch16-224 style configuration >>> configuration = ViTConfig() >>> # Initializing a model (with random weights) from the vit-base-patch16-224 style configuration >>> model = ViTModel(configuration) >>> # Accessing the model configuration >>> configuration = model.config
ViTFeatureExtractor
class transformers.ViTFeatureExtractor
( *args **kwargs )
__call__
( images **kwargs )
预处理一张图像或一批图像。
ViTImageProcessor
class transformers.ViTImageProcessor
( do_resize: bool = True size: Optional = None resample: Resampling = <Resampling.BILINEAR: 2> do_rescale: bool = True rescale_factor: Union = 0.00392156862745098 do_normalize: bool = True image_mean: Union = None image_std: Union = None **kwargs )
参数
do_resize(bool,可选,默认为True) — 是否将图像的(高度、宽度)尺寸调整为指定的(size["height"], size["width"])。可以被preprocess方法中的do_resize参数覆盖。size(dict,可选,默认为{"height" -- 224, "width": 224}): 调整大小后输出图像的尺寸。可以被preprocess方法中的size参数覆盖。resample(PILImageResampling,可选,默认为Resampling.BILINEAR) — 如果调整图像大小,则要使用的重采样滤波器。可以被preprocess方法中的resample参数覆盖。do_rescale(bool,可选,默认为True) — 是否按指定比例rescale_factor重新缩放图像。可以被preprocess方法中的do_rescale参数覆盖。rescale_factor(int或float,可选,默认为1/255) — 如果重新缩放图像,则使用的比例因子。可以被preprocess方法中的rescale_factor参数覆盖。do_normalize(bool,可选,默认为True) — 是否对图像进行归一化。可以被preprocess方法中的do_normalize参数覆盖。image_mean(float或List[float],可选,默认为IMAGENET_STANDARD_MEAN) — 如果对图像进行归一化,要使用的均值。这是一个浮点数或与图像通道数相同长度的浮点数列表。可以被preprocess方法中的image_mean参数覆盖。image_std(float或List[float],可选,默认为IMAGENET_STANDARD_STD) — 如果对图像进行归一化,要使用的标准差。这是一个浮点数或与图像通道数相同长度的浮点数列表。可以被preprocess方法中的image_std参数覆盖。
构建一个 ViT 图像处理器。
preprocess
( images: Union do_resize: Optional = None size: Dict = None resample: Resampling = None do_rescale: Optional = None rescale_factor: Optional = None do_normalize: Optional = None image_mean: Union = None image_std: Union = None return_tensors: Union = None data_format: Union = <ChannelDimension.FIRST: 'channels_first'> input_data_format: Union = None **kwargs )
参数
images(ImageInput) — 要预处理的图像。期望单个图像或批量图像,像素值范围为 0 到 255。如果传入像素值在 0 到 1 之间的图像,请设置do_rescale=False。do_resize(bool,可选,默认为self.do_resize) — 是否调整图像大小。size(Dict[str, int],可选,默认为self.size) — 格式为{"height": h, "width": w}的字典,指定调整大小后输出图像的尺寸。resample(PILImageResampling滤波器,可选,默认为self.resample) — 如果调整图像大小,则要使用的PILImageResampling滤波器,例如PILImageResampling.BILINEAR。仅在do_resize设置为True时有效。do_rescale(bool,可选,默认为self.do_rescale) — 是否将图像值重新缩放在 [0 - 1] 之间。rescale_factor(float,可选,默认为self.rescale_factor) — 如果do_rescale设置为True,则重新缩放图像的重新缩放因子。do_normalize(bool,可选,默认为self.do_normalize) — 是否对图像进行归一化。image_mean(float或List[float],可选,默认为self.image_mean) — 如果do_normalize设置为True,要使用的图像均值。image_std(float或List[float],可选,默认为self.image_std) — 如果do_normalize设置为True,要使用的图像标准差。return_tensors(str或TensorType,可选) — 要返回的张量类型。可以是以下之一:
- 未设置: 返回一个
np.ndarray列表。 TensorType.TENSORFLOW或'tf': 返回一个类型为tf.Tensor的批量。TensorType.PYTORCH或'pt': 返回一个类型为torch.Tensor的批量。TensorType.NUMPY或'np': 返回一个类型为np.ndarray的批量。TensorType.JAX或'jax': 返回一个类型为jax.numpy.ndarray的批量。
data_format(ChannelDimension或str,可选,默认为ChannelDimension.FIRST) — 输出图像的通道维度格式。可以是以下之一:
"channels_first"或ChannelDimension.FIRST:图像以(通道数,高度,宽度)格式。"channels_last"或ChannelDimension.LAST:图像以(高度,宽度,通道数)格式。- 未设置:使用输入图像的通道维度格式。
input_data_format(ChannelDimension或str, 可选) — 输入图像的通道维度格式。如果未设置,则从输入图像中推断通道维度格式。可以是以下之一:
"channels_first"或ChannelDimension.FIRST:图像以(通道数,高度,宽度)格式。"channels_last"或ChannelDimension.LAST:图像以(高度,宽度,通道数)格式。"none"或ChannelDimension.NONE:图像以(高度,宽度)格式。
预处理一张图像或一批图像。
PytorchHide Pytorch 内容
ViTModel
class transformers.ViTModel
( config: ViTConfig add_pooling_layer: bool = True use_mask_token: bool = False )
参数
config(ViTConfig) — 具有模型所有参数的模型配置类。使用配置文件初始化不会加载与模型关联的权重,只加载配置。查看 from_pretrained()方法以加载模型权重。
裸 ViT 模型变压器输出原始隐藏状态,没有特定的头部。此模型是 PyTorch torch.nn.Module子类。将其用作常规 PyTorch 模块,并参考 PyTorch 文档以获取有关一般用法和行为的所有相关信息。
forward
( pixel_values: Optional = None bool_masked_pos: Optional = None head_mask: Optional = None output_attentions: Optional = None output_hidden_states: Optional = None interpolate_pos_encoding: Optional = None return_dict: Optional = None ) → export const metadata = 'undefined';transformers.modeling_outputs.BaseModelOutputWithPooling or tuple(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),可选) — 用于使自注意力模块中选择的头部失效的掩码。掩码值选在[0, 1]之间:
- 1 表示头部未被屏蔽,
- 0 表示头部被屏蔽。
output_attentions(bool, 可选) — 是否返回所有注意力层的注意力张量。有关更多详细信息,请参阅返回张量下的attentions。output_hidden_states(bool, 可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请参阅返回张量下的hidden_states。interpolate_pos_encoding(bool, 可选) — 是否插值预训练位置编码。return_dict(bool, 可选) — 是否返回 ModelOutput 而不是普通元组。bool_masked_pos(torch.BoolTensor,形状为(batch_size, num_patches),可选) — 布尔掩码位置。指示哪些补丁被屏蔽(1)哪些没有(0)。
返回
transformers.modeling_outputs.BaseModelOutputWithPooling 或tuple(torch.FloatTensor)
一个 transformers.modeling_outputs.BaseModelOutputWithPooling 或一个torch.FloatTensor元组(如果传递了return_dict=False或config.return_dict=False时)包含各种元素,具体取决于配置(ViTConfig)和输入。
last_hidden_state(形状为(batch_size, sequence_length, hidden_size)的torch.FloatTensor)— 模型最后一层的隐藏状态序列。pooler_output(形状为(batch_size, hidden_size)的torch.FloatTensor)— 序列的第一个标记(分类标记)的最后一层隐藏状态,在通过用于辅助预训练任务的层进一步处理后。例如,对于 BERT 系列模型,这将返回经过线性层和 tanh 激活函数处理后的分类标记。线性层的权重是在预训练期间从下一个句子预测(分类)目标中训练的。hidden_states(tuple(torch.FloatTensor),可选,当传递output_hidden_states=True或config.output_hidden_states=True时返回)— 形状为(batch_size, sequence_length, hidden_size)的torch.FloatTensor元组(如果模型有嵌入层,则为嵌入输出的一个+每层输出的一个)。
模型的每一层输出的隐藏状态以及可选的初始嵌入输出。attentions(tuple(torch.FloatTensor),可选,当传递output_attentions=True或config.output_attentions=True时返回)— 形状为(batch_size, num_heads, sequence_length, sequence_length)的torch.FloatTensor元组(每层一个)。
在自注意力头中使用的注意力 softmax 之后的注意力权重,用于计算加权平均值。
ViTModel 的前向方法,覆盖了__call__特殊方法。
尽管前向传递的步骤需要在此函数内定义,但应该在此之后调用Module实例,而不是在此处调用,因为前者会负责运行预处理和后处理步骤,而后者会默默地忽略它们。
示例:
>>> from transformers import AutoImageProcessor, ViTModel >>> import torch >>> from datasets import load_dataset >>> dataset = load_dataset("huggingface/cats-image") >>> image = dataset["test"]["image"][0] >>> image_processor = AutoImageProcessor.from_pretrained("google/vit-base-patch16-224-in21k") >>> model = ViTModel.from_pretrained("google/vit-base-patch16-224-in21k") >>> inputs = image_processor(image, return_tensors="pt") >>> with torch.no_grad(): ... outputs = model(**inputs) >>> last_hidden_states = outputs.last_hidden_state >>> list(last_hidden_states.shape) [1, 197, 768]
ViTForMaskedImageModeling
class transformers.ViTForMaskedImageModeling
( config: ViTConfig )
参数
config(ViTConfig)— 具有模型所有参数的模型配置类。使用配置文件初始化不会加载与模型关联的权重,只加载配置。查看 from_pretrained()方法以加载模型权重。
ViT 模型在顶部带有解码器,用于遮罩图像建模,如SimMIM中提出的。
请注意,我们在我们的示例目录中提供了一个脚本,用于在自定义数据上预训练此模型。
此模型是 PyTorch torch.nn.Module子类。将其用作常规 PyTorch 模块,并参考 PyTorch 文档以获取与一般用法和行为相关的所有事项。
forward
( pixel_values: Optional = None bool_masked_pos: Optional = None head_mask: Optional = None output_attentions: Optional = None output_hidden_states: Optional = None interpolate_pos_encoding: Optional = None return_dict: Optional = None ) → export const metadata = 'undefined';transformers.modeling_outputs.MaskedImageModelingOutput or tuple(torch.FloatTensor)
参数
pixel_values(形状为(batch_size, num_channels, height, width)的torch.FloatTensor)— 像素值。像素值可以使用 AutoImageProcessor 获取。有关详细信息,请参阅 ViTImageProcessor.call()。head_mask(形状为(num_heads,)或(num_layers, num_heads)的torch.FloatTensor,可选)— 用于使自注意力模块中选择的头部失效的掩码。掩码值选择在[0, 1]中:
- 1 表示头部未被
masked。 - 0 表示头部被
masked。
output_attentions(bool,可选) — 是否返回所有注意力层的注意力张量。有关更多详细信息,请查看返回张量下的attentions。output_hidden_states(bool,可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请查看返回张量下的hidden_states。interpolate_pos_encoding(bool, 可选) — 是否插值预训练位置编码。return_dict(bool,可选) — 是否返回 ModelOutput 而不是普通元组。bool_masked_pos(torch.BoolTensor,形状为(batch_size, num_patches)) — 布尔掩码位置。指示哪些补丁被掩盖(1)哪些不被掩盖(0)。
返回
transformers.modeling_outputs.MaskedImageModelingOutput 或 tuple(torch.FloatTensor)
一个 transformers.modeling_outputs.MaskedImageModelingOutput 或一个 torch.FloatTensor 元组(如果传递了 return_dict=False 或当 config.return_dict=False 时),包含根据配置(ViTConfig)和输入的不同元素。
loss(torch.FloatTensor,形状为(1,),可选,当提供bool_masked_pos时返回) — 重构损失。reconstruction(torch.FloatTensor,形状为(batch_size, num_channels, height, width)) — 重构/完成的图像。hidden_states(tuple(torch.FloatTensor),可选,当传递output_hidden_states=True时返回或whenconfig.output_hidden_states=True) — 形状为(batch_size, sequence_length, hidden_size)的torch.FloatTensor元组(如果模型具有嵌入层,则为嵌入的输出 + 每个阶段的输出)。模型在每个阶段输出的隐藏状态(也称为特征图)。attentions(tuple(torch.FloatTensor),可选,当传递output_attentions=True时返回或config.output_attentions=True):形状为(batch_size, num_heads, patch_size, sequence_length)的torch.FloatTensor元组(每层一个)。注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。
ViTForMaskedImageModeling 的前向方法,覆盖了 __call__ 特殊方法。
虽然前向传递的步骤需要在此函数内定义,但应该在此之后调用 Module 实例,而不是在此处调用,因为前者会负责运行预处理和后处理步骤,而后者会默默地忽略它们。
示例:
>>> from transformers import AutoImageProcessor, ViTForMaskedImageModeling >>> 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("google/vit-base-patch16-224-in21k") >>> model = ViTForMaskedImageModeling.from_pretrained("google/vit-base-patch16-224-in21k") >>> num_patches = (model.config.image_size // model.config.patch_size) ** 2 >>> pixel_values = image_processor(images=image, return_tensors="pt").pixel_values >>> # create random boolean mask of shape (batch_size, num_patches) >>> bool_masked_pos = torch.randint(low=0, high=2, size=(1, num_patches)).bool() >>> outputs = model(pixel_values, bool_masked_pos=bool_masked_pos) >>> loss, reconstructed_pixel_values = outputs.loss, outputs.reconstruction >>> list(reconstructed_pixel_values.shape) [1, 3, 224, 224]
Transformers 4.37 中文文档(七十三)(2)https://developer.aliyun.com/article/1564198