Implementasi Glom, ide baru Geoffrey Hinton yang mengintegrasikan konsep dari bidang saraf, pemrosesan top-down-bottom-up, dan perhatian (konsensus antar kolom) untuk mempelajari hierarki sebagian-keseluruhan yang muncul dari data.
Video Yannic Kilcher berperan penting dalam membantu saya memahami makalah ini
$ 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)
Teruskan argumen kata kunci return_all = True
, dan Anda akan mendapatkan semua status kolom dan level per iterasi, (termasuk status awal, jumlah iterasi + 1). Anda kemudian dapat menggunakan ini untuk melampirkan kerugian apa pun pada output level mana pun pada langkah waktu mana pun.
Ini juga memberi Anda akses ke semua data level di seluruh iterasi untuk pengelompokan, yang darinya seseorang dapat memeriksa pulau-pulau yang diteorikan di makalah.
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)
Menolak pembelajaran yang diawasi sendiri karena mendorong kemunculan, seperti yang dijelaskan oleh Hinton
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 ()
Anda dapat meneruskan status kolom dan level kembali ke model untuk melanjutkan dari bagian terakhir yang Anda tinggalkan (mungkin jika Anda memproses frame berturut-turut dari video lambat, seperti yang disebutkan di makalah)
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
Terima kasih kepada Cfoster0 karena telah meninjau kodenya
@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 }
}