การนำ Glom มาใช้ ซึ่งเป็นแนวคิดใหม่ของเจฟฟรีย์ ฮินตัน ที่ผสมผสานแนวคิดจากสนามประสาท การประมวลผลจากบนลงล่างจากล่างขึ้นบน และความสนใจ (ฉันทามติระหว่างคอลัมน์) สำหรับการเรียนรู้ลำดับชั้นบางส่วนที่เกิดขึ้นจากข้อมูลทั้งหมด
วิดีโอของ Yannic Kilcher มีประโยชน์ในการช่วยให้ฉันเข้าใจบทความนี้
$ pip install glom-pytorch
import torch
from glom_pytorch import Glom
model = Glom (
dim = 512 , # dimension
levels = 6 , # number of levels
image_size = 224 , # image size
patch_size = 14 # patch size
)
img = torch . randn ( 1 , 3 , 224 , 224 )
levels = model ( img , iters = 12 ) # (1, 256, 6, 512) - (batch - patches - levels - dimension)
ส่งผ่านอาร์กิวเมนต์คำหลัก return_all = True
ไปข้างหน้า และคุณจะได้รับส่งคืนสถานะคอลัมน์และระดับทั้งหมดต่อการวนซ้ำ (รวมถึงสถานะเริ่มต้น จำนวนการวนซ้ำ + 1) จากนั้นคุณสามารถใช้สิ่งนี้เพื่อแนบการสูญเสียกับเอาต์พุตระดับใดก็ได้ในขั้นตอนใดก็ได้
นอกจากนี้ยังช่วยให้คุณเข้าถึงข้อมูลระดับทั้งหมดในการวนซ้ำสำหรับการจัดกลุ่ม ซึ่งสามารถตรวจสอบเกาะตามทฤษฎีในรายงานได้
import torch
from glom_pytorch import Glom
model = Glom (
dim = 512 , # dimension
levels = 6 , # number of levels
image_size = 224 , # image size
patch_size = 14 # patch size
)
img = torch . randn ( 1 , 3 , 224 , 224 )
all_levels = model ( img , iters = 12 , return_all = True ) # (13, 1, 256, 6, 512) - (time, batch, patches, levels, dimension)
# get the top level outputs after iteration 6
top_level_output = all_levels [ 7 , :, :, - 1 ] # (1, 256, 512) - (batch, patches, dimension)
ปฏิเสธการเรียนรู้ด้วยตนเองเพื่อส่งเสริมให้เกิดการเกิดขึ้น ดังที่ฮินตันอธิบายไว้
import torch
import torch . nn . functional as F
from torch import nn
from einops . layers . torch import Rearrange
from glom_pytorch import Glom
model = Glom (
dim = 512 , # dimension
levels = 6 , # number of levels
image_size = 224 , # image size
patch_size = 14 # patch size
)
img = torch . randn ( 1 , 3 , 224 , 224 )
noised_img = img + torch . randn_like ( img )
all_levels = model ( noised_img , return_all = True )
patches_to_images = nn . Sequential (
nn . Linear ( 512 , 14 * 14 * 3 ),
Rearrange ( 'b (h w) (p1 p2 c) -> b c (h p1) (w p2)' , p1 = 14 , p2 = 14 , h = ( 224 // 14 ))
)
top_level = all_levels [ 7 , :, :, - 1 ] # get the top level embeddings after iteration 6
recon_img = patches_to_images ( top_level )
# do self-supervised learning by denoising
loss = F . mse_loss ( img , recon_img )
loss . backward ()
คุณสามารถส่งผ่านสถานะของคอลัมน์และระดับกลับเข้าไปในโมเดลเพื่อดำเนินการต่อจากจุดที่คุณค้างไว้ (บางทีหากคุณกำลังประมวลผลเฟรมต่อเนื่องกันของวิดีโอช้า ดังที่กล่าวไว้ในรายงาน)
import torch
from glom_pytorch import Glom
model = Glom (
dim = 512 ,
levels = 6 ,
image_size = 224 ,
patch_size = 14
)
img1 = torch . randn ( 1 , 3 , 224 , 224 )
img2 = torch . randn ( 1 , 3 , 224 , 224 )
img3 = torch . randn ( 1 , 3 , 224 , 224 )
levels1 = model ( img1 , iters = 12 ) # image 1 for 12 iterations
levels2 = model ( img2 , levels = levels1 , iters = 10 ) # image 2 for 10 iteratoins
levels3 = model ( img3 , levels = levels2 , iters = 6 ) # image 3 for 6 iterations
ขอขอบคุณ Cfoster0 สำหรับการตรวจสอบโค้ด
@misc { hinton2021represent ,
title = { How to represent part-whole hierarchies in a neural network } ,
author = { Geoffrey Hinton } ,
year = { 2021 } ,
eprint = { 2102.12627 } ,
archivePrefix = { arXiv } ,
primaryClass = { cs.CV }
}