SwiftFormer
概述
SwiftFormer模型由Abdelrahman Shaker、Muhammad Maaz、Hanoona Rasheed、Salman Khan、Ming-Hsuan Yang、Fahad Shahbaz Khan在文章《SwiftFormer: 高效的增量注意力机制,用于基于Transformer的实时移动视觉应用》中提出,见arXiv:2303.15446。
SwiftFormer论文介绍了一种新颖高效的加性注意力机制,它有效地将自注意力计算中的二次矩阵乘法操作替换为线性逐元素乘法。在这一机制的基础上,构建了一系列名为“SwiftFormer”的模型,在准确性和移动推理速度方面均取得了最先进的性能。即使是其小型变体,在iPhone 14上也实现了78.5%的ImageNet1K top-1准确率,只需0.8毫秒的延迟,比MobileViT-v2更准确且快2倍。
文章的摘要如下:
自注意力已成为各种视觉应用中捕获全局上下文的事实上的选择。然而,随着图像分辨率的增加,它的二次计算复杂度限制了其在实时应用中的使用,尤其是在资源受限的移动设备上。虽然已有混合方法提出,旨在结合卷积和自注意力的优点,以实现更好的速度-精度权衡,但自注意力中昂贵的矩阵乘法操作仍然是一个瓶颈。在这项工作中,我们引入了一种新颖高效的加性注意力机制,它有效地将二次矩阵乘法操作替换为线性逐元素乘法。我们的设计表明,关键值交互可以通过线性层来替换,而不会牺牲任何精度。与之前的最先进方法不同,我们高效的自我注意力公式使其在整个网络的所有阶段都能使用。使用我们提出的高效加性注意力,我们构建了一系列名为“SwiftFormer”的模型,在准确性和移动推理速度方面都实现了最先进的性能。我们的小型变体在iPhone 14上实现了78.5%的ImageNet-1K top-1准确率,仅需0.8毫秒的延迟,比MobileViT-v2更准确且快2倍。
此模型由shehan97提供。TensorFlow版本由joaocmd提供。原始代码可在此处找到。
SwiftFormerConfig
类 transformers.SwiftFormerConfig
< 源代码 >( 图像大小 = 224 通道数 = 3 深度 = [3, 3, 6, 4] 嵌入维度 = [48, 56, 112, 220] MLP比率 = 4 下采样 = [True, True, True, True] 隐藏激活函数 = 'gelu' 下采样块大小 = 3 下采样步长 = 2 下采样填充 = 1 丢弃路径率 = 0.0 丢弃MLP比率 = 0.0 丢弃卷积编码器比率 = 0.0 使用层尺度 = True 层尺度初始化值 = 1e-05 批量归一化Eps = 1e-05 **kwargs )
参数
- 图像大小 (
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 隐藏维度大小与其输入维度大小的比率 - 下采样(
List[bool]
,可选,默认值[True, True, True, True]
)-是否在两个阶段之间进行下采样。 - 隐藏层激活(
str
,可选,默认值"gelu"
)-非线性激活函数(字符串)。支持"gelu"
,"relu"
,"selu"
和"gelu_new"
。 - 下采样层中补丁的大小(
int
,可选,默认值 3) - 下采样层中卷积核的步长(
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混洗器输出进行缩放。 - layer_scale_init_value (
float
,可选,默认为 1e-05) — Token混洗器输出缩放系数。 - batch_norm_eps (
float
,可选,默认为 1e-05) — 批标准化层的epsilon值。
这是存储SwiftFormer模型配置的配置类。它用于根据指定的参数创建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
类 transformers.SwiftFormerModel
< 源代码 >( config: SwiftFormerConfig )
参数
- config (SwiftFormerConfig) — 拥有模型所有参数的模型配置类。使用配置文件初始化不会加载与模型关联的权重,只会加载配置。查看from_pretrained()方法来加载模型权重。
一个裸SwiftFormer模型转换器,输出原始隐藏状态,没有顶部任何特定头。这是一个PyTorch torch.nn.Module子类。将其用作常规PyTorch模块,并参看PyTorch文档了解所有与通用使用和行为相关的内容。
forward
< 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
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)
一个包含多种元素的torch.FloatTensor
元组(取决于配置SwiftFormerConfig和输入),而非返回普通元组的条件是传递了return_dict=False
或当config.return_dict=False
时。
-
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
时返回) — 包含同形状为(batch_size, num_channels, height, width)
的多个torch.FloatTensor
张量(如果有嵌入层,则还包括嵌入层的输出和每个层的输出)。各个层的隐藏状态以及可选的初始嵌入层的输出。
SwiftFormerModel 的前向方法覆盖了特殊方法__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
< 源代码 >( config: SwiftFormerConfig )
参数
- config (SwiftFormerConfig) — 包含模型所有参数的模型配置类。使用配置文件初始化不会加载与模型关联的权重,只会加载配置。查看 from_pretrained() 方法以加载模型权重。
SwiftFormer 模型,具有图像分类头(例如用于 ImageNet)。
此模型是 PyTorchtorch.nn.Module子类。将其用作常规 PyTorch 模块,并参阅 PyTorch 文档了解所有与一般使用和行为相关的事项。
forward
< 源代码 >( pixel_values: 可选 = None labels: 可选 = None output_hidden_states: 可选 = None return_dict: 可选 = None ) → transformers.modeling_outputs.ImageClassifierOutputWithNoAttention 或 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对象(而非平凡元组)。 - 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)
A transformers.modeling_outputs.ImageClassifierOutputWithNoAttention 或 a tuple of torch.FloatTensor
(if return_dict=False
is passed or when config.return_dict=False
) comprising various elements depending on the configuration (SwiftFormerConfig) and inputs.
- loss (
torch.FloatTensor
of shape(1,)
,可选,当提供labels
时返回) — 分类(或当config.num_labels==1时的回归)损失。 - logits (
torch.FloatTensor
of shape(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
< 源 >( 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: 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而不是一个普通的元组。 - 训练 (
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: 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 前向方法,重写了 __call__
特殊方法。
尽管需要在这个函数内定义前向遍历的配方,但应该在这个之后调用Module
实例,因为前者负责运行前向和后向处理步骤,而后者则默默忽略它们。