Transformers documentation
Dilated Neighborhood Attention Transformer
该模型于 2022-09-29 在 HF papers 上发布,并于 2022-11-18 贡献给 Hugging Face Transformers。
Dilated Neighborhood Attention Transformer
概述
DiNAT 由 Ali Hassani 和 Humphrey Shi 在 Dilated Neighborhood Attention Transformer 中提出。
它通过添加膨胀邻域注意力模式来捕获全局上下文,从而扩展了 NAT,并展现出显著的性能提升。
该论文的摘要如下:
Transformer 正迅速成为跨模态、跨领域和跨任务应用最广泛的深度学习架构之一。在视觉领域,除了对纯 Transformer 的持续探索外,分层 Transformer 也因其出色的性能以及与现有框架的便捷集成而备受关注。这些模型通常采用局部注意力机制,例如滑动窗口邻域注意力(NA)或 Swin Transformer 的移位窗口自注意力。虽然局部注意力能有效降低自注意力的二次复杂度,但它削弱了自注意力的两个关键优势:长程依赖建模和全局感受野。本文提出了膨胀邻域注意力(Dilated Neighborhood Attention,DiNA),这是 NA 的一种自然、灵活且高效的扩展,能够在不增加额外成本的情况下捕获更全局的上下文,并指数级地扩大感受野。NA 的局部注意力与 DiNA 的稀疏全局注意力相辅相成,因此我们提出了基于两者的新型分层视觉 Transformer——膨胀邻域注意力 Transformer(Dilated Neighborhood Attention Transformer,DiNAT)。DiNAT 的变体相较于 NAT、Swin 和 ConvNeXt 等强基线模型取得了显著提升。我们的大规模模型速度更快,在 COCO 目标检测上比对应的 Swin 模型高 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)(未使用额外数据)。
Neighborhood Attention with different dilation values.
Taken from the original paper. 该模型由 Ali Hassani 贡献。 原始代码可在此处找到。
使用技巧
DiNAT 可以作为backbone使用。当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 对 Neighborhood Attention 和 Dilated Neighborhood Attention 的实现。
您可以参考 shi-labs.com/natten 使用预构建的 Linux wheel 进行安装,或者通过运行
pip install natten在您的系统上进行构建。 请注意,后者可能需要较长时间的编译。NATTEN 目前尚不支持 Windows 设备。 - 目前仅支持大小为 4 的 Patch。
资源
一份来自 Hugging Face 官方和社区(以 🌎 标识)的资源列表,帮助你快速上手 DiNAT。
- DinatForImageClassification 受此 notebook 支持。
- 另请参阅:图像分类任务指南
如果您有兴趣提交资源以收录在此处,请随时发起 Pull Request,我们将对其进行审核!理想情况下,该资源应展示一些新内容,而不是重复现有资源。
DinatConfig
class transformers.DinatConfig
< source >( transformers_version: str | None = Nonearchitectures: list[str] | None = Noneoutput_hidden_states: bool | None = Falsereturn_dict: bool | None = Truedtype: str | torch.dtype | None = Nonechunk_size_feed_forward: int = 0is_encoder_decoder: bool = Falseid2label: dict[int, str] | dict[str, str] | None = Nonelabel2id: dict[str, int] | dict[str, str] | None = Noneproblem_type: Literal['regression', 'single_label_classification', 'multi_label_classification'] | None = Nonepatch_size: int | list[int] | tuple[int, int] = 4num_channels: int = 3embed_dim: int = 64depths: list[int] | tuple[int, ...] = (3, 4, 6, 5)num_heads: list[int] | tuple[int, ...] = (2, 4, 8, 16)kernel_size: int = 7dilations: list | tuple | None = Nonemlp_ratio: float = 3.0qkv_bias: bool = Truehidden_dropout_prob: float | int = 0.0attention_probs_dropout_prob: float | int = 0.0drop_path_rate: float | int = 0.1hidden_act: str = 'gelu'initializer_range: float = 0.02layer_norm_eps: float = 1e-05layer_scale_init_value: float = 0.0_out_features: list[str] | None = None_out_indices: list[int] | None = None )
参数
- patch_size (
Union[int, list[int], tuple[int, int]],可选,默认为4) — 每个 patch 的大小(分辨率)。 - num_channels (
int,可选,默认为3) — 输入通道的数量。 - embed_dim (
int,可选,默认为64) — 嵌入和隐藏状态的维度。 - depths (
Union[list[int], tuple[int, ...]],可选,默认为(3, 4, 6, 5)) — Transformer 中每一层的深度。 - num_heads (
Union[list[int], tuple[int, ...]],可选,默认为(2, 4, 8, 16)) — Transformer 解码器中每个注意力层的注意力头数量。 - kernel_size (
int,可选,默认为7) — 卷积核的大小。 - 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,可选,默认为3.0) — MLP 隐藏层维度与嵌入维度的比值。 - qkv_bias (
bool,可选,默认为True) — 是否向查询、键和值添加偏置。 - hidden_dropout_prob (
Union[float, int],可选,默认为0.0) — 嵌入层、编码器和池化层中所有全连接层的 dropout 概率。 - attention_probs_dropout_prob (
Union[float, int],可选,默认为0.0) — 注意力概率的 dropout 比率。 - drop_path_rate (
Union[float, int],可选,默认为0.1) — 用于 patch 融合的 drop path 比率。 - hidden_act (
str,可选,默认为gelu) — 解码器中的非线性激活函数(函数或字符串)。例如,"gelu"、"relu"、"silu"等。 - initializer_range (
float,可选,默认为0.02) — 用于初始化所有权重矩阵的 truncated_normal_initializer 的标准差。 - layer_norm_eps (
float,可选,默认为1e-05) — 层归一化层所使用的 epsilon 值。 - layer_scale_init_value (
float,可选,默认为0.0) — 用于自注意力层的缩放值。基础模型使用 0.1,大型模型使用 1e-6。设置为 0 可禁用层缩放。
这是用于存储 DinatModel 配置的类。它根据指定的参数实例化 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.configDinatModel
class transformers.DinatModel
< source >( config: DinatConfigadd_pooling_layer = True )
参数
- config (DinatConfig) — 模型的配置类,包含模型的所有参数。使用配置文件进行初始化时,不会加载与模型关联的权重,仅加载配置。请查看 from_pretrained() 方法以加载模型权重。
- add_pooling_layer (
bool,可选,默认为True) — 是否添加池化层
未添加任何特定头部的裸 Dinat 模型,直接输出原始隐藏状态。
该模型继承自 PreTrainedModel。请查阅父类文档,了解该库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、剪枝头等)。
该模型也是 PyTorch torch.nn.Module 的子类。 请将其作为常规的 PyTorch Module 使用,有关通用用法和行为的所有事项,请参阅 PyTorch 文档。
forward
< source >( pixel_values: typing.Optional[torch.FloatTensor] = Noneoutput_attentions: bool | None = Noneoutput_hidden_states: bool | None = Nonereturn_dict: bool | None = None**kwargs ) → DinatModelOutput or tuple(torch.FloatTensor)
参数
- pixel_values (
torch.FloatTensor,形状为(batch_size, num_channels, image_size, image_size),可选) — 与输入图像对应的张量。可以使用 ViTImageProcessor 获取像素值。有关详细信息,请参阅 ViTImageProcessor.call()(processor_class使用 ViTImageProcessor 处理图像)。 - output_attentions (
bool, 可选) — 是否返回所有注意力层的注意力张量。有关详细信息,请参阅返回张量中的attentions。 - output_hidden_states (
bool,可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请参阅返回张量中的hidden_states。 - return_dict (
bool, 可选) — 是否返回 ModelOutput 而不是普通元组。
返回值
DinatModelOutput 或 tuple(torch.FloatTensor)
DinatModelOutput 或 torch.FloatTensor 元组(如果传入 return_dict=False 或 config.return_dict=False),其包含的元素取决于配置(DinatConfig)和输入。
DinatModel 的 forward 方法重写了 __call__ 特殊方法。
尽管前向传播的实现需要在此函数中定义,但之后应调用
Module实例,而不是直接调用此函数,因为前者会负责执行预处理和后处理步骤,而后者则会静默地忽略这些步骤。
last_hidden_state(形状为
(batch_size, sequence_length, hidden_size)的torch.FloatTensor,可选)— 模型最后一层输出的隐藏状态序列。pooler_output(形状为
(batch_size, hidden_size)的torch.FloatTensor,可选,在传入add_pooling_layer=True时返回) — 最后一层隐藏状态的均值池化。hidden_states (
tuple[torch.FloatTensor, ...],可选,在传入output_hidden_states=True或config.output_hidden_states=True时返回) — 一个torch.FloatTensor元组(如果模型具有嵌入层,则包含嵌入层输出的一个张量,以及每个层输出的一个张量),形状为(batch_size, sequence_length, hidden_size)。模型在每一层输出处的隐藏状态,以及可选的初始嵌入输出。
attentions(
tuple[torch.FloatTensor, ...],可选,当传入output_attentions=True或config.output_attentions=True时返回)—— 一个torch.FloatTensor元组(每层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)。注意力权重,即经过注意力 softmax 之后的权重,用于在自注意力头中计算加权平均值。
reshaped_hidden_states (
tuple(torch.FloatTensor),可选,在传入output_hidden_states=True或config.output_hidden_states=True时返回) — 一个torch.FloatTensor元组(包含一个嵌入层输出以及每个阶段的输出),形状为(batch_size, hidden_size, height, width)。模型在每一层输出处的隐藏状态,以及重塑为包含空间维度的初始嵌入输出。
DinatForImageClassification
class transformers.DinatForImageClassification
< source >( config: DinatConfig )
参数
- config (DinatConfig) — 模型的配置类,包含模型的所有参数。使用配置文件进行初始化时,不会加载与模型关联的权重,仅加载配置。请查看 from_pretrained() 方法以加载模型权重。
Dinat 模型,顶部带有图像分类头(在 [CLS] token 的最终隐藏状态之上添加一个线性层),例如用于 ImageNet。
该模型继承自 PreTrainedModel。请查阅父类文档,了解该库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、剪枝头等)。
该模型也是 PyTorch torch.nn.Module 的子类。 请将其作为常规的 PyTorch Module 使用,有关通用用法和行为的所有事项,请参阅 PyTorch 文档。
forward
< source >( pixel_values: typing.Optional[torch.FloatTensor] = Nonelabels: typing.Optional[torch.LongTensor] = Noneoutput_attentions: bool | None = Noneoutput_hidden_states: bool | None = Nonereturn_dict: bool | None = None**kwargs ) → DinatImageClassifierOutput or tuple(torch.FloatTensor)
参数
- pixel_values (
torch.FloatTensor,形状为(batch_size, num_channels, image_size, image_size),可选) — 与输入图像对应的张量。可以使用 ViTImageProcessor 获取像素值。有关详细信息,请参阅 ViTImageProcessor.call()(processor_class使用 ViTImageProcessor 处理图像)。 - labels(形状为
(batch_size,)的torch.LongTensor,可选)— 用于计算图像分类/回归损失的标签。索引应在[0, ..., config.num_labels - 1]范围内。如果config.num_labels == 1,则计算回归损失(均方损失);如果config.num_labels > 1,则计算分类损失(交叉熵)。 - output_attentions (
bool, 可选) — 是否返回所有注意力层的注意力张量。有关详细信息,请参阅返回张量中的attentions。 - output_hidden_states (
bool,可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请参阅返回张量中的hidden_states。 - return_dict (
bool, 可选) — 是否返回 ModelOutput 而不是普通元组。
返回值
DinatImageClassifierOutput 或 tuple(torch.FloatTensor)
DinatImageClassifierOutput 或 torch.FloatTensor 元组(当传入 return_dict=False 或 config.return_dict=False 时),其包含的元素取决于配置(DinatConfig)和输入。
DinatForImageClassification 的 forward 方法重写了 __call__ 特殊方法。
尽管前向传播的实现需要在此函数中定义,但之后应调用
Module实例,而不是直接调用此函数,因为前者会负责执行预处理和后处理步骤,而后者则会静默地忽略这些步骤。
loss (
torch.FloatTensor,形状为(1,),可选,当提供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, sequence_length, hidden_size)。模型在每一层输出处的隐藏状态,以及可选的初始嵌入输出。
attentions(
tuple[torch.FloatTensor, ...],可选,当传入output_attentions=True或config.output_attentions=True时返回)—— 一个torch.FloatTensor元组(每层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)。注意力权重,即经过注意力 softmax 之后的权重,用于在自注意力头中计算加权平均值。
reshaped_hidden_states(
tuple(torch.FloatTensor),可选,在传入output_hidden_states=True或config.output_hidden_states=True时返回)—— 一个torch.FloatTensor元组(包含嵌入层输出以及每个阶段的输出),形状为(batch_size, hidden_size, height, width)。模型在每一层输出处的隐藏状态,以及重塑为包含空间维度的初始嵌入输出。
示例:
>>> from transformers import AutoImageProcessor, DinatForImageClassification
>>> import torch
>>> from datasets import load_dataset
>>> dataset = load_dataset("huggingface/cats-image")
>>> 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])
...