Transformers 文档
膨胀邻域注意力 Transformer
并获得增强的文档体验
开始使用
膨胀邻域注意力 Transformer
概述
DiNAT 在 Dilated Neighborhood Attention Transformer 中由 Ali Hassani 和 Humphrey Shi 提出。
它通过添加膨胀邻域注意力模式来捕获全局上下文,扩展了 NAT,并显示出比它显着的性能改进。
论文的摘要如下:
Transformer 正在迅速成为跨模态、领域和任务应用最广泛的深度学习架构之一。在视觉领域,除了正在进行的普通 Transformer 的研究之外,分层 Transformer 也因其性能和易于集成到现有框架中而受到广泛关注。这些模型通常采用局部注意力机制,例如滑动窗口邻域注意力 (NA) 或 Swin Transformer 的移位窗口自注意力。虽然局部注意力有效地降低了自注意力的二次复杂度,但局部注意力削弱了自注意力最令人向往的两个特性:远程依赖关系建模和全局感受野。在本文中,我们介绍了膨胀邻域注意力 (DiNA),它是 NA 的一种自然、灵活且高效的扩展,可以捕获更多全局上下文并以指数方式扩展感受野,而无需额外成本。NA 的局部注意力和 DiNA 的稀疏全局注意力相互补充,因此我们介绍了膨胀邻域注意力 Transformer (DiNAT),这是一种建立在两者之上的新型分层视觉 Transformer。DiNAT 变体在 NAT、Swin 和 ConvNeXt 等强大的基线上享受显着改进。我们的大型模型比其 Swin 同类产品更快,并在 COCO 对象检测中领先 1.5% 的 box AP,在 COCO 实例分割中领先 1.3% 的 mask AP,在 ADE20K 语义分割中领先 1.1% 的 mIoU。与新框架配对后,我们的大型变体成为 COCO (58.2 PQ) 和 ADE20K (48.5 PQ) 上新的最先进的全景分割模型,以及 Cityscapes (44.5 AP) 和 ADE20K (35.4 AP) 上的实例分割模型(无需额外数据)。它还在 ADE20K (58.2 mIoU) 上与最先进的专业语义分割模型相匹配,并在 Cityscapes (84.5 mIoU) 上排名第二(无需额外数据)。

