Transformers 文档
卷积视觉Transformer (CvT)
并获取增强的文档体验
开始使用
卷积视觉Transformer (CvT)
概述
CvT 模型在 CvT: Introducing Convolutions to Vision Transformers 中提出,作者是 Haiping Wu, Bin Xiao, Noel Codella, Mengchen Liu, Xiyang Dai, Lu Yuan 和 Lei Zhang。 卷积视觉Transformer (CvT) 通过引入卷积到 ViT 来改进 Vision Transformer (ViT) 的性能和效率,从而发挥两者的最佳设计。
以下是论文的摘要
我们在本文中提出了一种新的架构,名为卷积视觉Transformer (CvT),它通过将卷积引入 ViT 来提高 Vision Transformer (ViT) 的性能和效率,从而发挥两者的最佳设计。 这是通过两个主要的修改实现的:包含新的卷积 token 嵌入的 Transformer 层次结构,以及利用卷积投影的卷积 Transformer 块。 这些更改将卷积神经网络 (CNN) 的理想属性(即平移、缩放和失真不变性)引入到 ViT 架构中,同时保持了 Transformer 的优点(即动态注意力、全局上下文和更好的泛化能力)。 我们通过进行广泛的实验来验证 CvT,结果表明,这种方法在 ImageNet-1k 上实现了优于其他 Vision Transformer 和 ResNet 的最先进性能,同时参数更少,FLOPs 更低。 此外,当在更大的数据集(例如 ImageNet-22k)上进行预训练并微调到下游任务时,性能增益得以保持。 在 ImageNet-22k 上预训练后,我们的 CvT-W24 在 ImageNet-1k val 集上获得了 87.7% 的 top-1 准确率。 最后,我们的结果表明,位置编码是现有 Vision Transformer 中的关键组件,可以在我们的模型中安全地移除,从而简化了更高分辨率视觉任务的设计。
此模型由 anugunj 贡献。 原始代码可以在 这里 找到。
使用技巧
- CvT 模型是常规的 Vision Transformers,但使用卷积进行训练。 当在 ImageNet-1K 和 CIFAR-100 上进行微调时,它们的性能优于 原始模型 (ViT)。
- 您可以查看关于推理以及在自定义数据上进行微调的演示 notebook 这里 (您可以将 ViTFeatureExtractor 替换为 AutoImageProcessor,并将 ViTForImageClassification 替换为 CvtForImageClassification)。
- 可用的 checkpoint 要么是 (1) 仅在 ImageNet-22k(包含 1400 万张图像和 22k 个类别的集合)上预训练,要么是 (2) 也在 ImageNet-22k 上微调,要么是 (3) 也在 ImageNet-1k(也称为 ILSVRC 2012,包含 130 万张图像和 1,000 个类别的集合)上微调。
资源
官方 Hugging Face 和社区(🌎 表示)资源的列表,可帮助您开始使用 CvT。
- CvtForImageClassification 由此 示例脚本 和 notebook 支持。
- 另请参阅:图像分类任务指南
如果您有兴趣提交资源以包含在此处,请随时打开 Pull Request,我们将对其进行审核! 该资源最好能展示一些新的东西,而不是重复现有的资源。
CvtConfig
类 transformers.CvtConfig
< source >( num_channels = 3 patch_sizes = [7, 3, 3] patch_stride = [4, 2, 2] patch_padding = [2, 1, 1] embed_dim = [64, 192, 384] num_heads = [1, 3, 6] depth = [1, 2, 10] mlp_ratio = [4.0, 4.0, 4.0] attention_drop_rate = [0.0, 0.0, 0.0] drop_rate = [0.0, 0.0, 0.0] drop_path_rate = [0.0, 0.0, 0.1] qkv_bias = [True, True, True] cls_token = [False, False, True] qkv_projection_method = ['dw_bn', 'dw_bn', 'dw_bn'] kernel_qkv = [3, 3, 3] padding_kv = [1, 1, 1] stride_kv = [2, 2, 2] padding_q = [1, 1, 1] stride_q = [1, 1, 1] initializer_range = 0.02 layer_norm_eps = 1e-12 **kwargs )
参数
- num_channels (
int
, 可选, 默认为 3) — 输入通道的数量。 - patch_sizes (
List[int]
, 可选, 默认为[7, 3, 3]
) — 每个编码器 patch 嵌入的内核大小。 - patch_stride (
List[int]
, 可选, 默认为[4, 2, 2]
) — 每个编码器 patch 嵌入的步幅大小。 - patch_padding (
List[int]
, 可选, 默认为[2, 1, 1]
) — 每个编码器 patch 嵌入的填充大小。 - embed_dim (
List[int]
, 可选, 默认为[64, 192, 384]
) — 每个编码器块的维度。 - num_heads (
List[int]
, 可选, 默认为[1, 3, 6]
) — Transformer 编码器每个块中每个注意力层注意力头的数量。 - depth (
List[int]
, 可选, 默认为[1, 2, 10]
) — 每个编码器块中的层数。 - mlp_ratios (
List[float]
, 可选, 默认为[4.0, 4.0, 4.0, 4.0]
) — 编码器块中 Mix FFN 的隐藏层大小相对于输入层大小的比率。 - attention_drop_rate (
List[float]
, 可选, 默认为[0.0, 0.0, 0.0]
) — 注意力概率的 dropout 比率。 - drop_rate (
List[float]
, 可选, 默认为[0.0, 0.0, 0.0]
) — patch 嵌入概率的 dropout 比率。 - drop_path_rate (
List[float]
, 可选, 默认为[0.0, 0.0, 0.1]
) — Transformer 编码器块中使用的随机深度 dropout 概率。 - qkv_bias (
List[bool]
, 可选, 默认为[True, True, True]
) — 注意力机制中 query, key 和 value 的偏置布尔值。 - cls_token (
List[bool]
, 可选, 默认为[False, False, True]
) — 是否在最后 3 个阶段的每个阶段的输出中添加分类 token。 - qkv_projection_method (
List[string]
, 可选, 默认为 [“dw_bn”, “dw_bn”, “dw_bn”]`) — query, key 和 value 的投影方法。 默认是带有批归一化的深度卷积。 对于线性投影,请使用 “avg”。 - kernel_qkv (
List[int]
, 可选, 默认为[3, 3, 3]
) — 注意力层中 query, key 和 value 的内核大小。 - padding_kv (
List[int]
, 可选, 默认为[1, 1, 1]
) — 注意力层中 key 和 value 的 padding 大小。 - stride_kv (
List[int]
, 可选, 默认为[2, 2, 2]
) — 注意力层中 key 和 value 的 stride 大小。 - padding_q (
List[int]
, 可选, 默认为[1, 1, 1]
) — 注意力层中 query 的 padding 大小。 - stride_q (
List[int]
, 可选, 默认为[1, 1, 1]
) — 注意力层中 query 的 stride 大小。 - initializer_range (
float
, 可选, 默认为 0.02) — 用于初始化所有权重矩阵的 truncated_normal_initializer 的标准差。 - layer_norm_eps (
float
, 可选, 默认为 1e-6) — 层归一化层使用的 epsilon 值。
这是用于存储 CvtModel 配置的配置类。 它用于根据指定的参数实例化 CvT 模型,定义模型架构。 使用默认值实例化配置将产生类似于 CvT microsoft/cvt-13 架构的配置。
配置对象继承自 PretrainedConfig,可用于控制模型输出。 有关更多信息,请阅读 PretrainedConfig 的文档。
示例
>>> from transformers import CvtConfig, CvtModel
>>> # Initializing a Cvt msft/cvt style configuration
>>> configuration = CvtConfig()
>>> # Initializing a model (with random weights) from the msft/cvt style configuration
>>> model = CvtModel(configuration)
>>> # Accessing the model configuration
>>> configuration = model.config
CvtModel
class transformers.CvtModel
< source >( config add_pooling_layer = True )
参数
- config (CvtConfig) — 带有模型所有参数的模型配置类。 使用配置文件初始化不会加载与模型关联的权重,仅加载配置。 查看 from_pretrained() 方法以加载模型权重。
裸 Cvt 模型 Transformer 输出原始隐藏状态,顶部没有任何特定的 head。 此模型是 PyTorch torch.nn.Module 子类。 将其用作常规 PyTorch 模块,并参阅 PyTorch 文档,了解与常规用法和行为相关的所有事项。
forward
< source >( pixel_values: typing.Optional[torch.Tensor] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None ) → transformers.models.cvt.modeling_cvt.BaseModelOutputWithCLSToken
或 tuple(torch.FloatTensor)
参数
- pixel_values (
torch.FloatTensor
,形状为(batch_size, num_channels, height, width)
) — 像素值。 像素值可以使用 AutoImageProcessor 获得。 有关详细信息,请参阅CvtImageProcessor.__call__
。 - output_hidden_states (
bool
, 可选) — 是否返回所有层的隐藏状态。 有关更多详细信息,请参阅返回张量下的hidden_states
。 - return_dict (
bool
, 可选) — 是否返回 ModelOutput 而不是纯元组。
返回值
transformers.models.cvt.modeling_cvt.BaseModelOutputWithCLSToken
或 tuple(torch.FloatTensor)
一个 transformers.models.cvt.modeling_cvt.BaseModelOutputWithCLSToken
或 torch.FloatTensor
元组 (如果传递了 return_dict=False
或当 config.return_dict=False
时),其中包含各种元素,具体取决于配置 (CvtConfig) 和输入。
- last_hidden_state (
torch.FloatTensor
,形状为(batch_size, sequence_length, hidden_size)
) — 模型最后一层输出的隐藏状态序列。 - cls_token_value (
torch.FloatTensor
,形状为(batch_size, 1, hidden_size)
) — 模型最后一层输出的分类 token 值。 - hidden_states (
tuple(torch.FloatTensor)
, 可选, 当传递output_hidden_states=True
或当config.output_hidden_states=True
时返回) —torch.FloatTensor
的元组(每个层的输出一个,加上嵌入的初始输出),形状为(batch_size, sequence_length, hidden_size)
。 模型在每一层输出端的隐藏状态,加上初始嵌入输出。
CvtModel forward 方法,覆盖了 __call__
特殊方法。
尽管 forward 传递的配方需要在该函数中定义,但应该在此之后调用 Module
实例,而不是此函数,因为前者负责运行预处理和后处理步骤,而后者会静默地忽略它们。
示例
>>> from transformers import AutoImageProcessor, CvtModel
>>> import torch
>>> from datasets import load_dataset
>>> dataset = load_dataset("huggingface/cats-image", trust_remote_code=True)
>>> image = dataset["test"]["image"][0]
>>> image_processor = AutoImageProcessor.from_pretrained("microsoft/cvt-13")
>>> model = CvtModel.from_pretrained("microsoft/cvt-13")
>>> 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, 384, 14, 14]
CvtForImageClassification
class transformers.CvtForImageClassification
< source >( config )
参数
- config (CvtConfig) — 包含模型所有参数的模型配置类。使用配置文件初始化不会加载与模型关联的权重,仅加载配置。查看 from_pretrained() 方法来加载模型权重。
Cvt 模型转换器,顶部带有一个图像分类头([CLS] 标记的最终隐藏状态之上的线性层),例如用于 ImageNet。
此模型是 PyTorch 的 torch.nn.Module 子类。可将其用作常规 PyTorch 模块,并参阅 PyTorch 文档,了解与常规用法和行为相关的所有事项。
forward
< source >( pixel_values: typing.Optional[torch.Tensor] = None labels: typing.Optional[torch.Tensor] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None ) → transformers.modeling_outputs.ImageClassifierOutputWithNoAttention 或 tuple(torch.FloatTensor)
参数
- pixel_values (形状为
(batch_size, num_channels, height, width)
的torch.FloatTensor
) — 像素值。像素值可以使用 AutoImageProcessor 获得。 有关详细信息,请参阅CvtImageProcessor.__call__
。 - output_hidden_states (
bool
, 可选) — 是否返回所有层的隐藏状态。 有关更多详细信息,请参阅返回张量下的hidden_states
。 - return_dict (
bool
, 可选) — 是否返回 ModelOutput 而不是普通元组。 - labels (形状为
(batch_size,)
的torch.LongTensor
, 可选) — 用于计算图像分类/回归损失的标签。索引应在[0, ..., config.num_labels - 1]
中。如果config.num_labels == 1
,则计算回归损失(均方损失)。如果config.num_labels > 1
,则计算分类损失(交叉熵)。
返回值
transformers.modeling_outputs.ImageClassifierOutputWithNoAttention 或 tuple(torch.FloatTensor)
transformers.modeling_outputs.ImageClassifierOutputWithNoAttention 或 torch.FloatTensor
的元组(如果传递了 return_dict=False
或者当 config.return_dict=False
时),其中包含取决于配置 (CvtConfig) 和输入的各种元素。
- loss (形状为
(1,)
的torch.FloatTensor
, 可选,当提供labels
时返回) — 分类(或回归,如果 config.num_labels==1)损失。 - logits (形状为
(batch_size, config.num_labels)
的torch.FloatTensor
) — 分类(或回归,如果 config.num_labels==1)得分(在 SoftMax 之前)。 - hidden_states (
tuple(torch.FloatTensor)
, 可选,当传递了output_hidden_states=True
或者当config.output_hidden_states=True
时返回) —torch.FloatTensor
的元组(对于嵌入的输出,如果模型具有嵌入层,则为一个;对于每个阶段的输出,则为一个),形状为(batch_size, num_channels, height, width)
。模型在每个阶段输出的隐藏状态(也称为特征图)。
CvtForImageClassification 的 forward 方法,覆盖了 __call__
特殊方法。
尽管 forward 传递的配方需要在该函数中定义,但应该在此之后调用 Module
实例,而不是此函数,因为前者负责运行预处理和后处理步骤,而后者会静默地忽略它们。
示例
>>> from transformers import AutoImageProcessor, CvtForImageClassification
>>> import torch
>>> from datasets import load_dataset
>>> dataset = load_dataset("huggingface/cats-image", trust_remote_code=True)
>>> image = dataset["test"]["image"][0]
>>> image_processor = AutoImageProcessor.from_pretrained("microsoft/cvt-13")
>>> model = CvtForImageClassification.from_pretrained("microsoft/cvt-13")
>>> inputs = image_processor(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])
tabby, tabby cat
TFCvtModel
class transformers.TFCvtModel
< source >( config: CvtConfig *inputs **kwargs )
参数
- config (CvtConfig) — 包含模型所有参数的模型配置类。使用配置文件初始化不会加载与模型关联的权重,仅加载配置。查看 from_pretrained() 方法来加载模型权重。
裸 Cvt 模型转换器,输出原始隐藏状态,顶部没有任何特定的头部。
此模型继承自 TFPreTrainedModel。查看超类文档,了解库为其所有模型实现的通用方法(例如,下载或保存、调整输入嵌入大小、剪枝头等)。
此模型也是 keras.Model 子类。可将其用作常规 TF 2.0 Keras 模型,并参阅 TF 2.0 文档,了解与常规用法和行为相关的所有事项。
TF 2.0 模型接受两种输入格式
- 所有输入都作为关键字参数(如 PyTorch 模型),或者
- 所有输入都作为列表、元组或字典放在第一个位置参数中。
当使用 keras.Model.fit
方法时,第二种选择非常有用,该方法当前要求模型调用函数的第一个参数中包含所有张量:model(inputs)
。
call
< source >( pixel_values: tf.Tensor | None = None output_hidden_states: Optional[bool] = None return_dict: Optional[bool] = None training: Optional[bool] = False ) → transformers.models.cvt.modeling_tf_cvt.TFBaseModelOutputWithCLSToken
或 tuple(tf.Tensor)
参数
- pixel_values (
np.ndarray
,tf.Tensor
,List[tf.Tensor]
`Dict[str, tf.Tensor]
或Dict[str, np.ndarray]
,并且每个示例都必须具有形状(batch_size, num_channels, height, width)
) — 像素值。像素值可以使用 AutoImageProcessor 获得。 有关详细信息,请参阅CvtImageProcessor.__call__
。 - output_hidden_states (
bool
, 可选) — 是否返回所有层的隐藏状态。 有关更多详细信息,请参阅返回张量下的hidden_states
。 此参数只能在即时模式下使用,在图模式下,将使用配置中的值。 - return_dict (
bool
, 可选) — 是否返回 ModelOutput 而不是普通元组。 此参数可以在即时模式下使用,在图模式下,该值将始终设置为 True。 - training (
bool
, 可选, 默认为 `False`) — 是否在训练模式下使用模型(某些模块(如 dropout 模块)在训练和评估之间具有不同的行为)。
返回值
transformers.models.cvt.modeling_tf_cvt.TFBaseModelOutputWithCLSToken
或 tuple(tf.Tensor)
transformers.models.cvt.modeling_tf_cvt.TFBaseModelOutputWithCLSToken
或 tf.Tensor
的元组(如果传递了 return_dict=False
或者当 config.return_dict=False
时),其中包含取决于配置 (CvtConfig) 和输入的各种元素。
- last_hidden_state (形状为
(batch_size, sequence_length, hidden_size)
的tf.Tensor
) — 模型最后一层的输出端的隐藏状态序列。 - cls_token_value (形状为
(batch_size, 1, hidden_size)
的tf.Tensor
) — 模型最后一层的输出端的分类标记。 - hidden_states (
tuple(tf.Tensor)
, 可选,当传递了output_hidden_states=True
或者当config.output_hidden_states=True
时返回) —tf.Tensor
的元组(对于嵌入的输出,则为一个;对于每一层的输出,则为一个),形状为(batch_size, sequence_length, hidden_size)
。模型在每一层输出的隐藏状态,加上初始嵌入输出。
TFCvtModel 的 forward 方法,覆盖了 __call__
特殊方法。
尽管 forward 传递的配方需要在该函数中定义,但应该在此之后调用 Module
实例,而不是此函数,因为前者负责运行预处理和后处理步骤,而后者会静默地忽略它们。
示例
>>> from transformers import AutoImageProcessor, TFCvtModel
>>> 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("microsoft/cvt-13")
>>> model = TFCvtModel.from_pretrained("microsoft/cvt-13")
>>> inputs = image_processor(images=image, return_tensors="tf")
>>> outputs = model(**inputs)
>>> last_hidden_states = outputs.last_hidden_state
TFCvtForImageClassification
class transformers.TFCvtForImageClassification
< source >( config: CvtConfig *inputs **kwargs )
参数
- config (CvtConfig) — 包含模型所有参数的模型配置类。使用配置文件初始化不会加载与模型关联的权重,仅加载配置。查看 from_pretrained() 方法来加载模型权重。
Cvt 模型转换器,顶部带有一个图像分类头([CLS] 标记的最终隐藏状态之上的线性层),例如用于 ImageNet。
此模型继承自 TFPreTrainedModel。查看超类文档,了解库为其所有模型实现的通用方法(例如,下载或保存、调整输入嵌入大小、剪枝头等)。
此模型也是 keras.Model 子类。可将其用作常规 TF 2.0 Keras 模型,并参阅 TF 2.0 文档,了解与常规用法和行为相关的所有事项。
TF 2.0 模型接受两种输入格式
- 所有输入都作为关键字参数(如 PyTorch 模型),或者
- 所有输入都作为列表、元组或字典放在第一个位置参数中。
当使用 keras.Model.fit
方法时,第二种选择非常有用,该方法当前要求模型调用函数的第一个参数中包含所有张量:model(inputs)
。
call
< source >( pixel_values: tf.Tensor | None = None labels: tf.Tensor | None = None output_hidden_states: Optional[bool] = None return_dict: Optional[bool] = None training: Optional[bool] = False ) → transformers.modeling_tf_outputs.TFImageClassifierOutputWithNoAttention
或 tuple(tf.Tensor)
参数
- pixel_values (
np.ndarray
,tf.Tensor
,List[tf.Tensor]
`Dict[str, tf.Tensor]
或Dict[str, np.ndarray]
,并且每个示例都必须具有形状(batch_size, num_channels, height, width)
) — 像素值。像素值可以使用 AutoImageProcessor 获得。 有关详细信息,请参阅CvtImageProcessor.__call__
。 - output_hidden_states (
bool
, 可选) — 是否返回所有层的隐藏状态。 有关更多详细信息,请参阅返回张量下的hidden_states
。 此参数只能在即时模式下使用,在图模式下,将使用配置中的值。 - return_dict (
bool
, 可选) — 是否返回 ModelOutput 而不是普通元组。此参数可以在 eager 模式下使用,在 graph 模式下该值将始终设置为 True。 - training (
bool
, 可选, 默认为 `False`) — 是否在训练模式下使用模型(某些模块如 dropout 模块在训练和评估之间有不同的行为)。 - labels (
tf.Tensor
或np.ndarray
,形状为(batch_size,)
, 可选) — 用于计算图像分类/回归损失的标签。索引应在[0, ..., config.num_labels - 1]
范围内。如果config.num_labels == 1
,则计算回归损失(均方误差损失);如果config.num_labels > 1
,则计算分类损失(交叉熵损失)。
返回值
transformers.modeling_tf_outputs.TFImageClassifierOutputWithNoAttention
或 tuple(tf.Tensor)
一个 transformers.modeling_tf_outputs.TFImageClassifierOutputWithNoAttention
或 tf.Tensor 的元组 (如果传递了 return_dict=False
或当 config.return_dict=False
时),包含取决于配置 (CvtConfig) 和输入的各种元素。
- loss (
tf.Tensor
,形状为(1,)
, 可选, 当提供labels
时返回) — 分类(或回归,如果 config.num_labels==1)损失。 - logits (
tf.Tensor
,形状为(batch_size, config.num_labels)
) — 分类(或回归,如果 config.num_labels==1)得分(在 SoftMax 之前)。 - hidden_states (
tuple(tf.Tensor)
, 可选, 当传递output_hidden_states=True
或当config.output_hidden_states=True
时返回) —tf.Tensor
的元组 (如果模型具有嵌入层,则一个用于嵌入的输出;+ 每个阶段的输出一个),形状为(batch_size, num_channels, height, width)
。模型在每个阶段输出的隐藏状态(也称为特征图)。
TFCvtForImageClassification
的 forward 方法,覆盖了 __call__
特殊方法。
尽管 forward 传递的配方需要在该函数中定义,但应该在此之后调用 Module
实例,而不是此函数,因为前者负责运行预处理和后处理步骤,而后者会静默地忽略它们。
示例
>>> from transformers import AutoImageProcessor, TFCvtForImageClassification
>>> import tensorflow as tf
>>> 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("microsoft/cvt-13")
>>> model = TFCvtForImageClassification.from_pretrained("microsoft/cvt-13")
>>> inputs = image_processor(images=image, return_tensors="tf")
>>> outputs = model(**inputs)
>>> logits = outputs.logits
>>> # model predicts one of the 1000 ImageNet classes
>>> predicted_class_idx = tf.math.argmax(logits, axis=-1)[0]
>>> print("Predicted class:", model.config.id2label[int(predicted_class_idx)])