Transformers 文档

膨胀邻域注意力 Transformer

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

膨胀邻域注意力 Transformer

PyTorch

概述

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) 上排名第二(无需额外数据)。

drawing 具有不同膨胀值的邻域注意力。取自原始论文

此模型由 Ali Hassani 贡献。原始代码可以在此处找到。

使用技巧

DiNAT 可以用作骨干网络。当 output_hidden_states = True 时,它将同时输出 hidden_statesreshaped_hidden_statesreshaped_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。

图像分类

如果您有兴趣提交资源以包含在此处,请随时打开 Pull Request,我们将对其进行审核!该资源最好展示一些新的东西,而不是重复现有资源。

DinatConfig

class transformers.DinatConfig

< >

( 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 to True) — 是否将可学习的偏置添加到 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 or function, 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

< >

( config add_pooling_layer = True )

参数

  • config (DinatConfig) — 包含模型所有参数的模型配置类。 使用配置文件初始化不会加载与模型关联的权重,仅加载配置。 查看 from_pretrained() 方法以加载模型权重。

裸 Dinat 模型 Transformer,输出原始隐藏状态,顶部没有任何特定的 head。 此模型是 PyTorch torch.nn.Module 子类。 将其用作常规 PyTorch 模块,并参考 PyTorch 文档了解所有与常规用法和行为相关的事项。

forward

< >

( 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.DinatModelOutputtuple(torch.FloatTensor)

transformers.models.dinat.modeling_dinat.DinatModelOutputtorch.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

< >

( config )

参数

  • config (DinatConfig) — 包含模型所有参数的模型配置类。 使用配置文件初始化不会加载与模型关联的权重,仅加载配置。 查看 from_pretrained() 方法以加载模型权重。

Dinat 模型 Transformer,顶部带有图像分类 head([CLS] token 的最终隐藏状态之上的线性层),例如用于 ImageNet。

此模型是 PyTorch torch.nn.Module 子类。 将其用作常规 PyTorch 模块,并参考 PyTorch 文档了解所有与常规用法和行为相关的事项。

forward

< >

( 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.DinatImageClassifierOutputtorch.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
< > 在 GitHub 上更新