تنفيذ جلوم، فكرة جيفري هينتون الجديدة التي تدمج المفاهيم من المجالات العصبية، والمعالجة من أعلى إلى أسفل من أسفل إلى أعلى، والاهتمام (الإجماع بين الأعمدة) لتعلم التسلسلات الهرمية الجزئية الناشئة من البيانات.
كان فيديو يانيك كيلشر مفيدًا في مساعدتي على فهم هذه الورقة
$ 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 }
}