Transformers 文档
ViTMAE
并获得增强的文档体验
开始使用
该模型于 2021 年 11 月 11 日发布在 HF papers 上,并于 2022 年 1 月 18 日贡献给 Hugging Face Transformers。
ViTMAE
ViTMAE 是一种自监督视觉模型,通过掩盖图像的很大一部分(约 75%)进行预训练。编码器处理可见的图像分块(patches),解码器则从编码后的分块和掩码标记(mask tokens)中重建丢失的像素。预训练完成后,编码器可以重新用于图像分类或目标检测等下游任务——其表现通常优于通过监督学习训练的模型。
你可以在 AI at Meta 组织下找到所有原始的 ViTMAE 检查点(checkpoints)。
点击右侧边栏中的 ViTMAE 模型,获取有关如何将 ViTMAE 应用于视觉任务的更多示例。
下面的示例演示了如何使用 ViTMAEForPreTraining 类来重建丢失的像素。
import requests
import torch
from PIL import Image
from transformers import ViTImageProcessor, ViTMAEForPreTraining
url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg"
image = Image.open(requests.get(url, stream=True).raw)
processor = ViTImageProcessor.from_pretrained("facebook/vit-mae-base")
inputs = processor(image, return_tensors="pt").to(model.device)
inputs = {k: v.to(model.device) for k, v in inputs.items()}
model = ViTMAEForPreTraining.from_pretrained("facebook/vit-mae-base", attn_implementation="sdpa", device_map="auto")
with torch.no_grad():
outputs = model(**inputs)
reconstruction = outputs.logits注意事项
- ViTMAE 通常分为两个阶段使用:首先使用 ViTMAEForPreTraining 进行自监督预训练,然后丢弃解码器并对编码器进行微调。微调后,权重可以加载到类似 ViTForImageClassification 的模型中。
- 使用 ViTImageProcessor 进行输入准备。
资源
- 参考此 notebook 学习如何可视化从 ViTMAEForPreTraining 重建出的像素。
ViTMAEConfig
class transformers.ViTMAEConfig
< 源文件 >( transformers_version: str | None = None architectures: list[str] | None = None output_hidden_states: bool | None = False return_dict: bool | None = True dtype: typing.Union[str, ForwardRef('torch.dtype'), NoneType] = None chunk_size_feed_forward: int = 0 is_encoder_decoder: bool = False id2label: dict[int, str] | dict[str, str] | None = None label2id: dict[str, int] | dict[str, str] | None = None problem_type: typing.Optional[typing.Literal['regression', 'single_label_classification', 'multi_label_classification']] = None hidden_size: int = 768 num_hidden_layers: int = 12 num_attention_heads: int = 12 intermediate_size: int = 3072 hidden_act: str = 'gelu' hidden_dropout_prob: float | int = 0.0 attention_probs_dropout_prob: float | int = 0.0 initializer_range: float = 0.02 layer_norm_eps: float = 1e-12 image_size: int | list[int] | tuple[int, int] = 224 patch_size: int | list[int] | tuple[int, int] = 16 num_channels: int = 3 qkv_bias: bool = True decoder_num_attention_heads: int = 16 decoder_hidden_size: int = 512 decoder_num_hidden_layers: int = 8 decoder_intermediate_size: int = 2048 mask_ratio: float = 0.75 norm_pix_loss: bool = False )
参数
- 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) — 嵌入层、编码器和池化层中所有全连接层的丢弃概率。 - attention_probs_dropout_prob (
Union[float, int], 可选, 默认为0.0) — 注意力概率的丢弃比率。 - initializer_range (
float, 可选, 默认为0.02) — 用于初始化所有权重矩阵的截断正态分布初始化器(truncated_normal_initializer)的标准差。 - layer_norm_eps (
float, 可选, 默认为1e-12) — 层归一化层使用的 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) — 是否为查询(queries)、键(keys)和值(values)添加偏置。 - decoder_num_attention_heads (
int, 可选, 默认为16) — Transformer 解码器中每个注意力层的注意力头数量。 - decoder_hidden_size (
int, 可选, 默认为512) — 隐藏表示的维度。 - decoder_num_hidden_layers (
int, 可选, 默认为 8) — 解码器中的隐藏层数量。 - decoder_intermediate_size (
int, 可选, 默认为2048) — MLP 表示的维度。 - mask_ratio (
float, 可选, 默认为 0.75) — 输入序列中被掩盖的标记比例。 - norm_pix_loss (
bool, 可选, 默认为False) — 是否使用归一化像素进行训练(参见论文中的表 3)。作者在实验中发现,使用归一化像素提高了表示质量。
这是用于存储 ViTMAEModel 配置的配置类。它根据指定的参数实例化一个 ViTMAE 模型,定义模型架构。使用默认值实例化配置将产生与 facebook/vit-mae-base 类似的配置。
配置对象继承自 PreTrainedConfig,可用于控制模型输出。阅读 PreTrainedConfig 的文档以获取更多信息。
示例
>>> from transformers import ViTMAEConfig, ViTMAEModel
>>> # Initializing a ViT MAE vit-mae-base style configuration
>>> configuration = ViTMAEConfig()
>>> # Initializing a model (with random weights) from the vit-mae-base style configuration
>>> model = ViTMAEModel(configuration)
>>> # Accessing the model configuration
>>> configuration = model.configViTMAEModel
原始的 ViTMAE 模型,输出原始隐藏状态,顶部没有任何特定任务头(head)。
该模型继承自 PreTrainedModel。请查看超类文档以了解该库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、剪枝头部等)。
此模型也是一个 PyTorch torch.nn.Module 子类。像普通的 PyTorch Module 一样使用它,并参考 PyTorch 文档了解一般用法和行为的所有相关信息。
forward
< 源文件 >( pixel_values: torch.Tensor | None = None noise: torch.Tensor | None = None interpolate_pos_encoding: bool | None = None attention_mask: torch.Tensor | None = None **kwargs: typing_extensions.Unpack[transformers.utils.generic.TransformersKwargs] ) → ViTMAEModelOutput 或 tuple(torch.FloatTensor)
参数
- pixel_values (形状为
(batch_size, num_channels, image_size, image_size)的torch.Tensor,可选) — 对应于输入图像的张量。像素值可以使用 ViTImageProcessor 获取。详情请参阅ViTImageProcessor.__call__()(processor_class使用 ViTImageProcessor 来处理图像)。 - noise (形状为
(batch_size, sequence_length)的torch.FloatTensor,可选) — 主要用于测试目的,以控制随机性并保持可复现性。 - interpolate_pos_encoding (
bool,可选,默认值为False) — 是否对预训练的位置编码进行插值。这主要用于在更高分辨率的图像上使用该模型。 - attention_mask (形状为
(batch_size, sequence_length)的torch.Tensor,可选) — 用于避免对填充标记索引执行注意力计算的掩码。掩码值选自[0, 1]:- 1 表示未遮盖的标记,
- 0 表示被遮盖的标记。
返回
ViTMAEModelOutput 或 tuple(torch.FloatTensor)
ViTMAEModelOutput 或 torch.FloatTensor 元组(如果传递了 return_dict=False 或当 config.return_dict=False 时),根据配置(ViTMAEConfig)和输入包含不同的元素。
ViTMAEModel 的前向传播方法,覆盖了 __call__ 特殊方法。
虽然 forward pass 的实现需要在此函数中定义,但你应该在之后调用
Module实例而不是这个,因为前者负责运行预处理和后处理步骤,而后者会静默地忽略它们。
last_hidden_state (形状为
(batch_size, sequence_length, hidden_size)的torch.FloatTensor, 可选,默认为None) — 模型最后一层输出的隐藏状态序列。mask (形状为
(batch_size, sequence_length)的torch.FloatTensor) — 指示哪些分块(patch)被遮盖 (1) 哪些未被遮盖 (0) 的张量。ids_restore (形状为
(batch_size, sequence_length)的torch.LongTensor) — 包含(已打乱的)被遮盖分块的原始索引的张量。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, ViTMAEModel
>>> from PIL import Image
>>> 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-mae-base")
>>> model = ViTMAEModel.from_pretrained("facebook/vit-mae-base")
>>> inputs = image_processor(images=image, return_tensors="pt")
>>> outputs = model(**inputs)
>>> last_hidden_states = outputs.last_hidden_stateViTMAEForPreTraining
class transformers.ViTMAEForPreTraining
< 源码 >( config: ViTMAEConfig )
参数
- config (ViTMAEConfig) — 具有模型所有参数的模型配置类。使用配置文件初始化不会加载与模型相关的权重,仅加载配置。查看 from_pretrained() 方法以加载模型权重。
带有解码器的 ViTMAE 模型转换器,用于自监督预训练。
请注意,我们在 examples directory 中提供了一个脚本,用于在自定义数据上预训练此模型。
该模型继承自 PreTrainedModel。请查看超类文档以了解该库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、剪枝头部等)。
此模型也是一个 PyTorch torch.nn.Module 子类。像普通的 PyTorch Module 一样使用它,并参考 PyTorch 文档了解一般用法和行为的所有相关信息。
forward
< 源码 >( pixel_values: torch.Tensor | None = None noise: torch.Tensor | None = None interpolate_pos_encoding: bool | None = None attention_mask: torch.Tensor | None = None **kwargs: typing_extensions.Unpack[transformers.utils.generic.TransformersKwargs] ) → ViTMAEForPreTrainingOutput 或 tuple(torch.FloatTensor)
参数
- pixel_values (形状为
(batch_size, num_channels, image_size, image_size)的torch.Tensor,可选) — 对应于输入图像的张量。像素值可以使用 ViTImageProcessor 获取。详情请参阅ViTImageProcessor.__call__()(processor_class使用 ViTImageProcessor 来处理图像)。 - noise (形状为
(batch_size, sequence_length)的torch.FloatTensor,可选) — 主要用于测试目的,以控制随机性并保持可复现性。 - interpolate_pos_encoding (
bool,可选,默认值为False) — 是否对预训练的位置编码进行插值。这主要用于在更高分辨率的图像上使用该模型。 - attention_mask (形状为
(batch_size, sequence_length)的torch.Tensor,可选) — 用于避免对填充标记索引执行注意力计算的掩码。掩码值选自[0, 1]:- 1 表示未遮盖的标记,
- 0 表示被遮盖的标记。
返回
ViTMAEForPreTrainingOutput 或 tuple(torch.FloatTensor)
ViTMAEForPreTrainingOutput 或 torch.FloatTensor 元组(如果传递了 return_dict=False 或当 config.return_dict=False 时),根据配置(ViTMAEConfig)和输入包含不同的元素。
ViTMAEForPreTraining 的前向传播方法,覆盖了 __call__ 特殊方法。
虽然 forward pass 的实现需要在此函数中定义,但你应该在之后调用
Module实例而不是这个,因为前者负责运行预处理和后处理步骤,而后者会静默地忽略它们。
loss (
torch.FloatTensor,形状为(1,)) — 像素重建损失。logits (形状为
(batch_size, sequence_length, patch_size ** 2 * num_channels)的torch.FloatTensor) — 像素重构对数(logits)。mask (形状为
(batch_size, sequence_length)的torch.FloatTensor) — 指示哪些分块(patch)被遮盖 (1) 哪些未被遮盖 (0) 的张量。ids_restore (形状为
(batch_size, sequence_length)的torch.LongTensor) — 包含(已打乱的)被遮盖分块的原始索引的张量。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, ViTMAEForPreTraining
>>> from PIL import Image
>>> 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())).convert("RGB")
>>> image_processor = AutoImageProcessor.from_pretrained("facebook/vit-mae-base")
>>> model = ViTMAEForPreTraining.from_pretrained("facebook/vit-mae-base")
>>> inputs = image_processor(images=image, return_tensors="pt")
>>> outputs = model(**inputs)
>>> loss = outputs.loss
>>> mask = outputs.mask
>>> ids_restore = outputs.ids_restore