我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。
在原始的 ViT 論文中,這些區塊在被線性嵌入到適合 Transformer 的維度後,會直接輸入到 Transformer 模型中,亦即,這些區塊就是 Transformer 模型讀取的「詞」,因此,在 ViT 的上下文中,「處理後的區塊」指的是從原始圖像中創建的區塊,然後重塑為 Transformer 的二維輸入矩陣,這種轉換過程是 ViT 中數據預處理的重要部分。
針對 AI說書 - 從0開始 - 489 | Vision Transformer 特徵提取器核心理念說明 中的內容,實作為:
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
transform = transforms.Compose([transforms.Resize((224, 224)), transforms.ToTensor()])
pixel_values = transform(image).unsqueeze(0) # Add an extra dimension for the batch size
patch_size = 16
patches = pixel_values.unfold(2, patch_size, patch_size).unfold(3, patch_size, patch_size)
當中程式碼解說如下:
- pixel_values 是一個四維的 Tensor,形狀為 (Batch_Size, Channels, Height, Width)
- unfold(dim, size, step) 是 PyTorch 中的函數,用來從 Tensor 中提取滑動區塊,並形成一個較小的窗口,這裡的 dim 是維度,size 是窗口大小,step 是每次移動的步長
- pixel_values.unfold(2, patch_size, patch_size) 對 Height 維度進行展開操作,將圖像高度分割成大小為 patch_size x patch_size 的區塊,並沿著高度方向以 patch_size 的步長滑動
- unfold(3, patch_size, patch_size) 對 Width 維度進行展開操作,將圖像寬度分割成相同大小的區塊,並沿著寬度方向滑動,步長也為 patch_size
- 經過兩次 .unfold 後,pixel_values 形狀會變成 (batch_size, channels, num_patches_height, num_patches_width, patch_size, patch_size)





















