Vision Transformer (ViT):將Transformer帶入計算機視覺的革命性嘗試(代碼實現)

Vision Transformer (ViT):將Transformer帶入計算機視覺的革命性嘗試

作為一名深度學習研究者,如果你對自然語言處理(NLP)領域的Transformer架構了如指掌,那么你一定不會對它在序列建模中的強大能力感到陌生。然而,2021年由Google Research團隊在ICLR上發表的論文《AN IMAGE IS WORTH 16x16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE》卻將這一熟悉的架構帶入了一個全新的領域——計算機視覺,提出了Vision Transformer(ViT)。這篇博客將為你詳細解析ViT的原理,結合你對Transformer的深厚理解,帶你走進這一開創性的模型。

背景:從NLP到視覺的跨界思考

在NLP領域,Transformer(Vaswani et al., 2017)憑借其自注意力機制(Self-Attention)徹底改變了序列建模的范式。通過預訓練大規模語言模型(如BERT、GPT),Transformer展現了驚艷的泛化能力和計算效率。然而,在計算機視覺領域,卷積神經網絡(CNN)一直是無可爭議的主宰,憑借其局部性、平移不變性等歸納偏置(Inductive Bias),在圖像分類、目標檢測等任務中占據主導地位。

ViT的核心思想大膽而簡單:如果Transformer在NLP中能處理單詞序列(Token Sequence),為什么不能將圖像也看作一種序列呢?作者提出,通過將圖像分割成固定大小的Patch,并將這些Patch作為輸入序列直接交給標準Transformer處理,可以完全拋棄CNN的架構。這一嘗試不僅挑戰了CNN的統治地位,還揭示了大規模數據預訓練對模型性能的深遠影響。

ViT的架構:從圖像到序列的轉變

在這里插入圖片描述
來源:https://arxiv.org/pdf/2010.11929

ViT的架構設計幾乎是對NLP Transformer的“照搬”,但在輸入處理上做了一些關鍵調整。以下是ViT的核心步驟,相信你會發現它與NLP中的處理流程有驚人的相似之處:

1. 圖像分塊與嵌入(Patch Embedding)

在NLP中,輸入是一個單詞序列,每個單詞通過詞嵌入(Word Embedding)映射為固定維度的向量。ViT將這一思想移植到圖像上:

  • 圖像分割:給定一張輸入圖像 ( x ∈ R H × W × C x \in \mathbb{R}^{H \times W \times C} xRH×W×C )(H、W為高寬,C為通道數,通常是RGB的3),ViT將其分割為固定大小的Patch,例如 ( P × P P \times P P×P )(論文中常用 ( 16 × 16 16 \times 16 16×16 ))。這會生成 ( N = H W / P 2 N = HW / P^2 N=HW/P2 ) 個Patch,每個Patch是一個 ( P 2 ? C P^2 \cdot C P2?C ) 維的向量。
  • 線性投影:這些Patch被展平后,通過一個可訓練的線性層映射到一個固定維度 ( D D D ) 的嵌入空間,形成Patch Embedding。這與NLP中的詞嵌入過程幾乎一模一樣,只是這里的“詞”是圖像Patch。
  • 位置編碼(Position Embedding):與NLP類似,ViT為每個Patch添加位置編碼,以保留空間信息。默認使用一維可學習位置編碼(1D Positional Embedding),盡管論文也嘗試了二維編碼,但效果差別不大。

最終,輸入序列為:
z 0 = [ x class ; x p 1 E ; x p 2 E ; ? ; x p N E ] + E pos \mathbf{z}_0 = [\mathbf{x}_{\text{class}}; \mathbf{x}_p^1 \mathbf{E}; \mathbf{x}_p^2 \mathbf{E}; \cdots; \mathbf{x}_p^N \mathbf{E}] + \mathbf{E}_{\text{pos}} z0?=[xclass?;xp1?E;xp2?E;?;xpN?E]+Epos?
其中,( E ∈ R ( P 2 ? C ) × D \mathbf{E} \in \mathbb{R}^{(P^2 \cdot C) \times D} ER(P2?C)×D ) 是投影矩陣,( E pos ∈ R ( N + 1 ) × D \mathbf{E}_{\text{pos}} \in \mathbb{R}^{(N+1) \times D} Epos?R(N+1)×D ) 是位置編碼。