此模型由 Ali Hassani 贡献。原始代码可以在此处找到。
使用技巧
DiNAT 可以用作骨干网络。当 output_hidden_states = True
时,它将同时输出 hidden_states
和 reshaped_hidden_states
。reshaped_hidden_states
的形状为 (batch, num_channels, height, width)
而不是 (batch_size, height, width, num_channels)
。
注意
- DiNAT 依赖于 NATTEN 对邻域注意力和膨胀邻域注意力的实现。您可以通过参考 shi-labs.com/natten 安装 Linux 预构建 wheel,或者通过运行
pip install natten
在您的系统上构建。请注意,后者可能需要一些时间来编译。NATTEN 尚不支持 Windows 设备。 - 目前仅支持 patch size 为 4。
资源
Hugging Face 官方和社区(🌎 表示)资源列表,可帮助您开始使用 DiNAT。
- DinatForImageClassification 由此示例脚本和notebook支持。
- 另请参阅:图像分类任务指南
如果您有兴趣提交资源以包含在此处,请随时打开 Pull Request,我们将对其进行审核!该资源最好展示一些新的东西,而不是重复现有资源。
DinatConfig
class transformers.DinatConfig
< source >( patch_size = 4 num_channels = 3 embed_dim = 64 depths = [3, 4, 6, 5] num_heads = [2, 4, 8, 16] kernel_size = 7 dilations = [[1, 8, 1], [1, 4, 1, 4], [1, 2, 1, 2, 1, 2], [1, 1, 1, 1, 1]] mlp_ratio = 3.0 qkv_bias = True hidden_dropout_prob = 0.0 attention_probs_dropout_prob = 0.0 drop_path_rate = 0.1 hidden_act = 'gelu' initializer_range = 0.02 layer_norm_eps = 1e-05 layer_scale_init_value = 0.0 out_features = None out_indices = None **kwargs )
参数
- patch_size (
int
, 可选, 默认为 4) — 每个 patch 的大小(分辨率)。注意:目前仅支持 patch size 为 4。 - num_channels (
int
, 可选, 默认为 3) — 输入通道数。 - embed_dim (
int
, 可选, 默认为 64) — patch 嵌入的维度。 - depths (
List[int]
, 可选, 默认为[3, 4, 6, 5]
) — 编码器每个级别的层数。 - num_heads (
List[int]
, 可选, 默认为[2, 4, 8, 16]
) — Transformer 编码器每一层中的注意力头数。 - kernel_size (
int
, 可选, 默认为 7) — 邻域注意力 kernel 大小。 - dilations (
List[List[int]]
, 可选, 默认为[[1, 8, 1], [1, 4, 1, 4], [1, 2, 1, 2, 1, 2], [1, 1, 1, 1, 1]]
) — Transformer 编码器中每个 NA 层的膨胀值。 - mlp_ratio (
float
, optional, defaults to 3.0) — MLP 隐藏层维度与嵌入层维度的比率。 - qkv_bias (
bool
, optional, defaults toTrue
) — 是否将可学习的偏置添加到 queries、keys 和 values 中。 - hidden_dropout_prob (
float
, optional, defaults to 0.0) — 嵌入层和编码器中所有全连接层的 dropout 概率。 - attention_probs_dropout_prob (
float
, optional, defaults to 0.0) — attention 概率的 dropout 比率。 - drop_path_rate (
float
, optional, defaults to 0.1) — 随机深度率。 - hidden_act (
str
orfunction
, optional, defaults to"gelu"
) — 编码器中的非线性激活函数(函数或字符串)。 如果是字符串,则支持"gelu"
、"relu"
、"selu"
和"gelu_new"
。 - initializer_range (
float
, optional, defaults to 0.02) — 用于初始化所有权重矩阵的 truncated_normal_initializer 的标准差。 - layer_norm_eps (
float
, optional, defaults to 1e-05) — layer normalization 层使用的 epsilon 值。 - layer_scale_init_value (
float
, optional, defaults to 0.0) — 层缩放的初始值。 如果 <=0,则禁用。 - out_features (
List[str]
, optional) — 如果用作骨干网络,则输出的特征列表。 可以是"stem"
、"stage1"
、"stage2"
等中的任何一个(取决于模型有多少个阶段)。 如果未设置且设置了out_indices
,则默认为相应的阶段。 如果未设置且out_indices
也未设置,则默认为最后一个阶段。 必须与stage_names
属性中定义的顺序相同。 - out_indices (
List[int]
, optional) — 如果用作骨干网络,则输出的特征索引列表。 可以是 0、1、2 等中的任何一个(取决于模型有多少个阶段)。 如果未设置且设置了out_features
,则默认为相应的阶段。 如果未设置且out_features
也未设置,则默认为最后一个阶段。 必须与stage_names
属性中定义的顺序相同。
这是用于存储 DinatModel 配置的配置类。 它用于根据指定的参数实例化 Dinat 模型,从而定义模型架构。 使用默认值实例化配置将产生与 Dinat shi-labs/dinat-mini-in1k-224 架构类似的配置。
配置对象继承自 PretrainedConfig,可用于控制模型输出。 有关更多信息,请阅读 PretrainedConfig 的文档。
示例
>>> from transformers import DinatConfig, DinatModel
>>> # Initializing a Dinat shi-labs/dinat-mini-in1k-224 style configuration
>>> configuration = DinatConfig()
>>> # Initializing a model (with random weights) from the shi-labs/dinat-mini-in1k-224 style configuration
>>> model = DinatModel(configuration)
>>> # Accessing the model configuration
>>> configuration = model.config
DinatModel
class transformers.DinatModel
< source >( config add_pooling_layer = True )
参数
- config (DinatConfig) — 包含模型所有参数的模型配置类。 使用配置文件初始化不会加载与模型关联的权重,仅加载配置。 查看 from_pretrained() 方法以加载模型权重。
裸 Dinat 模型 Transformer,输出原始隐藏状态,顶部没有任何特定的 head。 此模型是 PyTorch torch.nn.Module 子类。 将其用作常规 PyTorch 模块,并参考 PyTorch 文档了解所有与常规用法和行为相关的事项。
forward
< source >( pixel_values: typing.Optional[torch.FloatTensor] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None ) → transformers.models.dinat.modeling_dinat.DinatModelOutput
or tuple(torch.FloatTensor)
参数
- pixel_values (
torch.FloatTensor
,形状为(batch_size, num_channels, height, width)
) — 像素值。 像素值可以使用 AutoImageProcessor 获得。 有关详细信息,请参阅 ViTImageProcessor.call()。 - output_attentions (
bool
, optional) — 是否返回所有 attention 层的 attention 张量。 有关更多详细信息,请参阅返回张量下的attentions
。 - output_hidden_states (
bool
, optional) — 是否返回所有层的隐藏状态。 有关更多详细信息,请参阅返回张量下的hidden_states
。 - return_dict (
bool
, optional) — 是否返回 ModelOutput 而不是普通元组。
返回值
transformers.models.dinat.modeling_dinat.DinatModelOutput
或 tuple(torch.FloatTensor)
transformers.models.dinat.modeling_dinat.DinatModelOutput
或 torch.FloatTensor
元组(如果传递 return_dict=False
或当 config.return_dict=False
时),其中包含取决于配置 (DinatConfig) 和输入的各种元素。
-
last_hidden_state (
torch.FloatTensor
,形状为(batch_size, sequence_length, hidden_size)
) — 模型最后一层输出端的隐藏状态序列。 -
pooler_output (
torch.FloatTensor
,形状为(batch_size, hidden_size)
,optional,当传递add_pooling_layer=True
时返回) — 最后一层隐藏状态的平均池化。 -
hidden_states (
tuple(torch.FloatTensor)
,optional,当传递output_hidden_states=True
或当config.output_hidden_states=True
时返回) —torch.FloatTensor
元组(每个嵌入输出对应一个,每个阶段输出对应一个),形状为(batch_size, sequence_length, hidden_size)
。模型在每一层输出端的隐藏状态,加上初始嵌入输出。
-
attentions (
tuple(torch.FloatTensor)
,optional,当传递output_attentions=True
或当config.output_attentions=True
时返回) —torch.FloatTensor
元组(每个阶段对应一个),形状为(batch_size, num_heads, sequence_length, sequence_length)
。attention softmax 之后的 attention 权重,用于计算自注意力头中的加权平均值。
-
reshaped_hidden_states (
tuple(torch.FloatTensor)
,optional,当传递output_hidden_states=True
或当config.output_hidden_states=True
时返回) —torch.FloatTensor
元组(每个嵌入输出对应一个,每个阶段输出对应一个),形状为(batch_size, hidden_size, height, width)
。模型在每一层输出端的隐藏状态,加上已重塑为包含空间维度的初始嵌入输出。
DinatModel forward 方法覆盖了 __call__
特殊方法。
虽然 forward 传递的配方需要在该函数内定义,但应在之后调用 Module
实例而不是此函数,因为前者负责运行预处理和后处理步骤,而后者会静默地忽略它们。
示例
>>> from transformers import AutoImageProcessor, DinatModel
>>> 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("shi-labs/dinat-mini-in1k-224")
>>> model = DinatModel.from_pretrained("shi-labs/dinat-mini-in1k-224")
>>> 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, 7, 7, 512]
DinatForImageClassification
class transformers.DinatForImageClassification
< source >( config )
参数
- config (DinatConfig) — 包含模型所有参数的模型配置类。 使用配置文件初始化不会加载与模型关联的权重,仅加载配置。 查看 from_pretrained() 方法以加载模型权重。
Dinat 模型 Transformer,顶部带有图像分类 head([CLS] token 的最终隐藏状态之上的线性层),例如用于 ImageNet。
此模型是 PyTorch torch.nn.Module 子类。 将其用作常规 PyTorch 模块,并参考 PyTorch 文档了解所有与常规用法和行为相关的事项。
forward
< source >( pixel_values: typing.Optional[torch.FloatTensor] = None labels: typing.Optional[torch.LongTensor] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None ) → transformers.models.dinat.modeling_dinat.DinatImageClassifierOutput
or tuple(torch.FloatTensor)
参数
- pixel_values (
torch.FloatTensor
, 形状为(batch_size, num_channels, height, width)
) — 像素值。 像素值可以使用 AutoImageProcessor 获得。 详情请参阅 ViTImageProcessor.call()。 - output_attentions (
bool
, 可选) — 是否返回所有注意力层的注意力张量。 更多详情请参阅返回张量下的attentions
。 - 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.models.dinat.modeling_dinat.DinatImageClassifierOutput
or tuple(torch.FloatTensor)
transformers.models.dinat.modeling_dinat.DinatImageClassifierOutput
或 torch.FloatTensor
元组(如果传递 return_dict=False
或当 config.return_dict=False
时),包含取决于配置 (DinatConfig) 和输入的各种元素。
-
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)
,optional,当传递output_hidden_states=True
或当config.output_hidden_states=True
时返回) —torch.FloatTensor
元组(每个嵌入输出对应一个,每个阶段输出对应一个),形状为(batch_size, sequence_length, hidden_size)
。模型在每一层输出端的隐藏状态,加上初始嵌入输出。
-
attentions (
tuple(torch.FloatTensor)
,optional,当传递output_attentions=True
或当config.output_attentions=True
时返回) —torch.FloatTensor
元组(每个阶段对应一个),形状为(batch_size, num_heads, sequence_length, sequence_length)
。attention softmax 之后的 attention 权重,用于计算自注意力头中的加权平均值。
-
reshaped_hidden_states (
tuple(torch.FloatTensor)
,optional,当传递output_hidden_states=True
或当config.output_hidden_states=True
时返回) —torch.FloatTensor
元组(每个嵌入输出对应一个,每个阶段输出对应一个),形状为(batch_size, hidden_size, height, width)
。模型在每一层输出端的隐藏状态,加上已重塑为包含空间维度的初始嵌入输出。
DinatForImageClassification 的 forward 方法,覆盖了 __call__
特殊方法。
虽然 forward 传递的配方需要在该函数内定义,但应在之后调用 Module
实例而不是此函数,因为前者负责运行预处理和后处理步骤,而后者会静默地忽略它们。
示例
>>> from transformers import AutoImageProcessor, DinatForImageClassification
>>> 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("shi-labs/dinat-mini-in1k-224")
>>> model = DinatForImageClassification.from_pretrained("shi-labs/dinat-mini-in1k-224")
>>> 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