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