2. 分類標記(Class Token)

如果你熟悉BERT(可以參考筆者的另一篇博客:BERT模型詳解:雙向Transformer的語言理解革命(預訓練和微調代碼實現)),你一定知道它的 [CLS] Token。ViT也借鑒了這一設計,在Patch序列前添加一個可學習的分類標記(Class Token),記為 ( x class \mathbf{x}_{\text{class}} xclass? )。這個Token的作用是在Transformer編碼后,作為整個圖像的表示,用于后續分類任務。

3. Transformer編碼器

接下來,ViT將序列 ( z 0 \mathbf{z}_0 z0? ) 輸入標準Transformer編碼器,與NLP中的架構完全一致:

  • 多頭自注意力(Multi-Head Self-Attention, MSA):通過自注意力機制,ViT在全局范圍內整合Patch之間的信息,而不像CNN那樣局限于局部感受野。
  • MLP塊:每個Transformer層包含一個前饋網絡(MLP),帶有GELU激活函數。
  • 層歸一化與殘差連接:LayerNorm(LN)和殘差連接確保了訓練的穩定性。

經過 ( L L L ) 層Transformer編碼后,輸出序列為 ( z L \mathbf{z}_L zL? )。其中,( z L 0 \mathbf{z}_L^0 zL0? )(即Class Token的輸出)被用作圖像表示:
y = LN ? ( z L 0 ) \mathbf{y} = \operatorname{LN}(\mathbf{z}_L^0) y=LN(zL0?)

4. 分類頭

在預訓練階段,( y \mathbf{y} y ) 被送入一個帶有單隱藏層的MLP進行分類;在微調階段,則簡化為一個線性層,輸出類別數 ( K K K ) 的預測。

關鍵特性:極簡與歸納偏置的取舍

ViT的設計極簡,幾乎沒有引入圖像特有的歸納偏置:

  • 與CNN的對比:CNN通過卷積操作天然具有局部性、平移不變性等特性,而ViT僅在Patch分割和微調時的分辨率調整中引入了少量二維結構信息。其余部分完全依賴自注意力從數據中學習空間關系。
  • 全局性:自注意力使ViT從第一層起就能關注整個圖像,而CNN的感受野需要通過深層堆疊逐步擴大。

這種“無偏置”設計帶來了一個重要問題:ViT是否能在數據量不足時泛化良好?答案是否定的。論文指出,當在中小規模數據集(如ImageNet,1.3M圖像)上從頭訓練時,ViT的表現不如同等規模的ResNet。然而,當預訓練數據規模擴大到14M(ImageNet-21k)或300M(JFT-300M)時,ViT開始展現出超越CNN的潛力。這表明,大規模數據可以彌補歸納偏置的缺失。

性能表現:數據驅動的勝利

ViT在多個基準測試中取得了令人矚目的成績:

  • ImageNet:ViT-H/14(Huge模型,14×14 Patch)達到88.55% Top-1精度,接近Noisy Student(EfficientNet-L2)的88.5%。
  • CIFAR-100:94.55%,超越BiT-L的93.51%。
  • VTAB(19任務):77.63%,顯著優于BiT-L的76.29%。

更重要的是,ViT的預訓練計算成本遠低于CNN。例如,ViT-H/14在JFT-300M上預訓練耗時2500 TPUv3-core-days,而BiT-L需要9900,Noisy Student更是高達12300。這種效率得益于Transformer的并行性和可擴展性。

深入分析:ViT如何“看”圖像?

為了理解ViT的內部機制,論文提供了一些可視化分析:

  • 注意力距離:在較低層,部分注意力頭關注局部區域,類似CNN的早期卷積層;隨著層數增加,注意力范圍擴展至全局。
  • 位置編碼:ViT學習到的位置編碼反映了圖像的二維拓撲結構,鄰近Patch的編碼更相似。
  • 注意力圖:通過Attention Rollout方法,ViT能聚焦于與分類任務語義相關的區域,展現出強大的解釋性。

自監督預訓練的初步探索

