SwiftFormer
概述
SwiftFormer模型由Abdelrahman Shaker、Muhammad Maaz、Hanoona Rasheed、Salman Khan、Ming-Hsuan Yang和Fahad Shahbaz Khan在SwiftFormer: Efficient Additive Attention for Transformer-based Real-time Mobile Vision Applications中提出。
SwiftFormer 论文介绍了一种新颖的高效加法注意力机制,该机制有效地将自注意力计算中的二次矩阵乘法操作替换为线性元素乘法。基于此,构建了一系列名为‘SwiftFormer’的模型,这些模型在准确性和移动推理速度方面均达到了最先进的性能。即使是它们的小型变体,在 iPhone 14 上也仅需 0.8 毫秒的延迟即可达到 78.5% 的 ImageNet1K 准确率,与 MobileViT-v2 相比,不仅更准确,而且速度快了 2 倍。
论文的摘要如下:
自注意力机制已成为在各种视觉应用中捕捉全局上下文的事实选择。然而,其与图像分辨率相关的二次计算复杂性限制了其在实时应用中的使用,特别是在资源受限的移动设备上。尽管已经提出了混合方法来结合卷积和自注意力的优势以实现更好的速度-准确性权衡,但自注意力中昂贵的矩阵乘法操作仍然是一个瓶颈。在这项工作中,我们引入了一种新颖的高效加法注意力机制,有效地用线性元素乘法取代了二次矩阵乘法操作。我们的设计表明,键值交互可以用线性层替换而不牺牲任何准确性。与之前的最先进方法不同,我们对自注意力的高效表述使其能够在网络的各个阶段使用。使用我们提出的高效加法注意力,我们构建了一系列名为“SwiftFormer”的模型,这些模型在准确性和移动推理速度方面都达到了最先进的性能。我们的小型变体在iPhone 14上仅需0.8毫秒的延迟即可达到78.5%的ImageNet-1K top-1准确率,比MobileViT-v2更准确且快2倍。
该模型由shehan97贡献。TensorFlow版本由joaocmd贡献。 原始代码可以在这里找到。
SwiftFormerConfig
类 transformers.SwiftFormerConfig
< source >( image_size = 224 num_channels = 3 depths = [3, 3, 6, 4] embed_dims = [48, 56, 112, 220] mlp_ratio = 4 downsamples = [True, True, True, True] hidden_act = 'gelu' down_patch_size = 3 down_stride = 2 down_pad = 1 drop_path_rate = 0.0 drop_mlp_rate = 0.0 drop_conv_encoder_rate = 0.0 use_layer_scale = True layer_scale_init_value = 1e-05 batch_norm_eps = 1e-05 **kwargs )
参数
- image_size (
int
, optional, defaults to 224) — 每张图片的大小(分辨率) - num_channels (
int
, optional, defaults to 3) — 输入通道的数量 - depths (
List[int]
, optional, defaults to[3, 3, 6, 4]
) — 每个阶段的深度 - embed_dims (
List[int]
, optional, defaults to[48, 56, 112, 220]
) — 每个阶段的嵌入维度 - mlp_ratio (
int
, optional, defaults to 4) — MLP隐藏维度大小与其输入维度大小的比率。 - downsamples (
List[bool]
, 可选, 默认为[True, True, True, True]
) — 是否在两个阶段之间对输入进行下采样。 - hidden_act (
str
, 可选, 默认为"gelu"
) — 非线性激活函数(字符串)。支持"gelu"
,"relu"
,"selu"
和"gelu_new"
. - down_patch_size (
int
, optional, defaults to 3) — 下采样层中补丁的大小。 - down_stride (
int
, optional, defaults to 2) — 下采样层中卷积核的步幅。 - down_pad (
int
, optional, 默认为 1) — 下采样层中的填充。 - drop_path_rate (
float
, optional, 默认为 0.0) — 在 DropPath 中增加 dropout 概率的速率。 - drop_mlp_rate (
float
, optional, defaults to 0.0) — SwiftFormer的MLP组件的丢弃率。 - drop_conv_encoder_rate (
float
, optional, defaults to 0.0) — SwiftFormer的ConvEncoder组件的dropout率。 - use_layer_scale (
bool
, optional, defaults toTrue
) — 是否对来自token mixers的输出进行缩放. - layer_scale_init_value (
float
, optional, 默认为 1e-05) — 用于缩放来自标记混合器的输出的因子。 - batch_norm_eps (
float
, optional, defaults to 1e-05) — 批归一化层使用的epsilon值。
这是用于存储SwiftFormerModel配置的配置类。它用于根据指定的参数实例化一个SwiftFormer模型,定义模型架构。使用默认值实例化配置将产生与MBZUAI/swiftformer-xs架构类似的配置。
配置对象继承自PretrainedConfig,可用于控制模型输出。阅读PretrainedConfig的文档以获取更多信息。
示例:
>>> from transformers import SwiftFormerConfig, SwiftFormerModel
>>> # Initializing a SwiftFormer swiftformer-base-patch16-224 style configuration
>>> configuration = SwiftFormerConfig()
>>> # Initializing a model (with random weights) from the swiftformer-base-patch16-224 style configuration
>>> model = SwiftFormerModel(configuration)
>>> # Accessing the model configuration
>>> configuration = model.config
SwiftFormerModel
类 transformers.SwiftFormerModel
< source >( config: SwiftFormerConfig )
参数
- config (SwiftFormerConfig) — 包含模型所有参数的模型配置类。 使用配置文件初始化不会加载与模型相关的权重,只会加载配置。查看 from_pretrained() 方法以加载模型权重。
裸的SwiftFormer模型变压器输出原始隐藏状态,没有任何特定的头部。 这个模型是一个PyTorch torch.nn.Module 子类。使用它 作为一个常规的PyTorch模块,并参考PyTorch文档以获取与一般使用和行为相关的所有事项。
前进
< source >( pixel_values: typing.Optional[torch.Tensor] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None ) → transformers.modeling_outputs.BaseModelOutputWithNoAttention
或 tuple(torch.FloatTensor)
参数
- pixel_values (
torch.FloatTensor
of shape(batch_size, num_channels, height, width)
) — 像素值。像素值可以使用AutoImageProcessor获取。详情请参见ViTImageProcessor.call()。 - output_hidden_states (
bool
, 可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请参见返回张量下的hidden_states
。 - return_dict (
bool
, 可选) — 是否返回一个 ModelOutput 而不是一个普通的元组。
返回
transformers.modeling_outputs.BaseModelOutputWithNoAttention
或 tuple(torch.FloatTensor)
一个 transformers.modeling_outputs.BaseModelOutputWithNoAttention
或一个由
torch.FloatTensor
组成的元组(如果传递了 return_dict=False
或当 config.return_dict=False
时),包含各种
元素,具体取决于配置(SwiftFormerConfig)和输入。
-
last_hidden_state (
torch.FloatTensor
形状为(batch_size, num_channels, height, width)
) — 模型最后一层输出的隐藏状态序列。 -
hidden_states (
tuple(torch.FloatTensor)
, 可选, 当传递了output_hidden_states=True
或当config.output_hidden_states=True
时返回) — 由torch.FloatTensor
组成的元组(一个用于嵌入层的输出,如果模型有嵌入层,+ 一个用于每一层的输出)形状为(batch_size, num_channels, height, width)
。模型在每一层输出时的隐藏状态加上可选的初始嵌入输出。
SwiftFormerModel 的 forward 方法,重写了 __call__
特殊方法。
尽管前向传递的配方需要在此函数内定义,但之后应该调用Module
实例而不是这个,因为前者负责运行预处理和后处理步骤,而后者会默默地忽略它们。
示例:
>>> from transformers import AutoImageProcessor, SwiftFormerModel
>>> 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("MBZUAI/swiftformer-xs")
>>> model = SwiftFormerModel.from_pretrained("MBZUAI/swiftformer-xs")
>>> 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, 220, 7, 7]
SwiftFormerForImageClassification
类 transformers.SwiftFormerForImageClassification
< source >( config: SwiftFormerConfig )
参数
- config (SwiftFormerConfig) — 包含模型所有参数的模型配置类。 使用配置文件初始化不会加载与模型相关的权重,只会加载配置。查看 from_pretrained() 方法以加载模型权重。
SwiftFormer 模型转换器,顶部带有图像分类头(例如用于 ImageNet)。
该模型是一个PyTorch torch.nn.Module 子类。将其用作常规的PyTorch模块,并参考PyTorch文档以获取与一般使用和行为相关的所有信息。
前进
< 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 (
torch.FloatTensor
of shape(batch_size, num_channels, height, width)
) — 像素值。像素值可以使用AutoImageProcessor获取。详情请参见ViTImageProcessor.call()。 - output_hidden_states (
bool
, 可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请参见返回张量下的hidden_states
。 - return_dict (
bool
, 可选) — 是否返回一个 ModelOutput 而不是一个普通的元组。 - labels (
torch.LongTensor
形状为(batch_size,)
, 可选) — 用于计算图像分类/回归损失的标签。索引应在[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
时),包含各种
元素,具体取决于配置(SwiftFormerConfig)和输入。
- 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, num_channels, height, width)
。模型在每个阶段输出的隐藏状态(也称为特征图)。
SwiftFormerForImageClassification 的前向方法,重写了 __call__
特殊方法。
尽管前向传递的配方需要在此函数内定义,但之后应该调用Module
实例而不是这个,因为前者负责运行预处理和后处理步骤,而后者会默默地忽略它们。
示例:
>>> from transformers import AutoImageProcessor, SwiftFormerForImageClassification
>>> 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("MBZUAI/swiftformer-xs")
>>> model = SwiftFormerForImageClassification.from_pretrained("MBZUAI/swiftformer-xs")
>>> 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
TFSwiftFormerModel
类 transformers.TFSwiftFormerModel
< source >( config: SwiftFormerConfig *inputs **kwargs )
参数
- config (SwiftFormerConfig) — 包含模型所有参数的模型配置类。 使用配置文件初始化不会加载与模型相关的权重,只会加载配置。查看 from_pretrained() 方法以加载模型权重。
裸的TFSwiftFormer模型转换器输出原始隐藏状态,没有任何特定的头部。 该模型继承自TFPreTrainedModel。请查看超类文档以了解库为其所有模型实现的通用方法(如下载或保存、调整输入嵌入大小、修剪头部等)。
该模型也是一个keras.Model子类。可以将其作为常规的TF 2.0 Keras模型使用,并参考TF 2.0文档以了解与一般使用和行为相关的所有事项。
TF 2.0 模型接受两种格式作为输入:
- 将所有输入作为关键字参数(如PyTorch模型),或
- 将所有输入作为列表、元组或字典放在第一个位置参数中。
当使用
keras.Model.fit
方法时,这第二种选项非常有用,因为该方法目前要求将所有张量放在模型调用函数的第一个参数中:model(inputs)
。 如果选择这第二种选项,有三种可能性可以用来在第一个位置参数中收集所有输入张量: - 仅包含
input_ids
的单个张量,没有其他内容:model(input_ids)
- 一个长度不定的列表,包含一个或多个输入张量,按照文档字符串中给出的顺序:
model([input_ids, attention_mask])
或model([input_ids, attention_mask, token_type_ids])
- 一个字典,包含一个或多个与文档字符串中给出的输入名称相关联的输入张量:
model({"input_ids": input_ids, "token_type_ids": token_type_ids})
调用
< source >( pixel_values: typing.Optional[tensorflow.python.framework.tensor.Tensor] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None training: bool = False )
参数
- pixel_values (
tf.Tensor
形状为(batch_size, num_channels, height, width)
) — 像素值。像素值可以使用 AutoImageProcessor 获取。详情请参见 ViTImageProcessor.call()。 - output_hidden_states (
bool
, 可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请参见返回张量下的hidden_states
。 - return_dict (
bool
, 可选) — 是否返回一个 ModelOutput 而不是一个普通的元组。 - 训练 (
bool
, 可选, 默认为False
) — 是否在训练模式下运行模型。
TFSwiftFormerModel 的前向方法,重写了 __call__
特殊方法。
尽管前向传递的配方需要在此函数内定义,但之后应该调用Module
实例而不是这个,因为前者负责运行预处理和后处理步骤,而后者会默默地忽略它们。
TFSwiftFormerForImageClassification
类 transformers.TFSwiftFormerForImageClassification
< source >( config: SwiftFormerConfig **kwargs )
参数
- config (SwiftFormerConfig) — 包含模型所有参数的模型配置类。 使用配置文件初始化不会加载与模型相关的权重,只会加载配置。查看 from_pretrained() 方法以加载模型权重。
TFSwiftFormer 模型转换器,顶部带有图像分类头(例如用于 ImageNet)。
该模型继承自 TFPreTrainedModel。请查看超类文档以了解库为其所有模型实现的通用方法(如下载或保存、调整输入嵌入的大小、修剪头部等)。
该模型也是一个keras.Model子类。可以将其作为常规的TF 2.0 Keras模型使用,并参考TF 2.0文档以了解与一般使用和行为相关的所有事项。
TF 2.0 模型接受两种格式作为输入:
- 将所有输入作为关键字参数(如PyTorch模型),或
- 将所有输入作为列表、元组或字典放在第一个位置参数中。
当使用
keras.Model.fit
方法时,这第二种选项非常有用,因为该方法目前要求将所有张量放在模型调用函数的第一个参数中:model(inputs)
。 如果选择这第二种选项,有三种可能性可以用来在第一个位置参数中收集所有输入张量: - 仅包含
input_ids
的单个张量,没有其他内容:model(input_ids)
- 一个长度不定的列表,包含一个或多个输入张量,按照文档字符串中给出的顺序:
model([input_ids, attention_mask])
或model([input_ids, attention_mask, token_type_ids])
- 一个字典,包含一个或多个与文档字符串中给出的输入名称相关联的输入张量:
model({"input_ids": input_ids, "token_type_ids": token_type_ids})
调用
< source >( pixel_values: typing.Optional[tensorflow.python.framework.tensor.Tensor] = None labels: typing.Optional[tensorflow.python.framework.tensor.Tensor] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None training: bool = False )
参数
- pixel_values (
tf.Tensor
of shape(batch_size, num_channels, height, width)
) — 像素值。像素值可以使用AutoImageProcessor获取。详情请参见ViTImageProcessor.call()。 - output_hidden_states (
bool
, 可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请参见返回张量下的hidden_states
。 - return_dict (
bool
, 可选) — 是否返回一个ModelOutput而不是一个普通的元组。 - 训练 (
bool
, 可选, 默认为False
) — 是否在训练模式下运行模型。 - labels (
tf.Tensor
形状为(batch_size,)
, 可选) — 用于计算图像分类/回归损失的标签。索引应在[0, ..., config.num_labels - 1]
范围内。如果config.num_labels == 1
,则计算回归损失(均方损失),如果config.num_labels > 1
,则计算分类损失(交叉熵)。
TFSwiftFormerForImageClassification 的前向方法,重写了 __call__
特殊方法。
尽管前向传递的配方需要在此函数内定义,但之后应该调用Module
实例而不是这个,因为前者负责运行预处理和后处理步骤,而后者会默默地忽略它们。