![[特殊字符] Transformers 中的 Dilated Neighborhood Attention Transformer(DiNAT):架構原理、配置詳解與實戰使用指南](http://pic.xiahunao.cn/yaotu/[特殊字符] Transformers 中的 Dilated Neighborhood Attention Transformer(DiNAT):架構原理、配置詳解與實戰使用指南)
Transformers 中的 Dilated Neighborhood Attention TransformerDiNAT架構原理、配置詳解與實戰使用指南【免費下載鏈接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.項目地址: https://gitcode.com/GitHub_Trending/tra/transformers導讀DiNATDilated Neighborhood Attention Transformer擴張近鄰注意力 Transformer是 Transformers 中收錄的一種分層視覺 Transformer它通過引入擴張近鄰注意力DiNA模式在保持局部注意力低計算成本的同時捕獲全局上下文、指數級擴展感受野。本文以倉庫內 DiNAT 文檔及對應的 英文文檔為核心結合 configuration_dinat.py 與 modeling_dinat.py 的源碼實現系統講解 DiNAT 的模型原理、NATTEN 依賴環境、DinatConfig全部配置參數、DinatModel/DinatForImageClassification/DinatBackbone三類模型的用法以及將其作為圖像分類與下游視覺任務骨干網絡backbone的完整實戰方案。讀完本文你將能夠獨立安裝依賴、加載與微調 DiNAT 模型并理解其局部 稀疏全局混合注意力的設計邏輯。一、模型概述從 NAT 到 DiNATDiNAT 由 Ali Hassani 與 Humphrey Shi 在論文《Dilated Neighborhood Attention Transformer》中提出論文于 2022-09-29 發布模型于 2022-11-18 貢獻進本倉庫見 英文文檔 開頭說明。它是 NATNeighborhood Attention Transformer 的直接擴展在 NAT 的基礎上加入擴張近鄰注意力Dilated Neighborhood Attention, DiNA模式用于捕獲全局上下文并在 NAT 基礎上取得了顯著的性能提升。論文摘要中闡述了這一設計動機視覺領域的 Transformer 通常采用局部注意力機制如滑窗近鄰注意力 NA、Swin Transformer 的移位窗口自注意力來削減自注意力的二次復雜度但局部注意力同時弱化了自注意力最可貴的兩個特性——長距離相互依賴建模與全局感受野。DiNA 作為 NA 的一種自然、靈活且高效的擴展可以捕獲更多全局上下文并在零額外成本的前提下從零開始指數級擴展感受野NA 的局部注意力與 DiNA 的稀疏全局注意力相互補充二者共同構成 DiNAT 這一新型分層視覺 Transformer。論文中報告DiNAT 各變體相比 NAT、Swin、ConvNeXt 等強基線有顯著改進。其大模型在 COCO 目標檢測上比對應的 Swin 模型更快且 box AP 領先 1.5%COCO 實例分割 mask AP 領先 1.3%ADE20K 語義分割 mIoU 領先 1.1%。配合新框架后其大模型在 COCO58.2 PQ與 ADE20K48.5 PQ上成為全景分割新 SOTA在 Cityscapes44.5 AP與 ADE20K35.4 AP上無額外數據刷新實例分割記錄并追平 ADE20K 上專用語義分割模型的 SOTA58.2 mIoU。以上均為論文報告的實驗結果。文檔中展示的不同擴張值下的近鄰注意力示意圖不同擴張值對應的注意力采樣區域直觀說明了這一思想當 dilation 為 1 時注意力覆蓋緊鄰的kernel_size × kernel_size窗口隨著 dilation 增大參與計算的 token 彼此間距拉大形成稀疏但覆蓋范圍更廣的全局采樣模式。二、架構原理源碼級拆解 DiNAT 的分層結構從 modeling_dinat.py 的實現看DiNAT 是典型的分層hierarchical視覺 Transformer整體由DinatEmbeddingsPatch 嵌入、DinatEncoder四階段編碼器與可選的下游頭組成。下面按數據流向逐層拆解。2.1 Patch Embedding僅支持 patch size 4 的卷積下采樣DinatPatchEmbeddingsmodeling_dinat.py L144-L177負責把形狀為(batch_size, num_channels, height, width)的pixel_values轉成(batch_size, height, width, hidden_size)的 patch 嵌入。它沒有使用傳統的切 patch 線性投影而是用兩個連續的 3×3、stride 2 卷積逐級把分辨率降到原來的 1/4self.projection nn.Sequential( nn.Conv2d(self.num_channels, hidden_size // 2, kernel_size(3, 3), stride(2, 2), padding(1, 1)), nn.Conv2d(hidden_size // 2, hidden_size, kernel_size(3, 3), stride(2, 2), padding(1, 1)), )注意源碼中顯式限制if patch_size 4: pass else: # TODO: Support arbitrary patch sizes. raise ValueError(Dinat only supports patch size of 4 at the moment.)這與文檔現時僅支持 patch size 4的說明一致——這是當前實現層面的硬性約束而非配置建議。嵌入后還會接LayerNorm與DropoutDinatEmbeddingsL122-L141。2.2 四階段編碼器與卷積下采樣器DinatEncoderL462-L529包含len(config.depths)個 stage默認 4 個。每個 stage 的維度為embed_dim * 2**i64 → 128 → 256 → 512其內部的每個 layer 使用不同的擴張值來自config.dilations[i]。階段之間用DinatDownsamplerL180-L200銜接一個 3×3、stride 2 的卷積將特征圖分辨率減半、通道數翻倍再跟一層 LayerNorm。最后一個 stage 之后不再下采樣。2.3 核心算子NeighborhoodAttention含 DiNANeighborhoodAttentionL203-L259是 DiNAT 的核心模塊其計算流程為對hidden_states分別經過 query / key / value 三個線性層并拆分為多頭attention_head_size dim / num_heads在縮放因子1/sqrt(attention_head_size)之后調用 NATTEN 提供的natten2dqkrpb計算擴張近鄰注意力原始分數并同時加上可學習的相對位置偏置rpb——源碼注釋明確說明 rpb is learnable relative positional biases; same concept is used in SwinL217對注意力分數做 softmax 與 dropout調用natten2dav聚合 value得到上下文向量。其中rpb的形狀為(num_heads, 2*kernel_size-1, 2*kernel_size-1)L218kernel_size與dilation由配置與所在層共同決定。值得注意的是擴張正是通過把 dilation 參數傳入natten2dqkrpb/natten2dav實現的注意力窗口的實際覆蓋范圍是window_size kernel_size * dilation因而既保持參與計算的 token 數量不變零額外成本又把感受野按層逐級擴大。2.4 DiNAT Layer 的殘差結構DinatLayerL344-L412采用 Pre-LayerNorm 的 Transformer 塊結構并包含若干工程細節layernorm_before → attention → drop_path → 殘差再layernorm_after → intermediateMLP 升維倍率為 mlp_ratio→ outputMLP 降維→ drop_path → 殘差當layer_scale_init_value 0時為注意力和 MLP 輸出各乘以一組可學習的層縮放參數L359-L363、L398-L407maybe_padL365-L374在特征圖小于kernel_size * dilation時做右側/底部 padding計算后再裁剪回原尺寸L394-L396保證小分辨率輸入也能正常前向。2.5 DropPath隨機深度DinatDropPathL319-L341是從 Swin 的SwinDropPath復制而來源碼標注 Copied from transformers.models.swin...按樣本對殘差塊做隨機深度正則drop_prob為 0 或非訓練模式下恒等映射否則按1 - drop_prob的概率保留并除以 keep_prob 保持期望一致。drop_path_rate由DinatEncoder在[0, config.drop_path_rate]區間按總層數線性插值分配L467。2.6 輸出形態hidden_states 與 reshaped_hidden_states文檔Usage tips中特別強調當output_hidden_states True時模型同時輸出hidden_states與reshaped_hidden_states且后者的形狀是(batch, num_channels, height, width)而不是(batch_size, height, width, num_channels)。這與內部張量布局直接相關整個編碼器內部的特征圖以(batch, height, width, channels)的 NHWC 布局流動Patch Embedding 輸出時已permute成該布局見 L175DinatEncoder在收集隱藏狀態時執行hidden_states.permute(0, 3, 1, 2)L497 等把每個 stage 的特征圖重排回(batch, channels, height, width)的 NCHW 布局形成reshaped_hidden_states方便直接接入卷積類下游模塊如分割/檢測頭因此做視覺 backbone 時優先使用reshaped_hidden_states而沿用 Transformer 習慣例如拼接序列時可使用hidden_states。DinatModel還包含一個可選的池化層AdaptiveAvgPool1d(1)L559對最后一層特征做平均池化得到pooler_output供分類頭使用。三、環境準備NATTEN 依賴安裝與限制DiNAT 的注意力計算不包含在本倉庫內而是依賴 SHI-Labs 的 NATTEN 對 Neighborhood Attention / Dilated Neighborhood Attention 的高效 CUDA 實現。這一點在源碼中有雙重印證modeling_dinat.py L37-L45 僅在is_natten_available()為真時從natten.functional導入natten2dav、natten2dqkrpb否則替換為拋出OptionalDependencyNotAvailable的占位函數DinatModel、DinatForImageClassification、DinatBackbone的__init__均調用requires_backends(self, [natten])如 L549未安裝時直接報錯依賴探測函數is_natten_available()定義于 import_utils.py L1516-L1517缺失時的提示文案見同一文件的NATTEN_IMPORT_ERRORL2144-L2148。安裝方式按文檔說明# 方式一Linux 使用預編譯 wheel推薦參考 shi-labs.com/natten 提供的構建產物 # 方式二在本機源碼編譯可能耗時較長 pip install natten使用限制NATTEN 目前不支持 Windows 設備編譯安裝耗時較長安裝后可能需要重啟運行環境DiNAT 當前僅支持 patch size 4見 2.1 節。提示由于 DiNAT 前向必須依賴 NATTEN 的 CUDA kernel純 CPU 環境或無 GPU 的容器內使用會受限請以 NATTEN 官方發布說明為準。四、DinatConfig 配置參數詳解DinatConfig定義于 configuration_dinat.py L25-L82繼承BackboneConfigMixin與PreTrainedConfigmodel_type dinat。其默認值對應shi-labs/dinat-mini-in1k-224風格的配置該 checkpoint 名出現在配置類的自動文檔字符串中。全部核心參數如下參數默認值說明patch_size4Patch 大小當前僅支持 4支持int/list/tuple類型聲明num_channels3輸入圖像通道數灰度圖可設為 1測試用例中有驗證embed_dim64第一個 stage 的嵌入維度之后每級翻倍depths(3, 4, 6, 5)每個 stage 中 DiNAT 層的數量num_heads(2, 4, 8, 16)每個 stage 的注意力頭數kernel_size7近鄰注意力窗口大小dilations[[1, 8, 1], [1, 4, 1, 4], [1, 2, 1, 2, 1, 2], [1, 1, 1, 1, 1]]編碼器中每個 NA 層的擴張值不傳時自動使用該默認值mlp_ratio3.0MLP 隱藏層相對維度的放大倍數qkv_biasTrueQ/K/V 線性層是否帶偏置hidden_dropout_prob0.0隱藏層 Dropout 概率attention_probs_dropout_prob0.0注意力分數 Dropout 概率drop_path_rate0.1隨機深度DropPath最大概率按層線性插值hidden_actgelu中間層激活函數initializer_range0.02權重初始化標準差layer_norm_eps1e-5LayerNorm 的 epsilonlayer_scale_init_value0.0層縮放初始值大于 0 時啟用可學習層縮放幾個派生屬性值得注意L71-L82 的__post_init__num_layers len(depths)attribute_map中把num_hidden_layers映射到num_layers把num_attention_heads映射到num_heads便于與通用配置接口兼容hidden_size embed_dim * 2 ** (len(depths) - 1)即最后一個 stage 的通道數mini 配置下為 512。源碼注釋說明設置該屬性是為了讓 DiNAT 能與VisionEncoderDecoderModel配合使用stage_names [stem] [fstage{idx} for idx in range(1, len(depths) 1)]與out_features/out_indices配合供 Backbone 使用。dilations參數是 DiNAT 區別于 NAT 的關鍵默認配置中第一個 stage 使用[1, 8, 1]——中間層的 dilation 高達 8意味著該層注意力以 8 為間隔采樣遠處的 token從而以稀疏方式捕獲全局上下文越到后期 stage擴張越趨于 1[1, 1, 1, 1, 1]回歸更精細的局部建模。五、模型類與實戰用法5.1 從配置實例化模型參照 configuration_dinat.py L30-L43 中的示例可以先用配置初始化隨機權重模型from transformers import DinatConfig, DinatModel # 初始化一個 shi-labs/dinat-mini-in1k-224 風格的配置 configuration DinatConfig() # 用隨機權重初始化模型 model DinatModel(configuration) # 訪問模型配置 configuration model.config5.2 DinatModel純編碼器輸出DinatModelmodeling_dinat.py L541-L613是基礎編碼器前向參數包括pixel_values、output_attentions、output_hidden_states、return_dict。返回的DinatModelOutputL76-L92包含last_hidden_state最后一層輸出形狀(batch, height, width, channels)pooler_output平均池化結果形狀(batch, hidden_size)hidden_states與reshaped_hidden_states各 stage 隱藏狀態詳見 2.6 節attentions各層注意力權重需要output_attentionsTrue。測試用例 test_modeling_dinat.py L132-L143 驗證了前向輸出形狀對image_size64、depths[1,2,1]的配置last_hidden_state的形狀應為(batch, 64//4//2**2, 64//4//2**2, 16*2**2)即每經過一個 stage 分辨率減半、通道翻倍——這與架構設計完全一致。5.3 DinatForImageClassification圖像分類DinatForImageClassificationL622-L682在DinatModel之上加一個線性分類頭nn.Linear(self.dinat.num_features, config.num_labels)當num_labels 0否則為nn.Identity。labels傳入時自動計算損失num_labels 1時用 MSE 回歸損失num_labels 1時用交叉熵分類損失。推理示例from transformers import AutoImageProcessor, AutoModelForImageClassification from PIL import Image processor AutoImageProcessor.from_pretrained(shi-labs/dinat-mini-in1k-224) model AutoModelForImageClassification.from_pretrained(shi-labs/dinat-mini-in1k-224) image Image.open(path/to/your/image.jpg) inputs processor(image, return_tensorspt) with torch.no_grad(): logits model(**inputs).logits predicted_class_id logits.argmax(-1).item() print(model.config.id2label[predicted_class_id])倉庫還提供了完整的圖像分類訓練腳本 run_image_classification.py 及其無 Trainer 版本run_image_classification_no_trainer.py依賴見同目錄 requirements.txt可配合--model_name_or_path shi-labs/dinat-mini-in1k-224等參數直接進行微調或評估。文檔將 [DinatForImageClassification] 的官方支持資源指向該示例腳本與官方圖像分類 notebook本倉庫內可直接運行的是前者。5.4 DinatBackbone作為下游視覺任務的骨干網絡文檔明確指出 DiNAT can be used as abackbone可作為骨干網絡使用。雖然文檔的 autodoc 列表只列出DinatConfig、DinatModel、DinatForImageClassification但當前倉庫源碼中還提供了DinatBackboneL690-L789繼承BackboneMixin專為 DETR、MaskFormer 等檢測/分割框架設計源碼注釋 NAT backbone, to be used with frameworks like DETR and MaskFormer。DinatBackbone前向返回BackboneOutput其中feature_maps為各指定 stage 的多尺度特征圖它對每個輸出 stage 額外套了一層 LayerNormL700-L704并對不在out_features中的 stage 做過濾。其 docstring 中給出了用AutoImageProcessorAutoBackbone提取特征圖的示例流程指定out_features[stage1, stage2, stage3, stage4]后最后一個 stage 的 feature map 形狀為[1, 512, 7, 7]輸入 224×224 時。注意該示例使用的是shi-labs/nat-mini-in1k-224checkpoint實際使用 DiNAT 時可換成對應的shi-labs/dinat-*系列 checkpoint。測試方面test_modeling_dinat.py L162-L187 驗證了 backbone 的輸出指定out_features時feature_maps數量與通道數與之對應out_featuresNone時退化為僅輸出最后一層形狀[batch, channels[-1], 4, 4]并在 L196 起通過require_natten裝飾器把整套測試限定在已安裝 NATTEN 的環境中運行。5.5 任務指南銜接圖像分類是 DiNAT 最直接的落地任務完整的任務級說明參見 圖像分類任務指南。六、使用注意事項與限制匯總硬性依賴 NATTEN任何 DiNAT 模型類實例化都會觸發requires_backends(self, [natten])必須先安裝 NATTEN見第三節平臺限制NATTEN 暫不支持 WindowsLinux 用戶優先使用預編譯 wheel 避免長時間編譯patch size 固定為 4源碼在DinatPatchEmbeddings中直接對非 4 的 patch size 拋ValueError目前無繞過途徑輸入通道校驗pixel_values的通道數必須與config.num_channels一致L169-L173灰度圖需顯式把num_channels設為 1隱藏狀態布局hidden_states為(batch, height, width, channels)reshaped_hidden_states為(batch, channels, height, width)接入下游模塊前務必確認所需布局輸出形狀推導每個 stage 分辨率減半、通道翻倍最后一層特征分辨率約為input_size / patch_size / 2**(len(depths)-1)測試用例 L138-L139 的推導式即此邏輯配置超大kernel_size * dilation與過小輸入時需注意maybe_pad的邊界處理。七、小結DiNAT 通過局部 NA 稀疏 DiNA的組合在層級架構中同時兼顧了局部精細建模與全局上下文捕獲是 NAT 的重要演進。在本倉庫中它由 DinatConfig 提供配置、modeling_dinat.py 提供DinatModel、DinatForImageClassification與DinatBackbone三種模型形態分別覆蓋純特征提取、圖像分類與多尺度骨干網絡三類場景test_modeling_dinat.py 則對輸出形狀、backbone 行為與灰度圖輸入等關鍵路徑做了系統驗證。上手時請務必先解決 NATTEN 依賴再結合 圖像分類示例腳本 快速跑通訓練與推理鏈路。【免費下載鏈接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.項目地址: https://gitcode.com/GitHub_Trending/tra/transformers創作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考