如果你對BERT的掩碼語言建模(Masked Language Modeling)情有獨鐘,那么ViT的初步自監督實驗可能會讓你興奮。作者嘗試了掩碼Patch預測(Masked Patch Prediction),類似BERT的策略,將50%的Patch替換為掩碼,并預測其均值顏色。在JFT-300M上預訓練后,ViT-B/16的ImageNet精度從頭訓練的77.9%提升至79.9%,盡管仍落后于監督預訓練的83.97%。這表明自監督ViT有潛力,但仍需進一步優化。

對研究者的啟示

對于熟悉NLP的你,ViT不僅是一個視覺模型,更是一個跨領域思想的橋梁:

  • 架構復用:ViT證明了Transformer的通用性,提示我們可以在更多模態上嘗試類似的序列化建模。
  • 數據依賴性:大規模預訓練對ViT至關重要,這與NLP中的經驗一致。你可以思考如何設計更高效的自監督任務來減少數據需求。
  • 擴展方向:論文提出將ViT應用于檢測、分割等任務(后續研究如DETR已驗證其可行性),這可能是你未來研究的一個切入點。

結語

Vision Transformer以其簡潔而大膽的設計,打破了CNN在計算機視覺中的壟斷地位。它告訴我們,當數據和算力足夠時,模型可以從頭學習復雜的空間關系,而無需依賴傳統歸納偏置。作為一名NLP領域的深度學習研究者,你是否也從中看到了Transformer無限可能的未來?歡迎留言分享你的看法!


參考文獻
Dosovitskiy, A., et al. (2021). An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale. ICLR 2021.

ViT代碼實現

以下是一個基于 PyTorch 的 Vision Transformer (ViT) 的完整、可運行的代碼實現。這個實現參考了原始論文《An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale》的核心思想,包含了 Patch Embedding、Multi-Head Self-Attention 和 Transformer Encoder 的主要組件,并以 MNIST 數據集為例進行訓練和測試。為了確保代碼可運行,盡量保持簡潔并提供注釋。

環境要求

  • Python 3.8+
  • PyTorch 2.0+
  • Torchvision

完整代碼

