我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。
針對 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)