import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
from torch.utils.data import DataLoader
import torchvision
import torchvision.transforms as transforms# 超參數設置
image_size = 28  # MNIST 圖像大小為 28x28
patch_size = 7   # Patch 大小為 7x7
num_patches = (image_size // patch_size) ** 2  # 16 個 Patch
patch_dim = patch_size * patch_size * 1  # 輸入通道為 1 (灰度圖)
dim = 64         # 嵌入維度
depth = 6        # Transformer 層數
heads = 8        # 注意力頭數
mlp_dim = 128    # MLP 隱藏層維度
num_classes = 10 # MNIST 類別數
dropout = 0.1    # Dropout 率# 設備設置
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# Patch Embedding 模塊
class PatchEmbedding(nn.Module):def __init__(self, image_size, patch_size, patch_dim, dim, dropout):super().__init__()self.num_patches = (image_size // patch_size) ** 2# 線性投影:將 Patch 展平并映射到 dim 維度self.proj = nn.Linear(patch_dim, dim)# 位置編碼self.pos_embedding = nn.Parameter(torch.randn(1, self.num_patches + 1, dim))# CLS Tokenself.cls_token = nn.Parameter(torch.randn(1, 1, dim))self.dropout = nn.Dropout(dropout)def forward(self, x):B = x.shape[0]  # Batch Size# 將圖像分割為 Patch 并展平x = x.unfold(2, patch_size, patch_size).unfold(3, patch_size, patch_size)  # (B, C, H/p, W/p, p, p)x = x.permute(0, 2, 3, 1, 4, 5).contiguous()  # (B, H/p, W/p, C, p, p)x = x.view(B, self.num_patches, -1)  # (B, num_patches, patch_dim)# 線性投影x = self.proj(x)  # (B, num_patches, dim)# 添加 CLS Tokencls_tokens = self.cls_token.expand(B, -1, -1)  # (B, 1, dim)x = torch.cat((cls_tokens, x), dim=1)  # (B, num_patches + 1, dim)# 添加位置編碼x = x + self.pos_embeddingx = self.dropout(x)return x# 多頭自注意力模塊
class MultiHeadAttention(nn.Module):def __init__(self, dim, heads, dropout):super().__init__()self.heads = headsself.scale = (dim // heads) ** -0.5self.qkv = nn.Linear(dim, dim * 3, bias=False)  # 查詢、鍵、值投影self.dropout = nn.Dropout(dropout)self.proj = nn.Linear(dim, dim)  # 輸出投影def forward(self, x):B, N, C = x.shape  # (Batch, num_patches + 1, dim)# 生成 Q, K, Vqkv = self.qkv(x).reshape(B, N, 3, self.heads, C // self.heads).permute(2, 0, 3, 1, 4)q, k, v = qkv[0], qkv[1], qkv[2]  # (B, heads, N, dim/heads)# 注意力計算attn = (q @ k.transpose(-2, -1)) * self.scale  # (B, heads, N, N)attn = F.softmax(attn, dim=-1)attn = self.dropout(attn)# 加權求和x = (attn @ v).transpose(1, 2).reshape(B, N, C)  # (B, N, dim)x = self.proj(x)x = self.dropout(x)return x# Transformer Encoder 層
class TransformerEncoderLayer(nn.Module):def __init__(self, dim, heads, mlp_dim, dropout):super().__init__()self.norm1 = nn.LayerNorm(dim)self.attn = MultiHeadAttention(dim, heads, dropout)self.norm2 = nn.LayerNorm(dim)self.mlp = nn.Sequential(nn.Linear(dim, mlp_dim),nn.GELU(),nn.Dropout(dropout),nn.Linear(mlp_dim, dim),nn.Dropout(dropout))def forward(self, x):x = x + self.attn(self.norm1(x))  # 殘差連接x = x + self.mlp(self.norm2(x))  # 殘差連接return x# Vision Transformer 模型
class ViT(nn.Module):def __init__(self, image_size, patch_size, patch_dim, dim, depth, heads, mlp_dim, num_classes, dropout):super().__init__()self.patch_embed = PatchEmbedding(image_size, patch_size, patch_dim, dim, dropout)self.layers = nn.ModuleList([TransformerEncoderLayer(dim, heads, mlp_dim, dropout) for _ in range(depth)])self.norm = nn.LayerNorm(dim)self.head = nn.Linear(dim, num_classes)def forward(self, x):x = self.patch_embed(x)for layer in self.layers:x = layer(x)x = self.norm(x)cls_token = x[:, 0]  # 提取 CLS Tokenx = self.head(cls_token)return x# 數據加載
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,), (0.3081,))  # MNIST 均值和標準差
])train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=transform, download=True)
test_dataset = torchvision.datasets.MNIST(root='./data', train=False, transform=transform, download=True)
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)# 初始化模型、損失函數和優化器
model = ViT(image_size=image_size,patch_size=patch_size,patch_dim=patch_dim,dim=dim,depth=depth,heads=heads,mlp_dim=mlp_dim,num_classes=num_classes,dropout=dropout
).to(device)criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 訓練函數
def train(model, train_loader, criterion, optimizer, epoch):model.train()running_loss = 0.0for i, (images, labels) in enumerate(train_loader):images, labels = images.to(device), labels.to(device)optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()if i % 100 == 99:print(f'[Epoch {epoch+1}, Batch {i+1}] Loss: {running_loss / 100:.3f}')running_loss = 0.0# 測試函數
def test(model, test_loader):model.eval()correct = 0total = 0with torch.no_grad():for images, labels in test_loader:images, labels = images.to(device), labels.to(device)outputs = model(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()accuracy = 100 * correct / totalprint(f'Test Accuracy: {accuracy:.2f}%')return accuracy# 主訓練循環
num_epochs = 10
for epoch in range(num_epochs):train(model, train_loader, criterion, optimizer, epoch)test(model, test_loader)

代碼說明

  1. Patch Embedding:

    • 將 28x28 的 MNIST 圖像分割為 7x7 的 Patch(共 16 個 Patch),具體如何切割請參考筆者的另一篇博客:PyTorch 的 unfold 函數:深入解析與在 Vision Transformer (ViT) 中的應用。
    • 使用 unfold 操作分割圖像,然后通過線性層投影到指定維度(dim=64)。
    • 添加 CLS Token 和位置編碼。
  2. Multi-Head Self-Attention:

    • 實現多頭自注意力機制,Q、K、V 通過一個線性層生成。
    • 使用縮放點積注意力(Scaled Dot-Product Attention),并添加 Dropout。
  3. Transformer Encoder:

    • 包含 6 層 Transformer,每層有 MSA 和 MLP 塊,帶有殘差連接和 LayerNorm。
    • MLP 使用 GELU 激活函數。
  4. 分類頭:

    • 從最后一層提取 CLS Token,經過 LayerNorm 和線性層輸出 10 個類別。
  5. 訓練與測試:

    • 在 MNIST 數據集上訓練 10 個 epoch,使用 Adam 優化器。
    • 每 100 個批次打印損失,并在每個 epoch 后測試準確率。

運行結果

在 CPU 或 GPU 上運行此代碼,將下載 MNIST 數據集并開始訓練。預期結果:

  • 訓練損失逐漸下降。
  • 測試準確率在 10 個 epoch 后可能達到 95% 以上(具體取決于隨機性和硬件)。

注意事項

  • 計算資源:如果在 CPU 上運行,可能較慢;建議使用 GPU 加速。
  • 超參數調整:當前設置適合 MNIST,處理更高分辨率圖像(如 ImageNet)可能需要調整 patch_sizedimdepth
  • 擴展性:此代碼是基礎實現,未包含高級優化(如混合精度訓練或預訓練權重)。

參考

  • 原始論文:An Image is Worth 16x16 Words
  • PyTorch 官方文檔:torch.nn

希望這個實現對你理解 ViT 的工作原理有所幫助!如果需要更復雜的版本(例如支持 ImageNet 數據集或預訓練),可以進一步擴展。歡迎反饋或提問!


ViT 層的行為分析

引言

作為深度學習研究者,你對 Transformer 在 NLP 中的層級行為可能已非常熟悉:早期層關注語法和局部依賴,深層捕捉語義和長距離關系。那么,在計算機視覺的 Vision Transformer(ViT)中,層的行為是否類似?本文將深入探討 ViT 的層級特征提取,特別關注其與 CNN 的對比,并分析第 31、32 層等深層的特性,結合現有研究提供全面見解。

CNN 的層級特征提取:從低級到高級

CNN (具體可以參考筆者的另一篇博客:卷積神經網絡(CNN):深度解析其原理與特性)的強大之處在于其深層結構:

  • 淺層(如第 1、2 層):通過小卷積核提取低級特征,如邊緣、紋理,感受野小,專注于局部信息。
  • 深層(如第 10 層或更深):通過堆疊卷積和池化層,感受野擴展,逐步學習高級語義特征,如對象部件(例如貓的耳朵)或整體形狀(例如整只貓)。數學上,感受野擴展遵循公式:
    R F l = R F l ? 1 + ( k ? 1 ) ? ∏ i = 1 l ? 1 s i RF_l = RF_{l-1} + (k-1) \cdot \prod_{i=1}^{l-1} s_i RFl?=RFl?1?+(k?1)?i=1l?1?si?
    其中 ( R F l RF_l RFl? ) 是第 ( l l l ) 層的感受野大小,( k k k ) 是卷積核大小,( s i s_i si? ) 是之前各層的步幅。這使得深層 CNN 能捕捉全局上下文。

這種層次結構是 CNN 的歸納偏置(inductive bias),使其在數據量有限時表現良好。

ViT 的層級行為:從 Patch 到語義

ViT 的輸入是將圖像分割為固定大小的 Patch(如 16x16),每個 Patch 線性嵌入后添加位置編碼,輸入 Transformer 編碼器。編碼器由多頭自注意力(MSA)和多層感知機(MLP)塊交替組成。以下是層的行為分析:

早期層(如第 1、2 層)
  • 自注意力(MSA):從第一層起,MSA 允許每個 Patch 嵌入關注整個序列(所有 Patch),這與 CNN 的局部卷積不同。研究表明 [1],早期層的某些注意力頭表現出全局行為,關注整個圖像,而其他頭則聚焦于局部區域,類似于 CNN 的早期卷積層。
  • MLP 塊:MLP 是局部的,平移等變的,類似于卷積層,但作用于 Patch 嵌入。它通過 GELU 非線性添加非線性變換,初步精煉特征。
  • 位置編碼:位置嵌入從一開始就編碼 2D 空間結構,研究顯示 [1],鄰近 Patch 的位置編碼更相似,反映行-列結構。
中間層(如第 15、16 層)
  • 注意力距離:研究 [2] 使用平均注意力距離分析,顯示隨著層數的增加,注意力范圍擴大。中間層開始更多地整合跨 Patch 的信息,形成更復雜的空間關系。
  • 特征整合:MSA 層繼續全局整合信息,MLP 層進一步非線性變換,逐步從 Patch 級別的原始信息向更高層次的表示過渡。
深層(如第 31、32 層)
  • 深層行為:對于深層(如第 31、32 層),需要注意 ViT 的層數通常較少(如 ViT-B/16 有 12 層),因此第 31、32 層可能超出了標準模型的深度。但假設模型有 32 層,研究 [3] 表明:
    • 深層注意力頭幾乎全部關注全局,平均注意力距離最大,專注于與任務相關的語義區域(如對象的關鍵部分)。
    • CLS Token(分類標記)的輸出在深層更能代表整個圖像的語義信息,適合分類任務。
  • 任務依賴:深層的具體特性高度依賴訓練數據和任務。例如,在廣義零樣本學習(GZSL)中,研究 [4] 發現第 11 層(12 層模型)CLS 特征表現最佳,表明深層更適合提取屬性相關信息。
與 CNN 的對比:層次結構的差異
  • CNN 的層次結構:CNN 從邊緣到紋理,再到對象部件和整體,層次明確,歸納偏置強(如局部性、平移不變性)。深層逐步擴展感受野,構建明確的高級特征。
  • ViT 的靈活性:ViT 缺乏這種固有層次結構,早期層已能全局整合信息,深層更多是精煉注意力,聚焦語義相關區域。這種數據驅動的特性使其在大數據集上表現優異,但小數據集時可能不如 CNN。
研究論文與結論

以下是關鍵研究:

  • [1] Dosovitskiy, A., et al. (2021). An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale. ICLR 2021. 分析了注意力距離,顯示深層更全局,附錄 D.7 提供詳細可視化。
  • [2] Investigating Vision Transformer representations,通過注意力距離和熱圖分析,確認深層更關注語義信息,提供可復制筆記本。
  • [3] Visualizing Attention in Vision Transformers,可視化注意力圖,顯示深層聚焦任務相關區域。
  • [4] Vision Transformer-based Feature Extraction for Generalized Zero-Shot Learning,發現深層(如第 11 層)CLS 特征更適合 GZSL,圖 6 展示層級性能。

結論:

  • ViT 的層從淺到深確實有從局部到全局的轉變,但不像 CNN 那樣有嚴格的低級到高級特征層次。
  • 早期層(如第 1、2 層)關注局部和全局信息,深層(如第 31、32 層,假設模型足夠深)更聚焦語義,具體特性依賴訓練和任務。
  • 這種靈活性使 ViT 在大數據集上表現優異,彌補了缺乏 CNN 歸納偏置的不足。
表 1:ViT 與 CNN 層級行為的對比
特性CNNViT
早期層關注低級特征(如邊緣、紋理)局部和全局信息,部分頭全局關注
深層關注高級語義(如對象部件、整體)更全局,聚焦任務相關語義區域
層次結構明確,低級到高級逐步構建數據驅動,無嚴格層次,靈活性高
歸納偏置強(如局部性、平移不變性)弱,依賴大數據訓練
深層(如第 31、32 層)特性捕捉全局對象,明確語義假設深,聚焦語義,任務依賴
討論與未來方向

對于第 31、32 層,當前研究多集中于 12-24 層的標準 ViT 模型,深層(如 32 層)行為需更多實驗驗證。未來可探索自監督預訓練(如掩碼 Patch 預測)如何影響深層特征,及如何設計更高效的層級結構,結合 CNN 和 ViT 的優勢。


后記

2025年3月12日19點34分于上海,在Grok 3大模型輔助下完成。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/72097.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/72097.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/72097.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【實戰ES】實戰 Elasticsearch:快速上手與深度實踐-8.1.1基于ES的語義搜索(BERT嵌入向量)

👉 點擊關注不迷路 👉 點擊關注不迷路 👉 點擊關注不迷路 文章大綱 基于Elasticsearch與BERT的語義搜索架構設計與實戰1. 傳統搜索的局限性與語義搜索的崛起1.1 關鍵詞搜索 vs 語義搜索1.2 Elasticsearch向量檢索演進歷程關鍵版本特性對比 2.…

linux 學習筆記

# Linux學習筆記 ## 1 Linux入門 ### 1.1 概述 Linux內核最初只是芬蘭人在赫爾辛基大學上學時處于個人愛好而編寫的。 Linux是一套免費使用和自 由傳播的類Unix操作系統,是一個基于POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統。Linux能運行主要的U…

Python個人學習筆記(14):函數(匿名函數、內置函數(下)、三元表達式)

九、匿名函數 lambda表達式 語法規則&#xff1a; 變量 lambda 參數1,參數2,…:返回值 例&#xff1a;用lambda簡化下述操作 def func(a,b):return ab ret func(1, 2) print(ret)代碼&#xff1a; fn lambda a,b:ab print(fn) print(fn(12,13))結果&#xff1a; <fun…

dns劫持是什么?常見的劫持類型有哪些?如何預防?

DNS劫持的定義 DNS劫持&#xff08;Domain Name System Hijacking&#xff09;是一種網絡攻擊手段&#xff0c;攻擊者通過篡改域名解析的過程&#xff0c;將用戶對某個域名的訪問請求重定向到錯誤或惡意的IP地址。這種攻擊可能導致用戶訪問到釣魚網站、惡意廣告頁面&#xff0…

prompt大師高效提示詞解析

Prompt大師李繼剛高效提示詞示例解析 一、「漢語新解」提示詞 核心結構 采用Lisp語言框架嵌套中文語義&#xff0c;通過(defun 新漢語老師 ()...)定義角色風格&#xff08;融合奧斯卡王爾德、魯迅的批判性語言&#xff09;&#xff0c;用(隱喻 (一針見血...))構建解釋邏輯鏈。…

基于 Vue 的Deepseek流式加載對話Demo

目錄 引言組件概述核心組件與功能實現1. 消息顯示組件&#xff08;Message.vue&#xff09;2. 輸入組件&#xff08;Input.vue&#xff09;3. 流式請求處理&#xff08;useDeepseek.ts&#xff09;4. 語音處理模塊&#xff08;Voice.vue&#xff09; 總結Demo Github 地址 引言…

RK3588 編譯 openssl

在編譯 OpenSSL 時,你需要確保你的系統環境已經配置好了所有必要的依賴和編譯工具。下面是一般步驟和一些常見問題的解決方案,特別是在使用 RK3588 這類的 ARM 處理器上。 1. 安裝依賴 首先,你需要安裝編譯 OpenSSL 所需的依賴。這通常包括編譯器(如 GCC)、make 工具、Per…

常見JVM命令

1. java -XX:PrintCommandLineFlags HelloGC 作用&#xff1a;打印 JVM 啟動時的命令行參數&#xff0c;包括用戶顯式設置的參數和 JVM 自動默認設置的參數。用于確認 JVM 實際使用的配置。 2. java -Xmn10M -Xms40M -Xmx60M -XX:PrintCommandLineFlags -XX:PrintGC -XX:Prin…

easy-poi導出and導入一對多數據excel

easy-poi導出and導入一對多數據excel 一、導入jar包 <!-- easy-poi --><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.4.0</version></dependency> 二…

c#如何直接獲取json中的某個值

在 C# 中直接獲取 JSON 中的某個值,通常可以通過以下方法實現(以 Newtonsoft.Json 和 .NET 內置的 System.Text.Json 為例): 方法 1:使用 System.Text.Json(.NET 內置庫) using System.Text.Json;// 示例 JSON 字符串 string json = @"{""name"&qu…

WPS二次開發系列:Android 第三方應用如何獲取WPS端內文檔

1.需求場景 在項目開發中碰到這種情況&#xff0c;我們需要利用WPS的文檔管理能力&#xff0c;比如需要調用WPS的文件選擇器&#xff0c;來選擇文檔&#xff0c;同時需要得到WPS選擇的文檔結果返回給我們的應用。之前在網上找到了很久都沒有找到WPS移動端有相關的API接口文檔和…

Pytesseract識別圖片

1. Pytesseract識別圖片原理 1.1 Tesseract引擎工作原理 Tesseract OCR 引擎是一個功能強大的開源文字識別工具&#xff0c;其工作原理可以分為以下幾個關鍵步驟&#xff1a; 圖像預處理&#xff1a;Tesseract 首先對輸入的圖像進行預處理&#xff0c;包括灰度化、二值化、去…

Flutter 基礎組件 Text 詳解

目錄 1. 引言 2. 基本使用 3. 自定義樣式 4. 文本對齊與溢出控制 5. 外邊距 5.1 使用 Container 包裹 5.2 使用 Padding 組件 5.3 在 Row/Column 中使用 5.4 動態邊距調整 5.5 關鍵區別說明 5.6 設置 margin 無效 6. 結論 相關推薦 1. 引言 Text 組件是 Flutter 中…

Acknowledgment.nack方法重試消費kafka消息異常

文章目錄 問題示例異常 原因nack方法Acknowledgment接口實現類&#xff1a;ConsumerAcknowledgment實現類&#xff1a;ConsumerBatchAcknowledgment 解決方案1 批量消費指定index示例 2 單條消費示例 問題 使用BatchAcknowledgingMessageListener 批量消費Kafka消息&#xff0…

Java 反序列化 - commons collection 之困(一)

#01多余的碎碎念 說到 java 反序列化&#xff0c;去搜索的話能看到網上有很多分析關于 commons collection 利用鏈的文章&#xff0c;emm 我一開始看不懂&#xff0c;看到很多代碼的圖頭暈。 這篇文章的話其實是我跟著 p 神的文章一路走下來的&#xff0c;所以整個邏輯會按照…

python LLM工具包

阿里云鏡像pypi http://mirrors.aliyun.com/pypi/simple/ modelscope魔塔 pip install modelscope https://modelscope.cn/docs/models/download Sentence-transformers pip install -U sentence-transformers pip3 install torch -i https://pypi.tuna.tsinghua.edu.cn/sim…

Linux賬號和權限管理

用戶賬戶管理 理論 /etc/passwd 該目錄用于保存用戶名&#xff0c;宿主目錄&#xff0c;登錄shel等基本信息 /etc/shadow 該目錄用于保存 用戶密碼&#xff0c;賬戶有效期等信息 圖上每一行中都有用“&#xff1a;”隔斷的字段 字段含義&#xff1a; 第1字段:用戶賬號的名…

晉升系列4:學習方法

每一個成功的人&#xff0c;都是從底層開始打怪&#xff0c;不斷的總結經驗&#xff0c;一步一步打上來的。在這個過程中需要堅持、總結方法論。 對一件事情長久堅持的人其實比較少&#xff0c;在堅持的人中&#xff0c;不斷的總結優化的更少&#xff0c;所以最終達到高級別的…

win32匯編環境,對話框中使用樹形視圖示例四

;運行效果,當點擊張遼時,展示張遼的圖像 ;當點擊曹仁時,展示曹仁的圖像 ;win32匯編環境,對話框中使用樹形視圖示例四 ;當點擊樹形視圖treeview控件中的某項時,展示某些功能。這里展示的是當點到某個將領時,顯示某個將領的圖像 ;直接抄進RadAsm可編譯運行。重要部分加備注。…

智慧停車小程序:實時車位查詢、導航與費用結算一體化

智慧停車小程序:實時車位查詢、導航與費用結算一體化 一、城市停車困境的數字化突圍 中國機動車保有量突破4.3億輛,但車位供給缺口達8000萬。傳統停車管理模式存在三大致命傷: 盲盒式尋位:62%的車主遭遇"地圖顯示有位,到場已滿員"的窘境迷宮式導航:商場停車場…