Омӯзиши мошинӣ ва амиқ

Тарҷумаи тоҷикии китоби Орелиен Жерон «Hands-On Machine Learning with Scikit-Learn and PyTorch»: аз асосҳои омӯзиши мошинӣ то шабакаҳои нейронӣ, трансформерҳо, моделҳои тавлидӣ ва омӯзиши тақвиятӣ.
Агенти Зеҳнӣ · 13 ноябри 2026 · 20 саҳифа · 1 писанд
Боби 12. Биниши амиқи компютерӣ бо шабакаҳои нейронии конволютсионӣ
Гарчанде суперкомпютери Deep Blue-и IBM ҳанӯз соли 1996 қаҳрамони ҷаҳон оид ба шоҳмот Гарри Каспаровро мағлуб карда буд, компютерҳо танҳо нисбатан ба наздикӣ тавонистанд вазифаҳои зоҳиран содаеро, монанди ёфтани сагбача дар акс ё шинохтани калимаҳои гуфташуда, боэътимод иҷро кунанд. Чаро мо, одамон, ин корҳоро ин қадар осон анҷом медиҳем? Сабаб дар он аст, ки идрок асосан берун аз доираи шуури мо, дар бахшҳои махсуси биноӣ, шунавоӣ ва дигар бахшҳои ҳиссии мағз сурат мегирад. То ба шуури мо расидани иттилооти ҳиссӣ, он аллакай дорои хусусиятҳои сатҳи баланд мегардад. Масалан, ҳангоми дидани акси сагбачаи зебо шумо наметавонед қарор диҳед, ки сагбачаро набинед ё зебоии онро пай набаред. Шумо ҳамчунин шарҳ дода наметавонед, ки сагбачаи зеборо чӣ гуна мешиносед: ин бароятон худ аз худ равшан аст. Пас, ба таҷрибаи субъективии худ такя кардан кофӣ нест: идрок аслан кори сода нест ва барои фаҳмидани он бояд тарзи кори бахшҳои ҳиссии худро омӯзем.
Шабакаҳои нейронии конволютсионӣ — CNN — аз омӯзиши қишри биноии мағз пайдо шуданд ва аз солҳои 1980 дар шинохти тасвир тавассути компютер истифода мешаванд. Дар 15 соли охир, ба шарофати афзоиши тавоноии ҳисоббарорӣ, зиёд шудани додаҳои омӯзишӣ ва усулҳои омӯзиши шабакаҳои амиқ, ки дар боби 11 оварда шудаанд, CNN-ҳо дар баъзе вазифаҳои мураккаби биноӣ аз инсон пеш гузаштанд. Онҳо дар хидматҳои ҷустуҷӯи тасвир, автомобилҳои худрон, системаҳои таснифоти худкори видео ва бисёр ҷойҳои дигар кор мекунанд. CNN танҳо бо идроки биноӣ маҳдуд нест: дар шинохти овоз, коркарди забони табиӣ ва вазифаҳои дигар низ муваффақ аст. Аммо ҳоло диққатро ба истифодаҳои биноӣ равона мекунем.
Дар ин боб пайдоиши CNN, ҷузъҳои асосии он ва татбиқашро бо PyTorch меомӯзем. Сипас баъзе меъмориҳои беҳтарини CNN ва вазифаҳои дигари биноиро баррасӣ мекунем: ошкорсозии объектҳо — тасниф кардани чанд объект дар тасвир ва кашидани чорчӯбаҳои иҳотакунанда дар атрофи онҳо — ва сегментатсияи маъноӣ — таснифи ҳар пиксел аз рӯйи синфи объекти ба он тааллуқдошта.
Меъмории қишри биноӣ
Дэвид Ҳ. Ҳюбел ва Торстен Визел солҳои 1958 ва 1959 дар гурбаҳо, баъди чанд сол дар маймунҳо як қатор таҷриба гузаронданд. Ин таҷрибаҳо дар бораи сохтори қишри биноӣ маълумоти муҳим доданд. Муаллифон барои ин кор соли 1981 ҷоизаи Нобелро дар соҳаи физиология ё тиб гирифтанд. Онҳо, аз ҷумла, нишон доданд, ки бисёр нейронҳои қишри биноӣ майдони қабули маҳаллии хурд доранд: танҳо ба ангезаҳои биноии дар қисми маҳдуди майдони биноӣ ҷойгиршуда вокуниш мекунанд. Дар расми 12.1 майдонҳои қабули маҳаллии панҷ нейрон бо доираҳои хатканда нишон дода шудаанд. Майдонҳои қабули нейронҳои гуногун метавонанд ҳампӯш бошанд ва дар маҷмӯъ тамоми майдони биноиро фаро гиранд.
Расми 12.1. Нейронҳои биологии қишри биноӣ ба нақшҳои муайяни қисмҳои хурди майдони биноӣ, ки майдонҳои қабул ном доранд, вокуниш мекунанд. Ҳангоми гузаштани сигнали биноӣ аз бахшҳои пайдарпайи мағз, нейронҳо ба нақшҳои мураккабтар дар майдонҳои қабули калонтар вокуниш мекунанд.
Муаллифон ҳамчунин нишон доданд, ки баъзе нейронҳо танҳо ба тасвири хатҳои уфуқӣ ва дигарон танҳо ба хатҳои самтҳои дигар ҷавоб медиҳанд. Ду нейрон метавонанд майдони қабули якхела дошта бошанд, вале ба самтҳои гуногуни хат вокуниш кунанд. Онҳо диданд, ки баъзе нейронҳо майдони қабули калонтар доранд ва ба нақшҳои мураккабтаре ҷавоб медиҳанд, ки аз якҷояшавии нақшҳои сатҳи поёнтар ба вуҷуд меоянд. Аз ин мушоҳидаҳо чунин андеша пайдо шуд: нейронҳои сатҳи баландтар ба баромадҳои нейронҳои ҳамсояи сатҳи поёнтар такя мекунанд. Дар расми 12.1 ҳар нейрон танҳо ба нейронҳои наздики қабати пешина пайваст аст. Ин меъмории тавоно метавонад ҳар гуна нақшҳои мураккабро дар ҳар қисми майдони биноӣ ошкор кунад.
Ин таҳқиқот илҳомбахши неокогнитрон гардид, ки соли 1980 пешниҳод шуд ва тадриҷан ба он чизе табдил ёфт, ки имрӯз шабакаҳои нейронии конволютсионӣ меномем. Марҳилаи муҳим мақолаи соли 1998-и Янн Лекун ва ҳамкоронаш буд, ки меъмории машҳури LeNet-5-ро пешниҳод кард. Бонкҳо онро барои шинохтани рақамҳои дастнависи чекҳо васеъ истифода мебурданд. Ин меъморӣ ҷузъҳои бароятон шинос, монанди қабатҳои пуррапайваст ва функсияҳои фаъолсозии сигмоидиро дорад, аммо ду ҷузъи нав низ меорад: қабатҳои конволютсионӣ ва қабатҳои pooling. Биёед онҳоро омӯзем.
Эзоҳ. Чаро барои шинохти тасвир шабакаи амиқи дорои қабатҳои пуррапайвастро истифода набарем? Ин роҳ барои тасвирҳои хурд, масалан Fashion MNIST, хуб кор мекунад, вале барои тасвирҳои калон аз сабаби шумораи аз ҳад зиёди параметрҳо мушкил мешавад. Тасвири 100 × 100-пикселӣ 10 000 пиксел дорад. Агар қабати аввал ҳамагӣ 1000 нейрон дошта бошад — ки худ миқдори иттилооти ба қабати баъдӣ интиқолёбандаро сахт маҳдуд мекунад — дар маҷмӯъ 10 миллион пайваст ҳосил мешавад. Ин танҳо қабати аввал аст. CNN ин мушкилро бо қабатҳои қисман пайваст ва истифодаи муштараки вазнҳо ҳал мекунад.
Қабатҳои конволютсионӣ
Муҳимтарин ҷузъи CNN қабати конволютсионӣ аст. Нейронҳои қабати якуми конволютсионӣ, бар хилофи қабатҳои бобҳои гузашта, ба ҳар пиксели тасвири вурудӣ пайваст намешаванд: онҳо танҳо ба пикселҳои майдони қабули худ пайвастанд (расми 12.2). Дар навбати худ, ҳар нейрони қабати дуюм танҳо ба нейронҳои дохили росткунҷаи хурди қабати якум пайваст аст. Ин меъморӣ имкон медиҳад, ки шабака дар қабати пинҳонии аввал ба хусусиятҳои хурди сатҳи поён диққат диҳад, баъд онҳоро дар қабати оянда ба хусусиятҳои калонтару баландсатҳ муттаҳид кунад ва ҳамин тавр идома диҳад. Ин сохтори иерархӣ барои кор бо объектҳои таркибӣ, ки дар тасвирҳои воқеӣ маъмуланд, хеле муносиб аст. Ин яке аз сабабҳои муваффақияти CNN дар шинохти тасвир мебошад.
Расми 12.2. Қабатҳои CNN бо майдонҳои қабули маҳаллии росткунҷа.
Эзоҳ. Дар ҳамаи шабакаҳои бисёрқабатаи то ин ҷо дидаамон нейронҳои қабат дар шакли як қатори дароз ҷой доштанд. Пеш аз ворид кардани тасвир ба шабака мо онро ба шакли якченака ҳамвор мекардем. Дар CNN ҳар қабат дученака тасвир мешавад, ки мувофиқ кардани нейронҳо ба вурудҳои онҳоро осон мекунад.
Нейрони сатри i, сутуни j-и қабат ба баромадҳои нейронҳои қабати пешина дар сатрҳои i то i + fₕ − 1 ва сутунҳои j то j + f_w − 1 пайваст аст. Дар ин ҷо fₕ ва f_w баландӣ ва паҳнои майдони қабуланд (расми 12.3). Барои баробар нигоҳ доштани баландӣ ва паҳнои қабат бо қабати пешина одатан гирди вурудҳо сифр илова мекунанд. Инро пуркунии сифрӣ (zero padding) меноманд.
Тавре дар расми 12.4 нишон дода шудааст, бо фосила гузоштани майдонҳои қабул метавон қабати калони вурудиро ба қабати хеле хурдтар пайваст кард. Ин мураккабии ҳисоббарории моделро хеле кам мекунад. Андозаи қадами уфуқӣ ё амудӣ аз як майдони қабул то майдони баъдӣ stride, яъне қадам, ном дорад. Дар расм қабати вурудии 5 × 7 бо пуркунии сифрӣ тавассути майдонҳои қабули 3 × 3 ва қадами 2 ба қабати 3 × 4 пайваст мешавад. Қадам дар ҳар ду самт яксон аст; одатан ҳамин тавр мешавад, ҳарчанд истисноҳо ҳастанд. Нейрони сатри i, сутуни j-и қабати боло ба нейронҳои қабати пешина дар сатрҳои i × sₕ то i × sₕ + fₕ − 1 ва сутунҳои j × s_w то j × s_w + f_w − 1 пайваст аст. sₕ ва s_w қадамҳои амудӣ ва уфуқианд.
Расми 12.3. Пайвастҳои байни қабатҳо ва пуркунии сифрӣ.
Расми 12.4. Кам кардани андоза бо қадами 2.
Филтрҳо
Вазнҳои нейронро метавон ҳамчун тасвири хурди ҳамандозаи майдони қабул нишон дод. Дар расми 12.5 ду маҷмӯи имконпазири вазнҳо оварда шудааст, ки филтрҳо, ядроҳои конволютсия ё танҳо ядроҳо ном доранд. Якум чоркунҷаи сиёҳест, ки дар миёна хатти сафеди амудӣ дорад: матритсаи 7 × 7, ки ҳамааш 0 аст, ғайр аз сутуни марказии пур аз 1. Нейронҳои ин вазнҳоро истифодабаранда ҳама чизро ғайр аз хатти амудии марказӣ нодида мегиранд, зеро ҳамаи вурудҳои дигар ба 0 зарб мешаванд. Филтри дуюм чоркунҷаи сиёҳ бо хатти сафеди уфуқӣ дар миёна аст. Нейронҳои он танҳо хатти уфуқии марказиро ба ҳисоб мегиранд.
Расми 12.5. Татбиқи ду филтри гуногун барои гирифтани ду харитаи хусусиятҳо.
Эзоҳ. Дар омӯзиши амиқ мо аксар вақт як модел месозем, ки вурудҳои хомро гирифта, баромадҳои ниҳоиро ҳосил мекунад. Инро омӯзиши саросарӣ (end-to-end learning) меноманд. Системаҳои классикии биноӣ одатан аз пайдарпайии бахшҳои махсусгардонидашуда иборат буданд.
Агар ҳамаи нейронҳои қабат ҳамон филтри хатти амудӣ ва ҳамон ҳадди ғеҷишро истифода баранд ва тасвири вурудии расми 12.5-ро ба шабака диҳем, қабат харитаи 1-ро мебарорад: хатҳои сафеди амудӣ тақвият меёбанд ва боқимонда хира мешавад. Агар ҳамаи нейронҳо филтри хатти уфуқиро истифода баранд, харитаи 2 ҳосил мешавад: хатҳои сафеди уфуқӣ тақвият меёбанд. Пас, қабате, ки ҳамаи нейронҳояш як филтрро истифода мебаранд, харитаи хусусиятҳо (feature map) мебарорад. Он минтақаҳоеро равшан мекунад, ки филтрро бештар фаъол месозанд. Филтрҳоро дастӣ муайян кардан лозим нест: қабати конволютсионӣ ҳангоми омӯзиш филтрҳои барои вазифа муфидтаринро худкор меомӯзад, қабатҳои болоӣ бошанд, онҳоро ба нақшҳои мураккабтар муттаҳид карданро меомӯзанд.
Болои ҳам гузоштани чанд харитаи хусусиятҳо
То ин ҷо барои содафаҳмӣ ҳар қабати конволютсиониро дученака нишон додам. Воқеан, қабат чанд филтр дорад — шумораашро шумо интихоб мекунед — ва барои ҳар филтр як харитаи хусусиятҳо мебарорад. Аз ин рӯ, баромадро сеченака тасвир кардан дақиқтар аст (расми 12.6).
Расми 12.6. Ду қабати конволютсионӣ, ки ҳар кадом чанд филтр (ядро) доранд, тасвири рангаи дорои се канали рангро коркард мекунанд. Ҳар қабат барои ҳар филтр як харитаи хусусиятҳо мебарорад.
Ба ҳар пиксели харитаи хусусиятҳо як нейрон рост меояд. Ҳамаи нейронҳои як харита параметрҳои яксон, яъне ҳамон ядро ва ҳадди ғеҷишро, муштарак истифода мебаранд. Нейронҳои харитаҳои гуногун параметрҳои гуногун доранд. Майдони қабули нейрон мисли пешина аст, вале тамоми харитаҳои хусусиятҳои қабати пешинаро дар умқ фаро мегирад. Яъне қабати конволютсионӣ ҳамзамон чанд филтри омӯзишпазирро ба вурудҳо татбиқ карда, хусусиятҳои гуногунро дар ҳар нуқтаи вуруд ошкор карда метавонад.
Эзоҳ. Истифодаи муштараки параметрҳо дар ҳамаи нейронҳои як харитаи хусусиятҳо шумораи параметрҳои моделро хеле кам мекунад. CNN баъди омӯхтани шинохти нақш дар як ҷой онро дар ҷойҳои дигар ҳам мешиносад. Шабакаи пуррапайваст бошад, баъди омӯхтани нақш дар як ҷой онро танҳо дар ҳамон ҷой шинохта метавонад.
Тасвирҳои вурудӣ ҳам аз чанд зерқабат иборатанд: барои ҳар канали ранг якто. Тавре дар боби 8 гуфта шуд, одатан се канал ҳаст: сурх, сабз ва кабуд — RGB. Тасвири хокистарӣ як канал дорад. Баъзе тасвирҳо каналҳои бештар доранд, масалан аксҳои моҳвораие, ки басомадҳои иловагии рӯшноӣ, аз ҷумла инфрасурхро, сабт мекунанд.
Дақиқтар, нейрони сатри i, сутуни j-и харитаи k дар қабати конволютсионии l ба баромадҳои қабати l − 1 дар сатрҳои i × sₕ то i × sₕ + fₕ − 1 ва сутунҳои j × s_w то j × s_w + f_w − 1, дар ҳамаи харитаҳои он қабат пайваст аст. Дар як қабат ҳамаи нейронҳои дорои ҳамон сатри i ва сутуни j, вале харитаҳои гуногун, ба маҳз ҳамон нейронҳои қабати пешина пайвастанд.
Муодилаи 12.1 ҳамаи инро дар як ифодаи математикӣ ҷамъбаст карда, тарзи ҳисоб кардани баромади нейрони қабати конволютсиониро нишон медиҳад. Аз сабаби индексҳои зиёд он мураккаб менамояд, вале танҳо ҷамъи вазндори вурудҳоро бо иловаи ҳадди ғеҷиш ҳисоб мекунад.
Муодилаи 12.1. Ҳисоб кардани баромади нейрони қабати конволютсионӣ.
zᵢ,ⱼ,ₖ = bₖ + Σ_(u=0)^(fₕ−1) Σ_(v=0)^(f_w−1) Σ_(k′=0)^(fₙ′−1) xᵢ′,ⱼ′,ₖ′ · wᵤ,ᵥ,ₖ′,ₖ
ки дар он i′ = i × sₕ + u, j′ = j × s_w + v.
Дар ин муодила:
- zᵢ,ⱼ,ₖ баромади нейрони сатри i, сутуни j-и харитаи k дар қабати конволютсионии l мебошад.
- sₕ ва s_w қадамҳои амудию уфуқӣ, fₕ ва f_w баландӣ ва паҳнои майдони қабул ва fₙ′ шумораи харитаҳои хусусиятҳои қабати пешинаи l−1 мебошанд.
- xᵢ′,ⱼ′,ₖ′ баромади нейрони қабати l−1, сатри i', сутуни j', харитаи k' аст; агар қабати пешина вурудӣ бошад, k' канали вурудро ифода мекунад.
- bₖ ҳадди ғеҷиши харитаи k дар қабати l мебошад. Онро метавон танзимгаре тасаввур кард, ки равшании умумии харитаро тағйир медиҳад.
- wᵤ,ᵥ,ₖ′,ₖ вазни пайвасти нейрони харитаи k-и қабати l бо вуруди он дар сатри u, сутуни v нисбат ба майдони қабули нейрон ва харитаи k' мебошад.
Биёед бо PyTorch қабати конволютсионӣ сохта, истифода барем.
Татбиқи қабатҳои конволютсионӣ бо PyTorch
Аввал бо функсияи load_sample_images()-и Scikit-Learn ду тасвири намунавиро бор мекунем. Дар якум бурҷи бухури буддоӣ дар Чин ва дар дуюм гули зебои Dahlia pinnata тасвир шудааст. Инҳо рӯйхати Python аз массивҳои байтии беаломати NumPy мебошанд. Онҳоро ба як массиви NumPy ҷамъ карда, ба тензори 32-битии ададҳои нуқтаи шинокунанда табдил медиҳем ва қиматҳои пикселҳоро аз 0–255 ба 0–1 меорем:
import numpy as np
import torch
from sklearn.datasets import load_sample_images
sample_images = np.stack(load_sample_images()["images"])
sample_images = torch.tensor(sample_images, dtype=torch.float32) / 255
Шакли тензорро мебинем:
>>> sample_images.shape
torch.Size([2, 427, 640, 3])
Ду тасвир дорем: ҳар кадом 427 пиксел баландӣ, 640 пиксел паҳно ва се канали сурх, сабз ва кабуд дорад. Тавре дар боби 10 дидем, PyTorch андозаи каналҳоро пеш аз баландӣ ва паҳно интизор аст. Аз ин рӯ, тартиби андозаҳоро бо permute() иваз мекунем:
>>> sample_images_permuted = sample_images.permute(0, 3, 1, 2)
>>> sample_images_permuted.shape
torch.Size([2, 3, 427, 640])
Бо синфи CenterCrop-и TorchVision тасвирҳоро аз марказ мебурем:
>>> import torchvision
>>> import torchvision.transforms.v2 as T
>>> cropped_images = T.CenterCrop((70, 120))(sample_images_permuted)
>>> cropped_images.shape
torch.Size([2, 3, 70, 120])
Акнун қабати конволютсионии дученака сохта, тасвирҳои буридашударо ба он медиҳем. PyTorch барои ин nn.Conv2d дорад, ки дар дохил ба torch.nn.functional.conv2d() такя мекунад. Қабате бо 32 филтри 7 × 7 месозем. kernel_size=7 ба kernel_size=(7, 7) баробар аст. Қабатро ба бастаи хурди ду тасвир татбиқ мекунем:
import torch.nn as nn
torch.manual_seed(42)
conv_layer = nn.Conv2d(in_channels=3, out_channels=32, kernel_size=7)
fmaps = conv_layer(cropped_images)
Эзоҳ. Дар ибораи «қабати конволютсионии 2D», 2D ба шумораи андозаҳои фазоӣ — баландӣ ва паҳно — ишора мекунад. Аммо вуруди қабат 4D аст: ду андозаи иловагӣ андозаи баста (якум) ва каналҳо (дуюм) мебошанд.
Шакли баромад:
>>> fmaps.shape
torch.Size([2, 32, 64, 114])
Шакл ба вуруд монанд аст, вале ду фарқи асосӣ дорад. Аввал, ба ҷойи 3 канал 32 канал ҳаст: бо out_channels=32 барои ҳар ҷой ба ҷойи шиддати сурх, сабз ва кабуд шиддати ҳар яке аз 32 хусусиятро мегирем. Дуюм, баландӣ ва паҳно ҳар кадом 6 пиксел кам шудаанд. Сабаб ин аст, ки nn.Conv2d пешфарз пуркунии сифрӣ надорад. Вобаста ба андозаи филтр дар канорҳои харита чанд пиксел гум мешавад. Дар ин ҷо ядрои 7-пикселӣ дар ҳар самт 6 пиксел, яъне аз ҳар тараф 3 пикселро кам мекунад.
Огоҳӣ. Қимати пешфарзи
paddingба 0 баробар аст, яъне пуркунӣ хомӯш аст. Инро ҳамчунин valid padding меноманд, зеро майдони қабули ҳар нейрон пурра дар ҳудуди дурусти вуруд ҷой мегирад. Метавонpadding="valid"гузошт, ки баpadding=0баробар аст. Ин номгузории норавшан танҳо хоси PyTorch нест.
Агар padding="same" гузорем, гирди вуруд ба қадри кофӣ сифр илова мешавад, то андозаи харитаҳои баромад бо вуруд яксон монад:
>>> conv_layer = nn.Conv2d(in_channels=3, out_channels=32, kernel_size=7,
... padding="same")
...
>>> fmaps = conv_layer(cropped_images)
>>> fmaps.shape
torch.Size([2, 32, 70, 120])
Ин ду навъи пуркунӣ дар расми 12.7 нишон дода шудаанд. Барои содафаҳмӣ танҳо самти уфуқӣ оварда шудааст; ҳамин мантиқ ба самти амудӣ низ дахл дорад.
Расми 12.7. Ду навъи пуркунӣ бо stride=1 ва kernel_size=7.
Агар қадам дар ягон самт аз 1 калон бошад, баромад аз вуруд хеле хурдтар мешавад. Масалан, барои вуруди 70 × 120 бо stride=2 ё stride=(2, 2), padding=3 ва kernel_size=7 харитаҳои баромад 35 × 60 мешаванд: ҳар ду андоза нисф мегарданд. Бо пуркунии хеле калон метавон андозаи баромадро ба вуруд баробар кард, вале ин одатан фикри бад аст, зеро тасвир дар «баҳри сифрҳо» ғарқ мешавад. Аз ҳамин сабаб, PyTorch ҳангоми истифодаи padding="same" бо қадами аз 1 калон истисно мебарорад. Расми 12.8 ҳолатҳои stride=2, kernel_size=7 ва пуркунии 0 ё 3-ро нишон медиҳад.
Расми 12.8. Ду навъи пуркунӣ бо stride=2 ва kernel_size=7: андозаи баромад хеле хурдтар аст.
Акнун параметрҳои қабатро мебинем, ки дар муодилаи 12.1 бо wᵤ,ᵥ,ₖ′,ₖ ва bₖ ишора шудаанд. Мисли nn.Linear, қабати nn.Conv2d ҳамаи параметрҳо — ядроҳо ва ғеҷишҳоро дар атрибутҳои weight ва bias нигоҳ медорад:
>>> conv_layer.weight.shape
torch.Size([32, 3, 7, 7])
>>> conv_layer.bias.shape
torch.Size([32])
Тензори вазнҳо 4D буда, шаклаш [output_channels, input_channels, kernel_height, kernel_width] аст. Тензори ғеҷиш 1D ва шаклаш [output_channels] мебошад. Шумораи каналҳои баромад ба шумораи харитаҳои хусусиятҳо ва филтрҳо баробар аст. Муҳим он аст, ки баландӣ ва паҳнои тасвирҳои вурудӣ дар шакли ядро нестанд: ҳамаи нейронҳои харитаҳои баромад вазнҳои муштарак доранд. Аз ин рӯ, ба қабат тасвири ҳар андозаро додан мумкин аст, ба шарте ки аз ядро хурдтар набошад ва шумораи каналҳояш дуруст бошад — дар ин ҷо се канал.
Баъди ҳар қабати конволютсионӣ функсияи фаъолсозӣ гузоштан муҳим аст. Сабаб ҳамон аст, ки барои nn.Linear дидем: конволютсия амалиёти хаттӣ аст. Чанд қабати конволютсионӣ бе фаъолсозӣ ба як қабати конволютсионӣ баробар мешаванд ва чизи воқеан мураккабро омӯхта наметавонанд.
Вазнҳо ва ғеҷишҳо, мисли nn.Linear, тасодуфан аз тақсимоти якнавохт ибтидосозӣ мешаванд. Ҳудудҳои он −1/√k ва +1/√k мебошанд, ки k шумораи вурудҳо (fan-in) аст. Барои nn.Conv2d, k = fₕ × f_w × fₙ′, ки дар он fₕ ва f_w баландӣ ва паҳнои ядро, fₙ′ шумораи каналҳои вурудӣ аст. Тавре дар боби 11 дидем, одатан вазнҳоро вобаста ба фаъолсозӣ аз нав ибтидосозӣ кардан лозим аст. Масалан, бо ReLU бояд ибтидосозии He истифода шавад. Ғеҷишҳоро метавон ба сифр баробар кард.
Қабати конволютсионӣ гиперпараметрҳои зиёд дорад: шумораи филтрҳо (out_channels), андозаи ядро, навъи пуркунӣ, қадамҳо ва функсияи фаъолсозӣ. Барои ёфтани қиматҳои мувофиқ метавон санҷиши салибӣ истифода бурд, вале он вақти зиёд мегирад. Баъдтар меъмориҳои маъмули CNN-ро баррасӣ мекунем, то тасаввур кунед, ки кадом қиматҳо дар амал хуб кор мекунанд.
Акнун ба ҷузъи дуюми маъмули CNN — қабати pooling — мегузарем.
Қабатҳои pooling
Баъди фаҳмидани қабатҳои конволютсионӣ дарки қабатҳои pooling, яъне ҷамъбасткунӣ, осон аст. Ҳадафашон хурд кардани тасвири вурудӣ мебошад, то сарбории ҳисоббарорӣ, истифодаи хотира ва шумораи параметрҳо кам шаванд ва хатари аз ҳад мутобиқшавӣ маҳдуд гардад.
Мисли конволютсия, ҳар нейрони pooling ба шумораи маҳдуди нейронҳои қабати пешина дар майдони қабули хурди росткунҷа пайваст аст. Андоза, қадам ва навъи пуркунӣ муайян карда мешаванд. Вале нейрони pooling вазн ё ғеҷиш надорад: танҳо вурудҳоро бо функсияе, монанди максимум ё миёна, ҷамъбаст мекунад. Расми 12.9 max pooling-ро нишон медиҳад, ки навъи маъмултарин аст. Дар ин мисол ядрои pooling-и 2 × 2, қадами 2 ва бе пуркунӣ истифода мешавад. Аз ҳар майдони қабул танҳо қимати калонтарин ба қабати баъдӣ мегузарад; дигарҳо партофта мешаванд. Масалан, дар майдони болоии чап қиматҳо 1, 5, 3 ва 2 ҳастанд ва танҳо 5 мегузарад. Бо қадами 2 баландӣ ва паҳнои баромад нисфи вуруд мешаванд; азбаски пуркунӣ нест, натиҷа ба поён гирд карда мешавад.
Расми 12.9. Қабати max pooling: ядрои 2 × 2, қадами 2, бе пуркунӣ.
Эзоҳ. Қабати pooling одатан ҳар канали вурудро мустақил коркард мекунад. Аз ин рӯ, умқи баромад, яъне шумораи каналҳо, бо умқи вуруд баробар мемонад.
Ғайр аз кам кардани ҳисобҳо, хотира ва параметрҳо, max pooling то андозае нисбат ба ҷойивазкуниҳои хурд тағйирнопазирӣ медиҳад (расми 12.10). Фарз мекунем, ки қимати пикселҳои равшан аз торикҳо камтар аст. Се тасвири A, B ва C аз max pooling-и дорои ядрои 2 × 2 ва қадами 2 мегузаранд. B ва C ҳамон A мебошанд, ки як ва ду пиксел ба рост кӯчонда шудаанд. Баромадҳои A ва B яксонанд: ин маънои тағйирнопазирӣ нисбат ба ҷойивазкунӣ аст. Баромади C як пиксел ба рост кӯчидааст, вале ҳанӯз 50% тағйирнопазирӣ ҳаст. Бо гузоштани max pooling баъди ҳар чанд қабати CNN метавон дар миқёси калонтар ҳам то андозае чунин хусусият гирифт. Max pooling каме тағйирнопазирӣ нисбат ба гардиш ва тағйири миқёс низ медиҳад. Ин метавонад дар вазифаҳое, монанди таснифот, муфид бошад, ки пешгӯӣ набояд аз ин ҷузъиёт вобаста бошад.
Расми 12.10. Тағйирнопазирӣ нисбат ба ҷойивазкуниҳои хурд.
Аммо max pooling камбудиҳо ҳам дорад. Он иттилооти зиёдро нест мекунад: ҳатто бо ядрои хурди 2 × 2 ва қадами 2 баромад дар ҳар самт ду баробар хурд мешавад, масоҳаташ чор баробар кам мегардад ва 75%-и қиматҳои вурудӣ гум мешаванд. Дар баъзе вазифаҳо тағйирнопазирӣ матлуб нест. Масалан, дар сегментатсияи маъноӣ, ки ҳар пикселро аз рӯйи объекти ба он тааллуқдошта тасниф мекунад, агар тасвири вурудӣ як пиксел ба рост кӯчад, баромад низ бояд як пиксел ба рост кӯчад. Дар ин ҳолат ҳадаф эквивариантӣ (equivariance) аст: тағйири хурди вуруд бояд тағйири мувофиқи хурди баромадро диҳад.
Татбиқи қабатҳои pooling бо PyTorch
Коди зерин nn.MaxPool2d-ро бо ядрои 2 × 2 месозад. Қадам пешфарз ба андозаи ядро баробар аст, пас дар ҳар ду самт 2 мебошад. Пуркунии пешфарз padding=0, яъне valid аст:
max_pool = nn.MaxPool2d(kernel_size=2)
Барои pooling-и миёна ба ҷойи nn.MaxPool2d аз nn.AvgPool2d истифода баред. Он айнан ҳамин тавр кор мекунад, вале ба ҷойи максимум миёнаро ҳисоб мекунад. Пештар pooling-и миёна маъмул буд; ҳоло бештар max pooling истифода мешавад, зеро одатан натиҷаи беҳтар медиҳад. Ин шояд ғайриинтизор намояд: миёнагирӣ одатан иттилооти камтарро гум мекунад. Вале max pooling танҳо қавитарин хусусиятҳоро нигоҳ дошта, хусусиятҳои бемаъниро дур мекунад ва ба қабатҳои баъдӣ сигнали тозатар медиҳад. Он ҳамчунин нисбат ба ҷойивазкунӣ тағйирнопазирии бештар ва андаке ҳисоббарории камтар дорад.
Pooling-и максимум ё миёнаро ба ҷойи андозаҳои фазоӣ дар самти умқ низ иҷро кардан мумкин аст, гарчанде ин камтар маъмул аст. Ин ба CNN имкон медиҳад, ки нисбат ба хусусиятҳои гуногун тағйирнопазириро омӯзад. Масалан, шабака метавонад чанд филтр омӯзад, ки ҳар кадом гардиши гуногуни ҳамон нақш, аз ҷумла рақамҳои дастнависро, ошкор кунад (расми 12.11). Max pooling дар самти умқ кафолат медиҳад, ки баромад новобаста аз гардиш яксон монад. Ба ҳамин тарз шабака метавонад нисбат ба ғафсӣ, равшанӣ, каҷӣ, ранг ва ғайра тағйирнопазир шавад.
Расми 12.11. Max pooling дар самти умқ метавонад ба CNN барои омӯхтани тағйирнопазирӣ — дар ин ҷо нисбат ба гардиш — кумак кунад.
PyTorch қабати тайёри чунин pooling надорад, вале метавон модули худро дар асоси F.max_pool1d() сохт:
import torch.nn.functional as F
class DepthPool(torch.nn.Module):
def __init__(self, kernel_size, stride=None, padding=0):
super().__init__()
self.kernel_size = kernel_size
self.stride = stride if stride is not None else kernel_size
self.padding = padding
def forward(self, inputs):
batch, channels, height, width = inputs.shape
Z = inputs.view(batch, channels, height * width) # якҷо кардани андозаҳои фазоӣ
Z = Z.permute(0, 2, 1) # иваз кардани ҷойи андозаҳои фазоӣ ва каналҳо
Z = F.max_pool1d(Z, kernel_size=self.kernel_size, stride=self.stride,
padding=self.padding) # ҳисоб кардани max pooling
Z = Z.permute(0, 2, 1) # барқарор кардани тартиби пешина
return Z.view(batch, -1, height, width) # ҷудо кардани андозаҳои фазоӣ
Фарз мекунем, баста ду тасвири 70 × 120 дорад, ки ҳар кадом 32 канал дорад: шакли вуруд [2, 32, 70, 120] мебошад. kernel_size=4, қадами пешфарзи ба ядро баробар ва padding=0 истифода мешавад:
forward()андозаҳои фазоиро якҷо карда, тензори[2, 32, 8400]мегирад, зеро 70 × 120 = 8400.- Ҷойи ду андозаи охирро иваз мекунад:
[2, 8400, 32]. max_pool1d()-ро дар андозаи охир, ки ҳамон 32 канали аслӣ аст, иҷро мекунад. Бо ядро ва қадами 4, бе пуркунӣ, андозаи охир чор баробар кам шуда, шакл[2, 8400, 8]мегардад.- Ҷойи ду андозаи охир боз иваз мешавад:
[2, 8, 8400]. - Дар охир андозаҳои фазоӣ ҷудо мешаванд ва шакли ниҳоӣ
[2, 8, 70, 120]мегардад.
Эзоҳи тарҷумон. Дар манбаъ шакли ниҳоӣ
[2, 8, 50, 100]омадааст, ки иштибоҳ аст: код ва вуруди ҳамин мисол[2, 8, 70, 120]медиҳанд (дар PyTorch санҷида шуд).
Навъи дигари дар меъмориҳои муосир маъмул pooling-и миёнаи саросарӣ (global average pooling) аст. Он миёнаи тамоми ҳар харитаи хусусиятҳоро ҳисоб мекунад ва барои ҳар харитаю ҳар намуна як адад мебарорад. Ин, албатта, иттилооти зиёдро нест мекунад, вале пеш аз қабати баромад муфид буда метавонад.
Барои сохтани он метавон nn.AvgPool2d-ро бо ядрои ҳамандозаи вуруд истифода бурд. Вале ин чандон қулай нест, чун андозаҳои вурудро пешакӣ донистан лозим меояд. Ҳалли осонтар nn.AdaptiveAvgPool2d аст: андозаҳои фазоии дилхоҳи баромадро медиҳед ва он андозаи ядрою қадами баробарро худ мутобиқ карда, агар лозим шавад, андаке пуркунӣ илова мекунад. Агар андозаи баромадро 1 гузорем, global average pooling мегирем:
global_avg_pool = nn.AdaptiveAvgPool2d(output_size=1)
output = global_avg_pool(cropped_images)
Ҳамин натиҷаро бо torch.mean() ҳам гирифтан мумкин аст:
output = cropped_images.mean(dim=(2, 3), keepdim=True)
Акнун ҳамаи ҷузъҳои асосии CNN-ро медонед. Биёед онҳоро якҷо кунем.
Меъмориҳои CNN
Меъмории маъмули CNN аз чанд қабати конволютсионӣ, ки одатан баъди ҳар кадом ReLU меояд, сипас pooling, боз чанд конволютсия бо ReLU ва боз pooling иборат аст. Ҳангоми гузаштан аз шабака тасвир хурдтар мешавад, вале одатан ба шарофати конволютсия умқаш, яъне шумораи харитаҳои хусусиятҳо, меафзояд (расми 12.12). Дар болои ин сохтор шабакаи одии пешрав бо чанд қабати пуррапайваст ва ReLU илова мешавад. Қабати охир пешгӯиро мебарорад, масалан softmax эҳтимолиятҳои тахминии синфҳоро медиҳад.
Расми 12.12. Меъмории маъмули CNN.
Маслиҳат. Одатан ба ҷойи як конволютсияи 5 × 5 истифодаи ду қабати пайдарпайи 3 × 3 беҳтар аст: параметрҳо ва ҳисобҳо камтар шуда, натиҷа одатан беҳтар мешавад. Истисно қабати якум аст, ки метавонад ядрои калон, масалан 5 × 5 ё 7 × 7, бо қадами 2 ё бештар дошта бошад. Ин андозаҳои фазоиро бе талафи зиёди иттилоот кам мекунад ва чун тасвири вурудӣ одатан танҳо се канал дорад, хароҷоташ зиёд нест.
Барои маҷмӯи Fashion MNIST-и боби 9 CNN-и одиро чунин татбиқ кардан мумкин аст:
from functools import partial
DefaultConv2d = partial(nn.Conv2d, kernel_size=3, padding="same")
model = nn.Sequential(
DefaultConv2d(in_channels=1, out_channels=64, kernel_size=7), nn.ReLU(),
nn.MaxPool2d(kernel_size=2),
DefaultConv2d(in_channels=64, out_channels=128), nn.ReLU(),
DefaultConv2d(in_channels=128, out_channels=128), nn.ReLU(),
nn.MaxPool2d(kernel_size=2),
DefaultConv2d(in_channels=128, out_channels=256), nn.ReLU(),
DefaultConv2d(in_channels=256, out_channels=256), nn.ReLU(),
nn.MaxPool2d(kernel_size=2),
nn.Flatten(),
nn.Linear(in_features=2304, out_features=128), nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(in_features=128, out_features=64), nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(in_features=64, out_features=10),
).to(device)
Кодро баррасӣ мекунем:
- Бо
functools.partial()-и боби 10DefaultConv2dмесозем. Он мислиnn.Conv2dаст, вале пешфарз ядрои хурди 3 ва пуркунииsameдорад. Бо ин далел аргументҳоро дар тамоми модел такрор намекунем. - Модели
nn.Sequential-ро месозем. Қабати аввалDefaultConv2dбо 64 филтри нисбатан калони 7 × 7 аст. Азбаски тасвирҳо калон нестанд, қадами пешфарзи 1 истифода мешавад.in_channels=1, чун Fashion MNIST тасвирҳои хокистарии якканала дорад. Баъди ҳар конволютсия ReLU меояд. - Max pooling бо ядрои 2 ҳар андозаи фазоиро ду баробар кам мекунад; агар лозим шавад, ба поён гирд мекунад.
- Сохтори «ду конволютсия ва баъд max pooling»-ро ду бор такрор мекунем. Барои тасвирҳои калонтар онро боз чанд бор такрор кардан мумкин аст. Шумораи такрорҳо гиперпараметри танзимшаванда аст.
- Дар самти баромад шумораи филтрҳо дучанд мешавад: аввал 64, баъд 128 ва 256. Ин мантиқӣ аст: хусусиятҳои сатҳи поён, монанди доираҳои хурд ё хатҳои уфуқӣ, одатан каманд, вале роҳҳои муттаҳид кардани онҳо ба хусусиятҳои баландсатҳ бисёранд. Одатан баъди ҳар pooling шумораи филтрҳоро дучанд мекунанд. Чун pooling ҳар андозаи фазоиро ду баробар кам мекунад, дар қабати баъдӣ харитаҳоро бе афзоиши таркандаи параметрҳо, хотира ё ҳисобҳо дучанд кардан мумкин аст.
- Баъд шабакаи пуррапайваст меояд: ду қабати пинҳонии
nn.Linearбо ReLU ва як қабати баромад. Барои 10 синф қабати баромад 10 воҳид дорад. Мисли боби 10 softmax-ро намегузорем, пас модел логит мебарорад ва барои омӯзишnn.CrossEntropyLossлозим мешавад. Пеш аз қабати якуми зич вурудро ҳамвор мекунем, зеро барои ҳар намуна массиви якченакаи хусусиятҳоро интизор аст. Барои кам кардани аз ҳад мутобиқшавӣ ду dropout бо сатҳи 50% илова мекунем.
Маслиҳат. Қабати якуми
nn.Linear2304 хусусияти вурудӣ дорад. Ин рақам аз куҷост? Тасвирҳои Fashion MNIST 28 × 28 мебошанд. Pooling онҳоро пайдарпай ба 14 × 14, 7 × 7 ва 3 × 3 кам мекунад. Пеш азnn.Linear256 харита дорем: 256 × 3 × 3 = 2304. Баъзан ҳисоб кардани ин шумора душвор аст. Як ҳила ин аст, киin_features-ро муваққатан ба қимати дилхоҳ, масалан 999, гузошта, бигузоред омӯзиш бо хато қатъ шавад. Дар паёми хато шумораи дуруст намоён мегардад:RuntimeError: mat1 and mat2 shapes cannot be multiplied (32x2304 and 999x128). Роҳи дигарnn.LazyLinearаст: он матритсаи вазнҳоро танҳо дар даъвати аввал месозад ва шумораи вурудҳоро худ муайян мекунад. Конволютсия ва нормализатсияи баста низ вариантҳои lazy доранд.
Агар ин моделро дар қисми омӯзишии Fashion MNIST омӯзонед, дурустии он дар қисми санҷишӣ бояд ба 92% наздик шавад. Аз функсияҳои train() ва evaluate_tm()-и боби 10 истифода бурда метавонед. Ин натиҷаи пешқадамтарин нест, вале хуб аст ва аз шабакаҳои зичи боби 9 беҳтар мебошад.
Дар тӯли солҳо вариантҳои ин меъмории асосӣ пайдо шуда, ба пешрафти бузург оварданд. Як ченаки хуб сатҳи хато дар мусобиқаҳое чун ILSVRC ImageNet аст. Дар он хатои таснифи тасвир ҳамагӣ дар 6 сол аз зиёда аз 26% ба камтар аз 2,3% поён рафт. Дақиқтар, ин хатои панҷ пешгӯии беҳтарин буд: ҳиссаи тасвирҳои санҷишие, ки ҷавоби дуруст дар панҷ пешгӯии боэътимодтарини система набуд. Тасвирҳо калонанд, масалан 256 пиксел баландӣ доранд; 1000 синф ҳаст ва фарқи баъзеашон хеле нозук аст — худатон 120 зоти сагро фарқ карда бинед! Баррасии таҳаввули ғолибон роҳи хуби фаҳмидани CNN ва пешрафти таҳқиқоти омӯзиши амиқ аст.
Аввал LeNet-5-и классикии соли 1998, сипас ғолибони ILSVRC — AlexNet (2012), GoogLeNet (2014), ResNet (2015) ва SENet (2017)-ро мебинем. VGGNet, Xception, ResNeXt, DenseNet, MobileNet, CSPNet, EfficientNet ва ConvNeXt-ро низ муҳокима мекунем. Трансформерҳои биноиро дар боби 16 баррасӣ хоҳем кард.
LeNet-5
LeNet-5 шояд машҳуртарин меъмории CNN бошад. Тавре гуфта шуд, Янн Лекун онро соли 1998 сохт ва он барои шинохти рақамҳои дастнавис — MNIST — васеъ истифода шуд. Қабатҳои он дар ҷадвали 12.1 оварда шудаанд.
Ҷадвали 12.1. Меъмории LeNet-5
| Қабат | Навъ | Харитаҳо | Андоза | Андозаи ядро | Қадам | Фаъолсозӣ |
|---|---|---|---|---|---|---|
| Out | Пуррапайваст | – | 10 | – | – | RBF |
| F6 | Пуррапайваст | – | 84 | – | – | tanh |
| C5 | Конволютсия | 120 | 1 × 1 | 5 × 5 | 1 | tanh |
| S4 | Pooling-и миёна | 16 | 5 × 5 | 2 × 2 | 2 | tanh |
| C3 | Конволютсия | 16 | 10 × 10 | 5 × 5 | 1 | tanh |
| S2 | Pooling-и миёна | 6 | 14 × 14 | 2 × 2 | 2 | tanh |
| C1 | Конволютсия | 6 | 28 × 28 | 5 × 5 | 1 | tanh |
| In | Вуруд | 1 | 32 × 32 | – | – | – |
Ин ба модели Fashion MNIST-и мо хеле монанд аст: қабатҳои конволютсионӣ ва pooling, баъд шабакаи зич. Шояд фарқи асосӣ аз CNN-ҳои муосири таснифот фаъолсозӣ бошад: имрӯз ба ҷойи tanh аз ReLU ва ба ҷойи RBF-и боби 2 аз softmax истифода мебурдем. Чанд фарқи хурди дигари на он қадар муҳим низ ҳаст; агар шавқ дошта бошед, онҳо дар дафтари ин боб дар https://homl.info/colab-p оварда шудаанд. Сомонаи Янн Лекун низ намоишҳои хуби таснифи рақамҳо бо LeNet-5 дорад.
AlexNet
Меъмории CNN-и AlexNet дар ILSVRC 2012 бо фосилаи калон ғолиб шуд: хатои панҷ пешгӯии беҳтаринаш 17% буд, дар ҳоле ки рақиби дуюм 26% дошт! Онро Алекс Крижевский — номаш ҳам аз ҳамин ҷост — Иля Сутскевер ва Ҷеффри Ҳинтон сохтанд. AlexNet ба LeNet-5 монанд, вале хеле калонтару амиқтар аст. Он аввалин шуда қабатҳои конволютсиониро мустақиман болои ҳам гузошт, ба ҷойи он ки баъди ҳар конволютсия pooling гузорад. Ҷадвали 12.2 меъмориро нишон медиҳад.
Ҷадвали 12.2. Меъмории AlexNet
| Қабат | Навъ | Харитаҳо | Андоза | Андозаи ядро | Қадам | Пуркунӣ | Фаъолсозӣ |
|---|---|---|---|---|---|---|---|
| Out | Пуррапайваст | – | 1000 | – | – | – | Softmax |
| F10 | Пуррапайваст | – | 4096 | – | – | – | ReLU |
| F9 | Пуррапайваст | – | 4096 | – | – | – | ReLU |
| S8 | Max pooling | 256 | 6 × 6 | 3 × 3 | 2 | valid | – |
| C7 | Конволютсия | 256 | 13 × 13 | 3 × 3 | 1 | same | ReLU |
| C6 | Конволютсия | 384 | 13 × 13 | 3 × 3 | 1 | same | ReLU |
| C5 | Конволютсия | 384 | 13 × 13 | 3 × 3 | 1 | same | ReLU |
| S4 | Max pooling | 256 | 13 × 13 | 3 × 3 | 2 | valid | – |
| C3 | Конволютсия | 256 | 27 × 27 | 5 × 5 | 1 | same | ReLU |
| S2 | Max pooling | 96 | 27 × 27 | 3 × 3 | 2 | valid | – |
| C1 | Конволютсия | 96 | 55 × 55 | 11 × 11 | 4 | valid | ReLU |
| In | Вуруд | 3 (RGB) | 227 × 227 | – | – | – | – |
Барои кам кардани аз ҳад мутобиқшавӣ муаллифон ду усули мунтазамсозӣ истифода карданд. Аввал, ҳангоми омӯзиш ба баромадҳои F9 ва F10 dropout-и боби 11-ро бо сатҳи 50% татбиқ карданд. Дуюм, бо ҷойивазкунии тасодуфии тасвирҳои омӯзишӣ, чаппакунии уфуқӣ ва тағйири равшанӣ додаҳоро афзоиш доданд.
Афзоишдиҳии додаҳо
Афзоишдиҳии додаҳо (data augmentation) бо сохтани вариантҳои зиёди воқеиятмонанди ҳар намуна андозаи маҷмӯи омӯзиширо сунъӣ зиёд мекунад. Ин аз ҳад мутобиқшавиро кам мекунад, бинобар ин усули мунтазамсозӣ аст. Намунаҳои сохташуда бояд ҳарчи воқеӣ бошанд: дар ҳолати беҳтарин инсон набояд фарқ кунад, ки тасвир тағйир дода шудааст ё не. Танҳо илова кардани ғавғои сафед фоида надорад: тағйирот бояд омӯхташаванда бошанд, дар ҳоле ки ғавғои сафед чунин нест.
Масалан, ҳар акси омӯзиширо андаке ҷойиваз, даврзанӣ ё тағйири андоза дода, натиҷаҳоро ба маҷмӯа илова кардан мумкин аст (расми 12.13). Барои ин воситаҳои torchvision.transforms.v2, монанди RandomCrop ва RandomRotation, мувофиқанд. Ин моделро водор мекунад, ки ба тағйири ҷой, самт ва андозаи объектҳо таҳаммулпазиртар шавад. Бо тағйири ранг ва контраст метавон шароити гуногуни рӯшноиро тақлид кард. Одатан чаппакунии уфуқӣ ҳам мумкин аст, ба истиснои матн ва дигар объектҳои ғайрисимметрӣ. Якҷо кардани табдилҳо бо Compose андозаи маҷмӯи омӯзиширо хеле зиёд мекунад.
Расми 12.13. Сохтани намунаҳои нави омӯзишӣ аз намунаҳои мавҷуда.
Афзоишдиҳӣ барои маҷмӯи номутавозин низ муфид аст: метавонед барои синфҳои камшумор намунаҳои бештар созед. Ин ба ғояи усули зиёднамунасозии синтетикии ақаллият (synthetic minority oversampling technique, SMOTE) наздик аст.
Эзоҳи тарҷумон. Дар манбаъ ин кор худ SMOTE номида шудааст. Вале SMOTE усули мушаххаси сохтани намунаҳо тавассути интерполятсия дар фазои хусусиятҳост; ҳар гуна афзоишдиҳии тасвирҳои синфи камшумор худ аз худ SMOTE нест.
Гарчанде афзоишдиҳӣ одатан танҳо дар омӯзиш истифода мешавад, истисное ҳаст: афзоишдиҳӣ ҳангоми санҷиш (test-time augmentation, TTA). Дар он додаҳои санҷишӣ тағйир дода шуда, пешгӯиҳо барои беҳтар кардани дурустӣ якҷо мешаванд. Масалан, агар се варианти тасвир автобус ва ҳафт вариант мошини боркаш тасниф шаванд, эҳтимол объект мошини боркаш аст.
AlexNet инчунин нормализатсияи вокуниши маҳаллӣ (local response normalization, LRN)-ро истифода мебурд. Нейронҳои аз ҳама фаъол нейронҳои ҳамҷойи харитаҳои ҳамсояро бозмедоранд. Чунин фаъолсозии рақобатӣ дар нейронҳои биологӣ низ мушоҳида шудааст. Он харитаҳоро ба ихтисосёбӣ ташвиқ карда, аз ҳам фарқ мекунонад ва маҷбур месозад доираи васеътари хусусиятҳоро омӯзанд; дар натиҷа умумисозӣ беҳтар мешавад. Аммо баъдтар ин усул асосан бо мунтазамсозии содатару самараноктар, махсусан нормализатсияи баста, иваз шуд.
Варианти AlexNet бо номи ZFNet, ки Мэттю Зайлер ва Роб Фергус сохтанд, ғолиби ILSVRC 2013 гардид. Он аслан AlexNet бо чанд гиперпараметри тағйирёфта — шумораи харитаҳо, андозаи ядро, қадам ва ғайра — аст.
GoogLeNet
GoogLeNet-ро Кристиан Сегеди ва ҳамкоронаш аз Google Research сохтанд. Он дар ILSVRC 2014 ғолиб шуда, хатои панҷ пешгӯии беҳтаринро аз 7% поён бурд. Қисми зиёди ин натиҷа аз амиқтар будани шабака нисбат ба CNN-ҳои пешина меомад (расми 12.15). Ин ба шарофати зершабакаҳои модулҳои inception имконпазир шуд, ки параметрҳоро хеле самаранок истифода мебаранд: GoogLeNet аз AlexNet тақрибан 10 маротиба камтар параметр дорад — тақрибан 6 миллион ба ҷойи 60 миллион.
Расми 12.14 сохтори модули inception-ро нишон медиҳад. Навиштаи 3 × 3 + 1(S) маънои ядрои 3 × 3, қадами 1 ва пуркунии same-ро дорад. Сигнали вурудӣ аввал ба чор қабати параллелӣ дода мешавад. Ҳамаи конволютсияҳо ReLU доранд. Қабатҳои боло ядроҳои гуногуни 1 × 1, 3 × 3 ва 5 × 5 истифода мебаранд, то нақшҳоро дар миқёсҳои гуногун пайдо кунанд. Ҳар қабат, ҳатто max pooling, қадами 1 ва пуркунии same дорад, бинобар ин баландӣ ва паҳнои баромадҳо бо вуруд баробар аст. Ин имкон медиҳад, ки дар охир ҳамаи харитаҳои баромади чор конволютсияи болоӣ дар самти умқ ба ҳам часпонда шаванд. Онро бо torch.cat() ва dim=1 татбиқ кардан мумкин аст.
Расми 12.14. Модули inception.
Шояд пурсед, ки конволютсияҳои 1 × 1 барои чӣ лозиманд: онҳо дар як вақт танҳо як пиксел мебинанд, пас магар хусусият гирифта метавонанд? Онҳо се вазифа доранд:
- Нақшҳои фазоиро намегиранд, вале нақшҳоро дар самти умқ, яъне байни каналҳо, меёбанд.
- Харитаҳои камтар аз вуруд мебароранд, пас ҳамчун қабати тангкунанда (bottleneck) андозанокиро кам мекунанд. Ин хароҷоти ҳисоб ва параметрҳоро коҳиш дода, омӯзишро тезтар ва умумисозиро беҳтар мекунад.
- Ҳар ҷуфти [1 × 1, 3 × 3] ва [1 × 1, 5 × 5] ҳамчун як конволютсияи тавонои қобили гирифтани нақшҳои мураккабтар кор мекунад. Конволютсия ба ҳаракат додани қабати зич дар рӯйи тасвир баробар аст: дар ҳар нуқта танҳо майдони хурдро мебинад. Ин ҷуфтҳо бошанд, ба ҳаракат додани шабакаи дуқабата дар рӯйи тасвир баробаранд.
Ҳамин тавр, тамоми модули inception-ро метавон конволютсияи пурқуввате донист, ки нақшҳои мураккаби миқёсҳои гуногунро ба харитаҳои хусусиятҳо табдил медиҳад.
Акнун сохтори GoogLeNet-ро мебинем (расми 12.15). Пеш аз андозаи ядро шумораи харитаҳои баромади ҳар конволютсия ва pooling навишта шудааст. Меъморӣ чунон амиқ аст, ки дар се сутун тасвир шудааст, вале дар асл як силсилаи баланд бо нуҳ модули inception мебошад — қуттиҳои норинҷӣ. Шаш рақами ҳар модул шумораи харитаҳои баромади конволютсияҳои онро бо ин тартиб нишон медиҳанд: 1×1, 1×1→3×3, 1×1→5×5 ва pool→1×1 (барои ду ҷуфти миёна ду рақам). Ҳамаи конволютсияҳо ReLU доранд.
Расми 12.15. Меъмории GoogLeNet.
Шабакаро пайдарпай мебинем:
- Ду қабати аввал баландӣ ва паҳноро 4 баробар, масоҳатро 16 баробар кам мекунанд, то ҳисоб кам шавад. Қабати якум ядрои калони 7 × 7 дорад, то иттилооти бештар ҳифз гардад.
- LRN ёрӣ медиҳад, ки қабатҳои пешина доираи васеи хусусиятҳоро омӯзанд.
- Баъд ду конволютсия меоянд; якум тангкунанда аст. Ин ҷуфтро метавон як конволютсияи «ҳушмандтар» донист.
- LRN-и дигар боз гуногунии нақшҳои омӯхташавандаро таъмин мекунад.
- Max pooling баландӣ ва паҳноро ду баробар кам карда, ҳисобҳоро тез мекунад.
- Қисми асосии CNN силсилаи нуҳ модули inception аст; байни онҳо чанд max pooling барои кам кардани андозанокӣ ва суръатбахшӣ ҷой дорад.
- Global average pooling миёнаи ҳар харитаро мебарорад ва иттилооти боқимондаи фазоиро дур мекунад. Дар ин марҳила он зиёд ҳам нест: вурудҳои маъмулии GoogLeNet 224 × 224 мебошанд ва баъди 5 max pooling, ки ҳар яке баландию паҳноро нисф мекунад, харитаҳо 7 × 7 мешаванд. Вазифа таснифот аст, на муайян кардани ҷой, пас ҷойи объект муҳим нест. Ба шарофати камшавии андозанокӣ дигар чанд қабати пуррапайвасти AlexNet лозим намешавад; параметрҳо ва хатари аз ҳад мутобиқшавӣ хеле кам мешаванд.
- Дар охир dropout барои мунтазамсозӣ, сипас қабати пуррапайвасти 1000-воҳидӣ барои 1000 синф ва softmax барои эҳтимолиятҳои тахминӣ меоянд.
GoogLeNet-и аслӣ ду таснифгари ёрирасон дошт, ки ба болои модулҳои сеюм ва шашум пайваст буданд. Ҳар кадом як average pooling, як конволютсия, ду қабати пуррапайваст ва softmax дошт. Ҳангоми омӯзиш талафоти онҳо, баъди 70% кам кардан, ба талафоти умумӣ илова мешуд. Ҳадаф мубориза бо нопадидшавии градиентҳо ва мунтазамсозӣ буд, аммо баъд маълум шуд, ки таъсири онҳо нисбатан кам аст.
Баъдтар муҳаққиқони Google вариантҳои дигар, аз ҷумла Inception-v3 ва Inception-v4-ро бо модулҳои каме дигар пешниҳод карданд ва натиҷаро беҳтар намуданд.
ResNet
Каймин Ҳэ ва ҳамкоронаш бо шабакаи боқимондагӣ — Residual Network (ResNet) — ғолиби ILSVRC 2015 шуданд. Хатои панҷ пешгӯии беҳтарин аз 3,6% кам буд. Варианти ғолиб CNN-и хеле амиқи 152-қабата буд; вариантҳои дигар 34, 50 ва 101 қабат доштанд. Ин тамоюли умумиро тасдиқ кард: моделҳои биноӣ амиқтар ва шумораи параметрҳо камтар мешуданд. Калиди омӯзиши чунин шабака пайвастҳои ҷаҳишӣ (skip connections ё shortcut connections) аст: сигнали вуруди як қабат ба баромади қабати болотар ҳам илова мешавад. Бубинем, чаро ин фоида дорад.
Ҳадафи омӯзиш моделсозии функсияи мақсадноки h(x) аст. Агар x-ро ба баромади шабака илова кунем, шабака ба ҷойи h(x) бояд f(x) = h(x) − x-ро омӯзад. Инро омӯзиши боқимондагӣ меноманд (расми 12.16).
Расми 12.16. Омӯзиши боқимондагӣ.
Вазнҳои шабака ҳангоми ибтидосозӣ ба сифр наздиканд, пас шабакаи одӣ дар оғози омӯзиш қиматҳои ба сифр наздик мебарорад. Бо пайвасти ҷаҳишӣ бошад, баромад нусхаи вуруд мешавад: шабака дар оғоз ҳамчун функсияи айният амал мекунад. Агар функсияи мақсаднок ба айният наздик бошад, ки аксар вақт ҳамин тавр аст, омӯзиш хеле тез мешавад.
Бо пайвастҳои ҷаҳишии зиёд шабака метавонад пеш равад, ҳатто агар чанд қабат ҳанӯз омӯзишро оғоз накарда бошанд (расми 12.17). Сигнал ба шарофати ин пайвастҳо аз тамоми шабака осон мегузарад. Шабакаи амиқи боқимондагиро метавон силсилаи воҳидҳои боқимондагӣ (residual units, RU) донист; ҳар RU шабакаи хурд бо пайвасти ҷаҳишӣ аст.
Меъмории ResNet тааҷҷубовар сода аст (расми 12.18). Оғозу анҷомаш мисли GoogLeNet, вале бе dropout аст; миёнааш танҳо силсилаи хеле амиқи RU мебошад. Ҳар RU ду конволютсия, бе pooling, бо нормализатсияи баста — BN — ва ReLU дорад. Ядроҳо 3 × 3, қадам 1 ва пуркунӣ same аст, пас андозаҳои фазоӣ нигоҳ дошта мешаванд.
Расми 12.17. Шабакаи амиқи одӣ (чап) ва шабакаи амиқи боқимондагӣ (рост).
Расми 12.18. Меъмории ResNet.
Баъди ҳар чанд RU шумораи харитаҳо дучанд ва баландию паҳно нисф мешаванд; барои ин конволютсияи қадамаш 2 истифода мешавад. Он гоҳ вурудро ба баромади RU мустақим илова кардан намешавад, зеро шаклашон яксон нест. Масалан, ин ба пайвасти тирчаи хаткандаи расми 12.18 дахл дорад. Барои ҳал кардан вуруд аз конволютсияи 1 × 1 бо қадами 2 ва шумораи дурусти харитаҳои баромад мегузарад (расми 12.19).
Расми 12.19. Пайвасти ҷаҳишӣ ҳангоми тағйири андоза ва умқи харитаҳо.
Маслиҳат. Ҳангоми омӯзиш барои ҳар minibatch метавонед гурӯҳи тасодуфии RU-ҳоро гузаред. Усули умқи тасодуфӣ (stochastic depth) омӯзишро бе паст кардани дурустӣ хеле тез мекунад. Онро бо
torchvision.ops.stochastic_depth()татбиқ кардан мумкин аст.
Вариантҳо шумораи қабатҳои гуногун доранд. ResNet-34 дорои 34 қабат аст — танҳо конволютсияҳо ва қабати пуррапайваст ҳисоб мешаванд — ва 3 RU-и 64-харитагӣ, 4 RU-и 128-харитагӣ, 6 RU-и 256-харитагӣ ва 3 RU-и 512-харитагӣ дорад. Баъдтар онро татбиқ мекунем.
ResNet-ҳои амиқтар, монанди ResNet-152, RU-и каме дигар доранд. Ба ҷойи ду конволютсияи 3 × 3 бо, масалан, 256 харита, се конволютсия истифода мешавад: аввал 1 × 1 бо танҳо 64 харита, яъне 4 баробар камтар, ҳамчун тангкунанда; баъд 3 × 3 бо 64 харита; дар охир 1 × 1 бо 256 харита, ки умқи аслиро барқарор мекунад. ResNet-152 аз 3 чунин RU-и 256-харитагӣ, баъд 8 RU-и 512-харитагӣ, 36 RU-и 1024-харитагӣ ва 3 RU-и 2048-харитагӣ иборат аст.
Эзоҳ. Inception-v4-и Google андешаҳои GoogLeNet ва ResNet-ро якҷо карда, дар таснифи ImageNet хатои панҷ пешгӯии беҳтаринро ба тақрибан 3% расонд.
Xception
Варианти дигари GoogLeNet, Xception, аз Extreme Inception гирифта шудааст. Онро соли 2016 Франсуа Шолле, муаллифи Keras, пешниҳод кард. Дар вазифаи бузурги биноии дорои 350 миллион тасвир ва 17 000 синф он аз Inception-v3 хеле пеш гузашт. Мисли Inception-v4 андешаҳои GoogLeNet ва ResNet-ро якҷо мекунад, вале модулҳои inception-ро бо конволютсияи ҷудошаванда аз рӯйи умқ (depthwise separable convolution), ё кӯтоҳ конволютсияи ҷудошаванда, иваз мекунад. Ин қабатҳо пештар ҳам дар баъзе CNN-ҳо буданд, вале мисли Xception нақши асосӣ надоштанд. Конволютсияи одӣ филтрҳоеро истифода мебарад, ки ҳам нақшҳои фазоӣ, масалан байзашакл, ва ҳам нақшҳои байни каналҳо, масалан «даҳон + бинӣ + чашмҳо = рӯй», мегиранд. Конволютсияи ҷудошаванда фарз мекунад, ки ин ду навъи нақшро алоҳида модел кардан мумкин аст (расми 12.20). Он ду қисм дорад: якум ба ҳар харитаи вуруд як филтри фазоӣ татбиқ мекунад; дуюм танҳо нақшҳои байни каналҳоро меҷӯяд ва конволютсияи одии 1 × 1 мебошад.
Расми 12.20. Қабати конволютсионии ҷудошаванда аз рӯйи умқ.
Азбаски ба ҳар канали вуруд танҳо як филтри фазоӣ рост меояд, ин қабатҳоро баъди қабатҳои камканал, монанди вуруд, истифода набаред. Расми 12.20 ҳамин ҳолатро танҳо барои намоиш нишон медиҳад. Аз ин рӯ, Xception аз ду конволютсияи одӣ оғоз мешавад; қисми боқимонда 34 конволютсияи ҷудошаванда, чанд max pooling ва қабатҳои маъмули ниҳоӣ — global average pooling ва баромади зич — дорад.
Шояд пурсед, чаро Xception варианти GoogLeNet аст, ҳол он ки ягон inception надорад? Модули inception конволютсияҳои 1 × 1 дорад, ки танҳо нақшҳои байни каналҳоро меҷӯянд. Аммо конволютсияҳои болояшон одӣ буда, ҳам фазо ва ҳам каналҳоро коркард мекунанд. Пас inception миёнаравест байни конволютсияи одӣ, ки инҳоро якҷо мебинад, ва ҷудошаванда, ки алоҳида мебинад. Дар амал ҷудошавандаҳо аксар вақт беҳтар кор мекунанд.
PyTorch модули SeparableConv2d надорад, вале сохтани он осон аст:
class SeparableConv2d(nn.Module):
def __init__(self, in_channels, out_channels, kernel_size, stride=1,
padding=0):
super().__init__()
self.depthwise_conv = nn.Conv2d(
in_channels, in_channels, kernel_size, stride=stride,
padding=padding, groups=in_channels)
self.pointwise_conv = nn.Conv2d(
in_channels, out_channels, kernel_size=1, stride=1, padding=0)
def forward(self, inputs):
return self.pointwise_conv(self.depthwise_conv(inputs))
Ба groups диққат диҳед: он каналҳои вурудро ба шумораи додашудаи гурӯҳҳои мустақил ҷудо мекунад ва ҳар гурӯҳ филтрҳои худро дорад. in_channels ва out_channels бояд ба groups тақсимшаванда бошанд. Пешфарз groups=1, яъне конволютсияи одӣ аст. Бо groups=in_channels ва out_channels=in_channels конволютсияи умқӣ мегирем: ба ҳар канали вуруд як филтр. Ин қисми якуми конволютсияи ҷудошаванда аст. Қисми дуюм конволютсияи одӣ бо ядро ва қадами 1 мебошад. Ҳамин!
Маслиҳат. Конволютсияҳои ҷудошаванда параметр, хотира ва ҳисобҳои камтар доранд ва аксар вақт беҳтар кор мекунанд. Онҳоро ҳамчун интихоби пешфарз баррасӣ кунед, ғайр аз баъди қабатҳои камканал, монанди вуруд.
SENet
Ғолиби ILSVRC 2017 шабакаи фишурдан ва барангезиш — Squeeze-and-Excitation Network (SENet) — буд. Он меъмориҳои мавҷуда, монанди inception ва ResNet-ро густариш дода, натиҷаашонро беҳтар мекунад. SENet бо хатои ҳайратовари 2,25% дар панҷ пешгӯии беҳтарин ғолиб шуд. Вариантҳои густаришёфта мутаносибан SE-Inception ва SE-ResNet ном доранд. Беҳбудӣ аз илова кардани шабакаи хурди блоки SE ба ҳар inception ё RU-и меъмории аслӣ меояд (расми 12.21).
Расми 12.21. Модули SE-Inception (чап) ва воҳиди SE-ResNet (рост).
Блоки SE баромади воҳиди пайвастшударо танҳо дар самти умқ таҳлил мекунад; нақши фазоӣ намеҷӯяд. Он меомӯзад, ки кадом хусусиятҳо одатан якҷо фаъол мешаванд ва инро барои бозтанзими харитаҳо истифода мебарад (расми 12.22). Масалан, блок метавонад омӯзад, ки даҳон, бинӣ ва чашмҳо одатан якҷо ҳастанд: агар даҳону бинӣ дидед, чашмро низ интизор шавед. Агар фаъолшавии харитаҳои даҳону бинӣ қавӣ ва чашм суст бошад, блок харитаи чашмро нисбатан тақвият медиҳад — дақиқтар, харитаҳои номуҳимро суст мекунад. Агар чашм бо чизи дигар омехта шуда бошад, бозтанзим барои рафъи номуайянӣ кумак мекунад.
Расми 12.22. Блоки SE харитаҳои хусусиятҳоро бозтанзим мекунад.
Блоки SE ҳамагӣ се қабат дорад: global average pooling, қабати зичи пинҳонӣ бо ReLU ва қабати зичи баромад бо sigmoid (расми 12.23).
Расми 12.23. Меъмории блоки SE.
Global average pooling миёнаи фаъолшавии ҳар харитаро ҳисоб мекунад. Агар вуруд 256 харита дошта бошад, 256 адад мебарорад, ки сатҳи умумии вокуниши ҳар филтрро нишон медиҳанд. «Фишурдан» дар қабати баъдӣ сурат мегирад: он аз 256 хеле кам нейрон дорад, одатан 16 баробар камтар, масалан 16 нейрон. Пас 256 адад ба вектори хурди, масалан, 16-ченака фишурда мешавад. Ин намояндагии вектории камченака — embedding — и тақсимоти вокунишҳои хусусиятҳост. Ин тангкунанда блоки SE-ро водор мекунад, ки намояндагии умумии таркибҳои хусусиятҳоро омӯзад. Ҳангоми омӯзиши автоэнкодерҳо дар боби 18 боз ин принсипро мебинем. Қабати баромад embedding-ро гирифта, вектори бозтанзим мебарорад: барои ҳар харита як адад, масалан 256 адад, ҳар кадом аз 0 то 1. Харитаҳо ба ин вектор зарб мешаванд. Хусусиятҳои номуҳими холашон паст суст ва хусусиятҳои муҳими холашон ба 1 наздик бетағйир мемонанд.
Меъмориҳои дигари қобили таваҷҷуҳ
Бисёр меъмориҳои дигари CNN низ ҳастанд. Баъзе муҳимтаринашонро кӯтоҳ мебинем.
VGGNet. Дар ILSVRC 2014 ҷойи дуюм гирифт. Карен Симонян ва Эндрю Зиссерман аз озмоишгоҳи Visual Geometry Group (VGG)-и Донишгоҳи Оксфорд меъмории содаи классикӣ сохтанд: 2 ё 3 конволютсия ва pooling, боз 2 ё 3 конволютсия ва pooling ва ҳамин тавр идома. Вобаста ба вариант, дар маҷмӯъ 16 ё 19 қабати конволютсионӣ, инчунин шабакаи ниҳоии зич бо ду қабати пинҳонӣ ва баромад дошт. Филтрҳо хурди 3 × 3, вале сершумор буданд.
ResNeXt. RU-ҳои ResNet-ро беҳтар мекунад. Дар беҳтарин ResNet-ҳо ҳар RU се конволютсия дорад; дар ResNeXt он аз силсилаҳои зиёди параллелӣ, масалан 32 силсила, бо се конволютсия дар ҳар кадом иборат аст. Ду қабати аввали ҳар силсила филтрҳои кам, масалан танҳо чорто, доранд, пас шумораи умумии параметрҳо мисли ResNet мемонад. Баромадҳои ҳамаи силсилаҳо ҷамъ шуда, бо пайвасти ҷаҳишӣ ба RU-и баъдӣ дода мешаванд.
DenseNet. Аз чанд блоки зич иборат аст, ки ҳар кадом чанд конволютсияи зичпайваст дорад. Он бо параметрҳои нисбатан кам дурустии аъло гирифт. «Зичпайваст» маънои онро дорад, ки баромади ҳар қабат ба ҳамаи қабатҳои баъдии ҳамон блок дода мешавад. Масалан, қабати чорум пайвасткунии умқии баромадҳои қабатҳои якум, дуюм ва сеюмро мегирад. Байни блокҳои зич чанд қабати гузариш ҳаст.
MobileNet. Моделҳои сода, сабук ва тезанд, ки дар барномаҳои мобилӣ ва веб маъмул шудаанд. Мисли Xception ба конволютсияҳои ҷудошавандаи умқӣ такя мекунанд. Муаллифон вариантҳоеро пешниҳод карданд, ки андаке дурустиро ба андоза ва суръати беҳтар иваз мекунанд. Барои дастгоҳҳои мобилӣ SqueezeNet, ShuffleNet ва MNasNet низ ҳастанд.
CSPNet. Cross Stage Partial Network ба DenseNet монанд аст, вале қисми вуруди ҳар блоки зич бе гузаштан аз блок мустақиман ба баромади он часпонда мешавад.
EfficientNet. Эҳтимол муҳимтарин модели ин рӯйхат бошад. Муаллифон усули самараноки васеъ кардани ҳар CNN-ро пешниҳод карданд: ҳамзамон бо тартиби асоснок умқ — шумораи қабатҳо, паҳно — шумораи филтрҳои ҳар қабат, ва тафсилнокӣ — андозаи тасвири вуруд — зиёд карда мешаванд. Ин миқёсдиҳии таркибӣ (compound scaling) ном дорад. Онҳо бо ҷустуҷӯи меъмории нейронӣ барои варианти хурдшудаи ImageNet, ки тасвирҳои хурдтару камтар дошт, меъмории хуб ёфтанд ва баъд бо миқёсдиҳии таркибӣ вариантҳои калонтар сохтанд. Ҳангоми пайдоиш моделҳои EfficientNet дар ҳамаи сатҳҳои захираи ҳисоббарорӣ аз моделҳои мавҷуда хеле пеш гузаштанд ва то ҳол дар қатори беҳтаринҳо мемонанд. Соли 2021 мақолаи навбатӣ EfficientNetV2-ро муаррифӣ кард, ки вақти омӯзиш ва самаранокии параметрҳоро боз беҳтар намуд.
ConvNeXt. Ба ResNet хеле монанд аст, вале чанд тағйири аз трансформерҳои муваффақи биноӣ илҳомгирифта дорад (боби 16): ядроҳои калон, масалан 7 × 7 ба ҷойи 3 × 3, функсияҳои фаъолсозӣ ва нормализатсияи камтар дар ҳар RU ва ғайра.
Фаҳмидани миқёсдиҳии таркибии EfficientNet барои дарки амиқтари CNN, хусусан агар онро васеъ кардан лозим шавад, фоида дорад. Он ба ченаки логарифмии захираи ҳисоббарорӣ, ϕ, асос меёбад: бо дучанд шудани захира ϕ як воҳид зиёд мешавад. Яъне шумораи амалиёти дастрас бо ададҳои нуқтаи шинокунанда ба 2ᵠ мутаносиб аст. Умқ, паҳно ва тафсилнокӣ бояд мутаносибан чун αᵠ, βᵠ ва γᵠ афзоиш ёбанд. α, β ва γ аз 1 калон ва αβ²γ² ба 2 наздик бошанд. Қиматҳои беҳтарин аз меъмории CNN вобастаанд. Барои EfficientNet муаллифон аз модели хурди асосии EfficientNetB0 оғоз карданд, ϕ = 1 гузоштанд ва ҷустуҷӯи шабакавӣ анҷом доданд. Натиҷа α = 1,2, β = 1,1 ва γ = 1,1 буд. Бо ин омилҳо ва қиматҳои афзояндаи ϕ меъмориҳои EfficientNetB1 то EfficientNetB7-ро сохтанд.
Умедворам, ин омӯзиши муфассали меъмориҳои асосии CNN писанд омад! Аммо меъмории мувофиқро чӣ гуна интихоб мекунем?
Интихоби меъмории мувофиқи CNN
Меъмории беҳтарин аз афзалияти лоиҳа вобаста аст: дурустӣ, андозаи модел барои дастгоҳи мобилӣ, суръати пешгӯӣ ё масрафи неру? Ҷадвали 12.3 баъзе моделҳои пешомӯхташудаи таснифоти TorchVision-ро нишон медиҳад. Баъд истифодаашонро мебинем. Рӯйхати пурра ва моделҳои вазифаҳои дигари биноӣ дар https://pytorch.org/vision/stable/models ҳаст. Ҷадвал дурустии top-1 ва top-5 дар ImageNet, шумораи параметрҳо бо миллион ва ҳисоббарории ҳар тасвирро бо GFLOPs медиҳад. Як GFLOP як миллиард амалиёт бо ададҳои нуқтаи шинокунанда аст. Моделҳои калон одатан дурусттаранд, вале на ҳамеша: EfficientNet v2 small аз Inception v3 ҳам хурдтар ва ҳам дурусттар аст, аммо ҳисоби бештар талаб мекунад.
Ҷадвали 12.3. Баъзе моделҳои пешомӯхташудаи TorchVision, аз рӯйи андоза
| Модел | Дурустии top-1 | Дурустии top-5 | Параметрҳо | GFLOPs |
|---|---|---|---|---|
| MobileNet v3 small | 67.7% | 87.4% | 2.5 млн | 0.1 |
| EfficientNet B0 | 77.7% | 93.5% | 5.3 млн | 0.4 |
| GoogLeNet | 69.8% | 89.5% | 6.6 млн | 1.5 |
| DenseNet 121 | 74.4% | 92.0% | 8.0 млн | 2.8 |
| EfficientNet v2 small | 84.2% | 96.9% | 21.5 млн | 8.4 |
| ResNet 34 | 73.3% | 91.4% | 21.8 млн | 3.7 |
| Inception V3 | 77.3% | 93.5% | 27.2 млн | 5.7 |
| ConvNeXt Tiny | 82.6% | 96.1% | 28.6 млн | 4.5 |
| DenseNet 161 | 77.1% | 93.6% | 28.7 млн | 7.7 |
| ResNet 152 | 82.3% | 96.0% | 60.2 млн | 11.5 |
| AlexNet | 56.5% | 79.1% | 61.1 млн | 0.7 |
| EfficientNet B7 | 84.1% | 96.9% | 66.3 млн | 37.8 |
| ResNeXt 101 32x8D | 82.8% | 96.2% | 88.8 млн | 16.4 |
| EfficientNet v2 large | 85.8% | 97.8% | 118.5 млн | 56.1 |
| VGG 11 with BN | 70.4% | 89.8% | 132.9 млн | 7.6 |
| ConvNeXt Large | 84.4% | 97.0% | 197.8 млн | 34.4 |
Моделҳои хурд дар ҳар GPU кор мекунанд. Аммо модели калон, монанди ConvNeXt Large, чӣ? Ҳар параметр адади 32-битӣ, яъне 4 байт аст, бинобар ин шояд фикр кунед, ки модели 200-миллионпараметрӣ ҳамагӣ 800 MB хотира мехоҳад. Воқеан, хеле бештар лозим мешавад: мувофиқи мисоли матн, одатан то тақрибан 5 GB барои як тасвир ҳангоми пешгӯӣ, вобаста ба андозаи тасвир, ва ҳангоми омӯзиш боз ҳам бештар. Биёед сабабашро бинем.
Талаботи RAM-и GPU: пешгӯӣ ва омӯзиш
CNN хотираи зиёд мехоҳад. Як конволютсияи дорои 200 филтри 5 × 5, қадами 1 ва пуркунии same-ро гирем, ки тасвири RGB-и 150 × 100 бо 3 каналро коркард мекунад:
- Шумораи параметрҳо (5 × 5 × 3 + 1) × 200 = 15 200 аст; +1 ба ғеҷишҳо рост меояд. Ин зиёд нест: қабати пуррапайваст барои ҳамон андозаи баромад 200 × 150 × 100 нейрон мехост, ки ҳар кадом ба ҳамаи 150 × 100 × 3 вуруд пайваст аст. Он 200 × 150 × 100 × (150 × 100 × 3 + 1) ≈ 135 миллиард параметр медошт!
- Аммо ҳар яке аз 200 харита 150 × 100 нейрон дорад ва ҳар нейрон ҷамъи вазндори 5 × 5 × 3 = 75 вурудро ҳисоб мекунад. Дар маҷмӯъ 225 миллион зарби нуқтаи шинокунанда мешавад. Аз қабати пуррапайваст беҳтар аст, вале ҳанӯз серҳисоб мебошад.
- Баромад бо ададҳои 32-битӣ дар хотира 200 × 150 × 100 × 32 = 96 миллион бит, ё 12 MB, ҷой мегирад. Ин барои танҳо як намуна аст. Барои бастаи омӯзишии 100-намунагӣ ҳамин як қабат 1,2 GB хотира мегирад!
Ҳангоми пешгӯӣ (inference), баъди ҳисоб кардани қабати оянда хотираи қабати пешинаро озод кардан мумкин аст, пас танҳо хотираи ду қабати пайдарпай лозим мешавад. Ҳангоми омӯзиш бошад, ҳамаи ҳисобҳои гузариши пешрав бояд барои гузариши баръакс нигоҳ дошта шаванд. Аз ин рӯ, ҳадди ақал ҷамъи хотираи ҳамаи қабатҳо лозим аст. RAM-и GPU хеле осон тамом мешавад.
Агар омӯзиш бо хатои норасоии хотира қатъ шавад, андозаи бастаро кам кунед. Барои нигоҳ доштани баъзе бартариҳои бастаҳои калон метавонед градиентҳоро баъди ҳар баста ҷамъ карда, вазнҳоро танҳо баъди чанд баста нав кунед. Роҳҳои дигар: кам кардани андозанокӣ бо қадам, дур кардани чанд қабат, истифодаи ададҳои 16-битӣ ба ҷойи 32-битӣ, тақсим кардани CNN байни чанд дастгоҳ ё гузаронидани модулҳои серхотира ба CPU бо module.to("cpu").
Роҳи дигар иваз кардани ҳисоббарории бештар ба истифодаи камтари хотира аст. Ба ҷойи нигоҳ доштани ҳамаи фаъолшавиҳои гузариши пешрав, танҳо баъзеашонро ҳамчун нуқтаҳои назоратии фаъолшавӣ нигоҳ медоред. Ҳангоми гузариши баръакс фаъолшавиҳои гумшударо аз нуқтаи пешина бо гузариши қисман пешрав дубора ҳисоб мекунед.
Дар PyTorch барои activation checkpointing, ки gradient checkpointing низ ном дорад, аз torch.utils.checkpoint.checkpoint() истифода мешавад. Ба ҷойи z = foo(x) менависед z = checkpoint(foo, x). Ҳангоми пешгӯӣ фарқе намекунад, вале дар омӯзиш фаъолшавиҳои ин модул нигоҳ дошта намешаванд ва foo(x) ҳангоми зарурат дар гузариши баръакс аз нав ҳисоб мешавад. Татбиқаш сода аст ва тағйири меъмориро талаб намекунад.
Огоҳӣ. Ду даъвати гузариши пешрав бо ҳамон вурудҳо бояд натиҷаи яксон диҳанд, вагарна градиентҳо нодуруст мешаванд. Пас модулҳои фармоишӣ маҳдудиятҳое доранд: аз амалиёти дарҷойӣ худдорӣ кардан ё ҳолати тавлиди ададҳои тасодуфиро идора кардан лозим аст. Барои тафсилот ба ҳуҷҷатҳои
checkpoint()нигаред.
Агар тағйири меъморӣ бароятон қобили қабул бошад, роҳи хеле самараноктари мубодилаи ҳисоббарорӣ ба хотира ҳаст: шабакаҳои боқимондагии баргарданда.
Шабакаҳои боқимондагии баргарданда — RevNet
RevNet-ро Эйдан Гомес ва ҳамкоронаш соли 2017 пешниҳод карданд. Он одатан ҳисобҳоро тақрибан 33% зиёд мекунад, вале умуман нигоҳ доштани фаъолшавиҳоро ҳангоми гузариши пешрав талаб намекунад! Тарзи кор:
- Ҳар қабати баргарданда ду вуруди ҳамандозаи x₁ ва x₂ гирифта, ду баромад ҳисоб мекунад: y₁ = x₁ + f(x₂) ва y₂ = g(y₁) + x₂. f ва g ҳар функсия шуда метавонанд, ба шарте ки андозаи баромад бо вуруд баробар ва барои вуруди муайян натиҷа ҳамеша яксон бошад. Масалан, онҳо метавонанд модулҳои ҳамсохт аз чанд конволютсияи қадамаш 1 ва пуркунии
sameбошанд; ҳар конволютсия batch norm ва ReLU-и худро дорад. - Ҳангоми паҳнкунии баръакс вурудҳои қабатро аз баромадҳо барқарор мекунем: x₂ = y₂ − g(y₁) ва x₁ = y₁ − f(x₂). Ба осонӣ санҷидан мумкин аст, ки инҳо аз ду баробарии аввал бармеоянд. Пас дар гузариши пешрав фаъолшавиҳоро нигоҳ доштан лозим нест — олиҷаноб!
Азбаски f ва g бояд шакли вурудро нигоҳ доранд, қабатҳои баргарданда наметавонанд конволютсияи қадамаш аз 1 калон ё пуркунии valid дошта бошанд. Чунин қабатҳоро дар CNN истифода бурдан мумкин аст, вале ҳилаи RevNet ба онҳо татбиқ намешавад ва фаъолшавиашонро нигоҳ доштан лозим мешавад. Хушбахтона, CNN одатан танҳо чанд чунин қабат дорад. Аз ҷумла, қабати якум андозаҳои фазоиро кам ва каналҳоро зиёд мекунад; натиҷаро дар самти каналҳо ба ду қисми баробар ҷудо карда, ба қабати якуми баргарданда медиҳанд.
RevNet танҳо барои CNN нест. Он дар асоси меъмории таъсиргузори трансформер бо номи Reformer низ ҷой дорад (боби 17).
Акнун ба кори амалӣ мегузарем: яке аз меъмориҳои маъмултарини CNN-ро бо PyTorch аз сифр месозем.
Татбиқи CNN-и ResNet-34 бо PyTorch
Аксари меъмориҳои то ин ҷо дидашударо бо PyTorch табиӣ татбиқ кардан мумкин аст, гарчанде одатан ба ҷойи он шабакаи пешомӯхташударо бор мекунед. Барои нишон додани раванд ResNet-34-ро аз сифр месозем. Аввал қабати ResidualUnit:
class ResidualUnit(nn.Module):
def __init__(self, in_channels, out_channels, stride=1):
super().__init__()
DefaultConv2d = partial(
nn.Conv2d, kernel_size=3, stride=1, padding=1, bias=False)
self.main_layers = nn.Sequential(
DefaultConv2d(in_channels, out_channels, stride=stride),
nn.BatchNorm2d(out_channels),
nn.ReLU(),
DefaultConv2d(out_channels, out_channels),
nn.BatchNorm2d(out_channels),
)
if stride > 1:
self.skip_connection = nn.Sequential(
DefaultConv2d(in_channels, out_channels, kernel_size=1,
stride=stride, padding=0),
nn.BatchNorm2d(out_channels),
)
else:
self.skip_connection = nn.Identity()
def forward(self, inputs):
return F.relu(self.main_layers(inputs) + self.skip_connection(inputs))
Код ба расми 12.19 хеле мувофиқ аст. Дар созанда ҳамаи қабатҳои лозимиро месозем: main_layers қисми рости расм аст; skip_connection ҳангоми қадами аз 1 калон қабатҳои қисми чап ва ҳангоми қадами 1 модули nn.Identity аст. nn.Identity ҳеҷ кор намекунад, танҳо вурудро бармегардонад. Дар forward() вуруд аз ҳар ду шоха гузашта, баромадҳо ҷамъ ва функсияи фаъолсозӣ татбиқ мешаванд.
Акнун ResNet34-ро месозем. Бо доштани ResidualUnit тамоми меъморӣ ба силсилаи модулҳо табдил меёбад, пас синфро дар асоси як nn.Sequential месозем. Код ба расми 12.18 наздик аст:
class ResNet34(nn.Module):
def __init__(self):
super().__init__()
layers = [
nn.Conv2d(in_channels=3, out_channels=64, kernel_size=7, stride=2,
padding=3, bias=False),
nn.BatchNorm2d(num_features=64),
nn.ReLU(),
nn.MaxPool2d(kernel_size=3, stride=2, padding=1),
]
prev_filters = 64
for filters in [64] * 3 + [128] * 4 + [256] * 6 + [512] * 3:
stride = 1 if filters == prev_filters else 2
layers.append(ResidualUnit(prev_filters, filters, stride=stride))
prev_filters = filters
layers += [
nn.AdaptiveAvgPool2d(output_size=1),
nn.Flatten(),
nn.LazyLinear(10),
]
self.resnet = nn.Sequential(*layers)
def forward(self, inputs):
return self.resnet(inputs)
Ягона ҷузъи каме нозук ҳалқаи илова кардани RU-ҳост: 3 RU-и аввал 64 филтр, 4 RU-и баъдӣ 128 филтр ва ҳамин тавр. Дар ҳар давр агар шумораи филтрҳо бо RU-и пешина яксон бошад, қадам 1, вагарна 2 аст. Баъд RU ба рӯйхат илова ва prev_filters нав мешавад.
Ҳамин! Акнун моделро дар ImageNet ё маҷмӯи дигари тасвирҳои 224 × 224 омӯзондан мумкин аст. Тааҷҷубовар аст, ки бо ҳамагӣ 45 сатри код метавон модели ғолиби ILSVRC 2015-ро сохт. Ин ҳам зебоии ResNet ва ҳам қудрати ифодаи PyTorch ва Python-ро нишон медиҳад. Татбиқи меъмориҳои дигар вақти бештар, вале душвории чандон бештар намехоҳад. Бо вуҷуди ин, TorchVision бисёре аз онҳоро тайёр дорад: чаро ҳамонҳоро истифода набарем?
Эзоҳи тарҷумон. Баромади коди овардашуда 10 синф дорад (
nn.LazyLinear(10)). Барои ImageNet-и 1000-синфа онро баnn.LazyLinear(1000)иваз кардан лозим аст.
Истифодаи моделҳои пешомӯхташудаи TorchVision
Одатан GoogLeNet, ResNet ё ConvNeXt-ро дастӣ татбиқ кардан лозим нест: шабакаҳои пешомӯхташударо бо чанд сатри TorchVision гирифтан мумкин аст.
Маслиҳат. TIMM китобхонаи дигари хеле маъмули бар PyTorch асосёфта аст. Он моделҳои пешомӯхташудаи таснифи тасвир ва воситаҳои марбут, монанди боркунакҳои додаҳо, афзоишдиҳӣ, оптимизаторҳо ва ҷадвалҳои суръати омӯзишро медиҳад. Hugging Face Hub низ ҷойи хуби гирифтани моделҳои гуногуни пешомӯхташуда аст (боби 14).
Масалан, ConvNeXt-и дар ImageNet пешомӯхташударо чунин бор мекунем. Он вариантҳои tiny, small, base ва large дорад; ин код base-ро мегирад:
weights = torchvision.models.ConvNeXt_Base_Weights.IMAGENET1K_V1
model = torchvision.models.convnext_base(weights=weights).to(device)
Ҳамин! Код вазнҳои 338 MB-ро худкор аз Torch Hub, анбори онлайнии моделҳои пешомӯхташуда, мегирад. Вазнҳо барои истифодаи оянда захира ва кеш мешаванд, масалан дар ~/.cache/torch/hub; барои фаҳмидани роҳи дақиқ дар системаи худ torch.hub.get_dir()-ро иҷро кунед. Баъзе моделҳо вазнҳои навтар, масалан IMAGENET1K_V2, ё вариантҳои дигар доранд. Барои рӯйхати пурраи моделҳо torchvision.models.list_models() ва барои вазнҳои модели муайян, мисли convnext_base, list(torchvision.models.get_model_weights("convnext_base"))-ро иҷро кунед. Ё ба https://pytorch.org/vision/main/models нигаред.
Ду тасвири намунавии пешинаро тасниф мекунем. Аввал пешкоркард бояд айнан мувофиқи интизори модел бошад, аз ҷумла андозаи дуруст. ConvNeXt тасвирҳои 224 × 224 мехоҳад; моделҳои дигар метавонанд, масалан, 299 × 299 талаб кунанд. Тасвирҳои мо 427 × 640 ҳастанд ва бояд тағйири андоза ёбанд. Метавон CenterCrop ва/ё Resize истифода бурд, вале роҳи осонтару боэътимодтар табдилҳои weights.transforms() аст, ки махсус барои ҳамин модел сохта шудаанд:
transforms = weights.transforms()
preprocessed_images = transforms(sample_images_permuted)
Ин табдилҳо шиддати пикселҳоро низ мисли вақти омӯзиш нормализатсия мекунанд. Дар ин ҷо ҳар канали ранг алоҳида бо миёна ва инҳирофи стандартии ImageNet стандартӣ мешавад. Баъдтар инро дастӣ низ иҷро мекунем.
Тасвирҳоро ба GPU гузаронида, ба модел медиҳем. Пеш аз пешгӯӣ моделро ҳатман ба ҳолати арзёбӣ гузаронед — пешфарз он дар ҳолати омӯзиш аст — ва autograd-ро хомӯш кунед:
model.eval()
with torch.no_grad():
y_logits = model(preprocessed_images.to(device))
Натиҷа тензори 2 × 1000 бо логитҳои синфҳои ҳар тасвир аст; ImageNet 1000 синф дорад. Мисли боби 10 бо torch.argmax() синфи дорои логити калонтаринро мегирем:
>>> y_pred = torch.argmax(y_logits, dim=1)
>>> y_pred
tensor([698, 985], device='cuda:0')
Аммо ин рақамҳо кадом синфҳоро ифода мекунанд? Номҳоро аз интернет ёфтан мумкин аст, вале гирифтани онҳо аз худи объекти вазнҳо осонтару боэътимодтар аст. Атрибути meta луғати метамаълумоти модел, аз ҷумла номҳои синфҳоро дорад:
>>> class_names = weights.meta["categories"]
>>> [class_names[class_id] for class_id in y_pred]
['palace', 'daisy']
Тасвири якум «қаср» ва дуюм «гули марворид» тасниф шуд. ImageNet барои бурҷи чинӣ ё гули далия синфи ҷудо надорад, пас инҳо ҷойгузинҳои қобили қабуланд. Бурҷ воқеан қисми Қасри тобистонаи Пекин аст. Се пешгӯии беҳтаринро бо topk() мебинем:
>>> y_top3_logits, y_top3_class_ids = y_logits.topk(k=3, dim=1)
>>> [[class_names[class_id] for class_id in top3] for top3 in y_top3_class_ids]
[['palace', 'monastery', 'lakeside'], ['daisy', 'pot', 'ant']]
Яъне барои якум «қаср», «дайр», «соҳили кӯл» ва барои дуюм «гули марворид», «гулдон», «мӯрча». Эҳтимолиятҳои дар матн овардашуда:
>>> y_top3_logits.softmax(dim=1)
tensor([[0.8618, 0.1185, 0.0197],
[0.8106, 0.0964, 0.0930]], device='cuda:0')
Эзоҳи тарҷумон. Ин код softmax-ро танҳо байни се логити интихобшуда ҳисоб мекунад: ададҳо эҳтимолиятҳои аз нав нормализатсияшуда байни ҳамин се синфанд. Барои эҳтимолиятҳои модел дар байни ҳамаи 1000 синф аввал
y_logits.softmax(dim=1)-ро ҳисоб карда, баъд се қимати калонтаринро гиред.
TorchVision боргирӣ ва истифодаи моделҳои пешомӯхташударо осон мекунад ва барои синфҳои ImageNet аз оғоз хуб кор мекунад. Аммо агар синфҳо берун аз ImageNet бошанд, масалан намудҳои гуногуни гул? Ҳанӯз бо омӯзиши интиқолӣ аз модели пешомӯхташуда фоида гирифтан мумкин аст.
Моделҳои пешомӯхташуда барои омӯзиши интиқолӣ
Агар барои таснифгари тасвир додаи кофии омӯзиш аз сифр надошта бошед, такроран истифода бурдани қабатҳои поёнии модели пешомӯхташуда одатан фикри хуб аст (боби 11). Мо ConvNeXt-и дар ImageNet пешомӯхташудаи болоро мегирем, сари таснифоташро иваз мекунем ва дар 102 Category Flower Dataset ё Flowers102 бозомӯзии дақиқ (fine-tuning) мекунем. Қисми омӯзишии он ҳамагӣ 10 тасвир барои ҳар синф ва дар маҷмӯъ 102 синф дорад. Аз сифр дурустии баланд гирифтан душвор аст, вале бо модели хуби пешомӯхташуда аз 90% гузаштан осонтар мебошад. Аввал маҷмӯаро бо TorchVision бор мекунем:
DefaultFlowers102 = partial(torchvision.datasets.Flowers102, root="datasets",
transform=weights.transforms(), download=True)
train_set = DefaultFlowers102(split="train")
valid_set = DefaultFlowers102(split="val")
test_set = DefaultFlowers102(split="test")
partial() аз се бор такрор кардани аргументҳо пешгирӣ мекунад. Бо transform=weights.transforms() тасвирҳо баробари боршавӣ пешкоркард мешаванд. Flowers102 се қисми пешакӣ муайяншуда дорад: омӯзиш, тасдиқӣ ва санҷиши ниҳоӣ. Ду қисми аввал ҳар кадом барои ҳар синф 10 тасвир доранд, аммо қисми санҷишӣ бештар — аз 20 то 238 тасвир барои ҳар синф — дорад. Дар лоиҳаи воқеӣ одатан қисми зиёди додаҳоро барои омӯзиш мегузоранд, аммо ин маҷмӯа барои таҳқиқоти биниши компютерӣ сохта шуда, муаллифон қасдан қисмҳои омӯзишу тасдиқиро маҳдуд кардаанд.
Боркунакҳои додаҳоро ба тарзи маъмул месозем:
from torch.utils.data import DataLoader
train_loader = DataLoader(train_set, batch_size=32, shuffle=True)
valid_loader = DataLoader(valid_set, batch_size=32)
test_loader = DataLoader(test_set, batch_size=32)
Бисёр маҷмӯаҳои TorchVision номҳои синфҳоро дар classes доранд, вале ин маҷмӯа надорад. Агар ба ҷойи ID номҳои зебое мисли «савсани палангӣ», «аконит» ё «даҳони шер» дидан хоҳед, рӯйхатро дастӣ муайян кунед:
class_names = ['pink primrose', ..., 'trumpet creeper', 'blackberry lily']
Акнун ConvNeXt-base-ро мутобиқ мекунем. Сари модел, яъне қабатҳои болоӣ, барои ImageNet 1000 логит мебарорад. Мо 102 синф дорем, пас сарро бо сари хурдтар иваз мекунем. Барои ёфтани он аз named_children() номҳои зермодулҳоро мегирем:
>>> [name for name, child in model.named_children()]
['features', 'avgpool', 'classifier']
features қисми асосии модел буда, ҳамаи қабатҳоро ғайр аз global average pooling (avgpool) ва сар (classifier) дар бар мегирад. Сарро мебинем:
>>> model.classifier
Sequential(
(0): LayerNorm2d((1024,), eps=1e-06, elementwise_affine=True)
(1): Flatten(start_dim=1, end_dim=-1)
(2): Linear(in_features=1024, out_features=1000, bias=True)
)
Ин nn.Sequential бо нормализатсияи қабат, nn.Flatten ва nn.Linear-и 1024-вурудӣ ва 1000-баромадӣ аст. Қабати охиринро иваз карда, танҳо шумораи баромадро тағйир медиҳем:
n_classes = 102 # len(class_names) == 102
model.classifier[2] = nn.Linear(1024, n_classes).to(device)
Тавре дар боби 11 гуфта шуд, вазнҳои қабатҳои пешомӯхташударо ҳадди ақал дар оғоз ях кардан хуб аст. Аввал ҳамаи параметрҳоро ях карда, баъд танҳо параметрҳои сарро озод мекунем:
for param in model.parameters():
param.requires_grad = False
for param in model.classifier.parameters():
param.requires_grad = True
Бо чанд даври омӯзиши танҳо сари нав, ҳатто бе fine-tuning-и қабатҳои пешомӯхташуда, дурустӣ аллакай ба тақрибан 90% мерасад. Баъд тамоми моделро озод карда, суръати омӯзишро одатан 10 баробар кам ва омӯзишро идома диҳед. Санҷед, ки ба кадом дурустӣ мерасед!
Барои натиҷаи баландтар афзоишдиҳии тасвирҳои омӯзишӣ одатан хуб аст: чаппакунии тасодуфии уфуқӣ, гардиш бо кунҷи хурд, тағйири андозаю буриш ва тағйири ранг. Ҳамааш бояд пеш аз нормализатсияи ImageNet иҷро шавад. Нормализатсияро бо Normalize месозем:
import torchvision.transforms.v2 as T
transforms = T.Compose([
T.RandomHorizontalFlip(p=0.5),
T.RandomRotation(degrees=30),
T.RandomResizedCrop(size=(224, 224), scale=(0.8, 1.0)),
T.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),
T.ToImage(),
T.ToDtype(torch.float32, scale=True),
T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
Маслиҳат. TorchVision табдили AutoAugment дорад, ки чанд амалиёти барои ImageNet беҳинашударо истифода мекунад. Он ба бисёр маҷмӯаҳои дигар низ хуб умумӣ мешавад ва танзимоти тайёр барои CIFAR10 ва рақамҳои хонаҳо дар намуди кӯчаҳо — SVHN — дорад.
Барои боз беҳтар кардани дурустӣ:
- Моделҳои пешомӯхташудаи дигарро санҷед.
- Маҷмӯи омӯзиширо васеъ кунед: аксҳои бештари гул ёфта, барчасп гузоред.
- Ансамбли моделҳо созед ва пешгӯиҳояшонро якҷо кунед.
- Ҳолатҳои хатогиро таҳлил кунед: оё бофта ё ранги монанд доранд? Барои ҳалли мушкили умумӣ пешкоркардро тағйир диҳед.
- Ҷадвали суръати омӯзиш, масалан вобаста ба натиҷа, истифода баред.
- Қабатҳоро аз боло сар карда тадриҷан озод кунед. Ё суръатҳои тафовутдори омӯзиш истифода баред: барои қабатҳои поёнӣ хурдтар ва болоӣ калонтар. Инро бо гурӯҳҳои параметрҳо иҷро кардан мумкин аст (боби 11).
- Оптимизаторҳои гуногун ва гиперпараметрҳояшонро бисанҷед.
- Усулҳои гуногуни мунтазамсозиро санҷед.
Маслиҳат. Барои ёфтани модели дар тасвирҳои ба вазифаи шумо монанд пешомӯхташуда вақт сарф кунед. Барои тасвирҳои моҳвораӣ, ҳавоӣ ё додаҳои растерӣ, монанди модели рақамии баландӣ (DEM), ImageNet чандон кумак намекунад. Ба TorchGeo-и Microsoft, ки ба TorchVision монанд, вале барои додаҳои геофазоӣ аст, нигаред. Барои тиб Project MONAI ва барои кишоварзӣ AgML-ро бинед.
Акнун метавонед барои тасвирҳо ва синфҳои худ таснифгарҳои хуб омӯзонед! Вале биниши компютерӣ танҳо таснифот нест. Масалан, агар хоҳед донед, ки гул дар куҷои тасвир аст, чӣ?
Таснифот ва муайян кардани ҷой
Муайян кардани ҷойи объектро чун вазифаи регрессия ифода кардан мумкин аст (боби 9). Барои чорчӯбаи иҳотакунанда одатан ҷойи марказ, паҳно ва баландиро пешгӯӣ мекунанд. Роҳи дигар координатаҳои уфуқию амудии гӯшаҳои болоии чап ва поёнии рост аст. Дар ҳар сурат чор адад пешгӯӣ мешавад. ConvNeXt тағйири зиёд намехоҳад: танҳо қабати дуюми зичи баромад бо чор воҳид, масалан баъди global average pooling, илова мешавад. Модели FlowerLocator ба модели асосӣ, монанди ConvNeXt-и мо, сари муайянкунии ҷой илова мекунад:
class FlowerLocator(nn.Module):
def __init__(self, base_model):
super().__init__()
self.base_model = base_model
self.localization_head = nn.Sequential(
nn.Flatten(),
nn.Linear(base_model.classifier[2].in_features, 4)
)
def forward(self, X):
features = self.base_model.features(X)
pool = self.base_model.avgpool(features)
logits = self.base_model.classifier(pool)
bbox = self.localization_head(pool)
return logits, bbox
torch.manual_seed(42)
locator_model = FlowerLocator(model).to(device)
Ин модел ду сар дорад: якум логитҳои синф ва дуюм чорчӯбаро мебарорад. Шумораи вурудҳои сари ҷойёбӣ бо nn.Linear-и сари таснифот баробар, вале баромадаш танҳо чор адад аст. forward() бастаи тасвирҳои пешкоркардшударо гирифта, барои ҳар тасвир 102 логит ва як чорчӯба мебарорад. Баъди омӯзиш чунин истифода мешавад:
preproc_images = [...] # бастаи тасвирҳои пешкоркардшуда
y_pred_logits, y_pred_bbox = locator_model(preprocessed_images.to(device))
Эзоҳи тарҷумон. Дар порчаи аслӣ номи тағйирёбандаҳо яксон нест:
preproc_imagesмуайян мешавад, валеpreprocessed_imagesистифода мешавад. Дар истифодаи воқеӣ бояд ҳамон бастаи муайяншударо ба модел диҳед.
Моделро чӣ гуна омӯзонем? Дар боби 10 омӯзиши моделҳои чандбаромадиро дидем. Дар ин ҷо барои таснифот nn.CrossEntropyLoss ва барои ҷойёбӣ nn.MSELoss истифода мекунем. Талафоти ниҳоӣ метавонад ҷамъи вазндори онҳо бошад. Ҳамин!
Аммо як мушкил ҳаст: Flowers102 чорчӯба надорад; бояд худамон илова кунем. Барчаспгузорӣ ва аннотатсияи додаҳо аксар вақт аз душвортарин ва гаронтарин корҳои лоиҳаи омӯзиши мошинӣ аст. Барои ёфтани воситаи мувофиқ вақт сарф кардан хуб аст. Барои чорчӯбагузорӣ воситаҳои кушодаасосе чун Label Studio, OpenLabeler, ImgLab, Labelme, VoTT ё VGG Image Annotator, ё тиҷоратие чун LabelBox, Supervisely, Roboflow ё RectLabel ҳастанд. Бисёре аз онҳо аз AI кумак гирифта, корро хеле тез мекунанд. Барои тасвирҳои бисёр платформаи кори дастаҷамъии Amazon Mechanical Turk низ мумкин аст. Аммо роҳандозӣ, омода кардани варақаи кор, назорат ва таъмини сифати чорчӯбаҳо заҳмати зиёд дорад; бовар ҳосил кунед, ки меарзад. Агар танҳо чандсад ё ду-се ҳазор тасвир дошта бошед ва ин корро зуд-зуд накунед, шояд худ иҷро кардан беҳтар бошад. Бо воситаи дуруст чанд рӯз мегирад ва додаҳою вазифаро беҳтар мефаҳмед.
Баъд метавонед маҷмӯи фармоишӣ созед (боби 10), ки ҳар вурудаш тасвир, барчасп ва чорчӯба дорад. Синфи BoundingBoxes-и TorchVision рӯйхати чорчӯбаҳоро ифода мекунад. Коди зерин барои гули калонтарини тасвири якуми қисми омӯзишӣ чорчӯба месозад. Ҳоло барои ҳар тасвир якто мегирем; баъд чандтоиро мебинем:
import torchvision.tv_tensors
bbox = torchvision.tv_tensors.BoundingBoxes(
[[377, 199, 248, 262]], # марказ x=377, марказ y=199, паҳно=248, баландӣ=262
format="CXCYWH", # қолабҳои дигар: "XYXY" ва "XYWH"
canvas_size=(500, 754) # андозаи аслии тасвир пеш аз пешкоркард
)
Маслиҳат. Барои намоиши чорчӯбаҳо
torchvision.utils.draw_bounding_boxes()-ро истифода баред. Аввал боtorchvision.ops.box_convert()онҳоро ба қолабиXYXYгузаронед.
BoundingBoxes зерсинфи TVTensor ва он зерсинфи torch.Tensor аст. Аз ин рӯ, бо он мисли тензори одӣ кор кардан мумкин аст, вале имкониятҳои иловагӣ дорад. Муҳимтаринаш ин аст, ки бо API-и transforms v2-и TorchVision чорчӯбаҳоро низ табдил медиҳед. Масалан, бо табдили пешина:
>>> transforms(bbox)
BoundingBoxes([[ 90, 91, 120, 154]], format=BoundingBoxFormat.CXCYWH,
canvas_size=(224, 224), clamping_mode=soft)
Огоҳӣ. Тағйири андоза ва буридани чорчӯба маъмулӣ кор мекунад, вале гардиш махсус аст. Чорчӯба параметри гардиш надорад ва давр зада наметавонад. Ба ҷойи он андозааш чунон иваз мешавад, ки чорчӯбаи гардондашударо, на худи объекти гардондашударо, фаро гирад. Аз ин рӯ, мумкин аст барои объект андаке калон шавад.
Ба табдил сохтори додаҳои дохилӣ ҳам додан мумкин аст. Баромад ҳамон сохторро дорад, вале ҳамаи тасвирҳо ва чорчӯбаҳо табдил ёфтаанд. Мисоли зерин тасвири якуми гул ва чорчӯбаашро табдил дода, барчаспро бетағйир мегузорад. Вуруд ва баромад ҷуфтҳое мебошанд, ки тасвир ва луғати барчаспу чорчӯбаро доранд; сохтори дигар ҳам мумкин аст:
first_image = [...] # бор кардани тасвири якуми омӯзишӣ бе пешкоркард
preproc_image, preproc_target = transforms(
(first_image, {"label": 0, "bbox": bbox})
)
preproc_bbox = preproc_target["bbox"]
Маслиҳат. MSE хатои 10-пикселиро барои чорчӯбаи калон ва хурд яксон ҷазо медиҳад. Барои пешгирӣ, функсияи талафоти фармоишӣ созед, ки пеш аз MSE аз паҳно ва баландии ҳам ҳадаф ва ҳам пешгӯӣ решаи квадратӣ мегирад.
MSE сода аст ва барои омӯзиш аксар вақт хуб кор мекунад, вале ченаки хуби арзёбии чорчӯба нест. Ченаки маъмул нисбати буриш ба иттиҳод (intersection over union, IoU ё индекси Жаккар) мебошад: масоҳати ҳампӯшии чорчӯбаи ҳадаф T ва пешгӯӣ P, тақсим ба масоҳати иттиҳоди онҳо P ∪ T (расми 12.24). Яъне:
IoU = |P ∩ T| / |P ∪ T|
|x| масоҳати x аст. IoU аз 0, яъне бе ҳампӯшӣ, то 1, яъне ҳампӯшии комил, меравад. Он дар torchvision.ops.box_iou() татбиқ шудааст.
IoU барои омӯзиш чандон хуб нест: ҳар вақте P ва T ҳампӯш набошанд, новобаста аз масофа ё шаклашон, сифр мешавад. Градиент ҳам сифр аст ва поёнравии градиентӣ пеш рафта наметавонад. Бо илова кардани иттилооти дигар инро ислоҳ кардан мумкин аст. Масалан, IoU-и умумисозишуда (GIoU), ки Ҳ. Ризотофиғӣ ва ҳамкоронаш соли 2019 пешниҳод карданд, хурдтарин чорчӯбаи S-и фарогирандаи P ва T-ро мегирад ва аз IoU ҳиссаи майдони S-ро, ки на P ва на T фаро намегиранд, тарҳ мекунад:
GIoU = IoU − |S − (P ∪ T)| / |S|
Ҳар қадар P ва T дур шаванд, GIoU камтар мешавад ва поёнравии градиентӣ метавонад P-ро ба T наздик кунад. Чун GIoU-ро зиёд кардан мехоҳем, талафот 1 − GIoU аст. Он зуд маъмул шуд ва дар torchvision.ops.generalized_box_iou_loss() мавҷуд аст.
Расми 12.24. Ченаки IoU барои чорчӯбаҳо.
Варианти муҳими дигар IoU-и комил (CIoU) аст, ки З. Чжен ва ҳамкоронаш соли 2020 пешниҳод карданд. Он се омили геометриро мегирад: IoU — ҳампӯшӣ ҳарчи зиёдтар, беҳтар; масофаи марказҳои P ва T, ки бо дарозии диагонали S нормализатсия мешавад — ҳарчи наздиктар, беҳтар; ва монандии таносуби паҳно ба баландии P ва T — ҳарчи монандтар, беҳтар. Талафот 1 − CIoU аст ва дар torchvision.ops.complete_box_iou_loss() мавҷуд мебошад. Одатан аз MSE ё GIoU беҳтар кор мекунад, тезтар ҳамгаро мешавад ва чорчӯбаҳои дақиқтар медиҳад, бинобар ин ба интихоби маъмули пешфарзи ҷойёбӣ табдил меёбад.
Тасниф ва ҷойёбии як объект хуб аст, вале агар тасвир чанд объект дошта бошад, чунон ки дар маҷмӯи гулҳо бисёр мешавад, чӣ?
Ошкорсозии объектҳо
Вазифаи тасниф ва муайян кардани ҷойи чанд объект дар як тасвир ошкорсозии объектҳо ном дорад. То чанд сол пеш усули маъмул чунин буд: CNN-еро, ки барои таснифу ҷойёбии як объекти тақрибан марказии тасвир омӯзонида шудааст, дар рӯйи тасвир ҳаракат медиҳанд ва дар ҳар қадам пешгӯӣ мекунанд. CNN одатан ғайр аз эҳтимолиятҳои синф ва чорчӯба холи мавҷудияти объект (objectness score) низ пешгӯӣ мекунад: эҳтимолияти тахминии он ки дар тасвир воқеан объекти марказаш ба миёна наздик ҳаст. Ин баромади таснифоти дуӣ аст ва онро қабати зичи яквоҳидӣ бо sigmoid, ки бо талафоти кросс-энтропияи дуӣ омӯзонида мешавад, дода метавонад.
Эзоҳ. Баъзан ба ҷойи холи мавҷудияти объект синфи «объект нест» илова мекарданд, вале одатан натиҷаи он бадтар буд. Ба саволҳои «Оё объект ҳаст?» ва «Ин чӣ навъи объект аст?» алоҳида ҷавоб додан беҳтар аст.
Расми 12.25 ҳамин усули CNN-и ҳаракаткунандаро нишон медиҳад. Тасвир ба шабакаи 5 × 7 тақсим шудааст ва CNN — росткунҷаи сиёҳи ғафс — дар ҳамаи минтақаҳои 3 × 3 ҳаракат карда, дар ҳар қадам пешгӯӣ мекунад.
Расми 12.25. Ошкор кардани чанд объект бо ҳаракат додани CNN дар рӯйи тасвир.
Дар расм CNN аллакай се минтақаи 3 × 3-ро дидааст:
- Дар минтақаи болоии чап, ки марказаш ҳуҷайраи сурхи сатри дуюм ва сутуни дуюм аст, садбарги аз ҳама чапро ёфт. Чорчӯбаи пешгӯишуда аз ҳудуди минтақа берун меравад. Ин ҷоиз аст: CNN қисми поёнии садбаргро надида бошад ҳам, ҷойи эҳтимолии онро дуруст тахмин карда тавонист. Барои синфи «садбарг» эҳтимолияти баланд ва холи нисбатан баланди мавҷудияти объект дод, зеро маркази чорчӯба дар ҳуҷайраи марказӣ аст. Дар расм ин хол бо ғафсии чорчӯба нишон дода мешавад.
- Дар минтақаи баъдӣ, як ҳуҷайра ба рост, бо маркази кабуд, ягон гули дар марказбуда наёфт. Пас холи мавҷудияти объект хеле паст буд ва чорчӯбаю эҳтимолиятҳои синфро нодида гирифтан мумкин аст. Худи чорчӯбаи пешгӯишуда ҳам хуб нест.
- Дар минтақаи баъдӣ, боз як ҳуҷайра ба рост, бо маркази сабз, садбарги болоро ёфт, вале на комилан дуруст. Он дар маркази минтақа хуб ҷойгир нест, бинобар ин холи мавҷудияти объект чандон баланд нашуд.
Ҳаракат додани CNN дар тамоми тасвир дар маҷмӯъ 15 чорчӯба дар шабакаи 3 × 5 медиҳад. Ҳар кадом эҳтимолиятҳои синф ва холи мавҷудияти объекти худро дорад. Азбаски андозаи объектҳо гуногун аст, барои гирифтани объектҳои хурдтару калонтар CNN-ро дар минтақаҳои 2 × 2 ва 4 × 4 низ ҳаракат додан мумкин аст.
Ин усул сода аст, вале аксар вақт як объектро дар ҷойҳои каме фарқкунанда чанд бор меёбад. Барои дур кардани чорчӯбаҳои зиёдатӣ паскоркард лозим аст. Усули маъмул фурӯнишонии ғайримаксимумҳо (non-max suppression, NMS) мебошад:
- Ҳамаи чорчӯбаҳои холи мавҷудияти объекти аз остонаи муайян пастро дур кунед. CNN бовар дорад, ки дар он ҷой объект нест, пас чорчӯба фоида надорад.
- Аз боқимонда чорчӯбаи дорои баландтарин холро ёфта, дигар чорчӯбаҳои бо он хеле ҳампӯш, масалан бо IoU-и аз 60% калонро, дур кунед. Дар расми 12.25 чорчӯбаи ғафси садбарги аз ҳама чап холи баландтарин дорад. Чорчӯбаи дигари ба ҳамон садбарг расанда ҳампӯшии зиёд дорад ва дур мешавад, гарчанде дар ин мисол он аллакай дар қадами аввал хориҷ мешуд.
- Қадами 2-ро то тамом шудани чорчӯбаҳои зиёдатӣ такрор кунед.
Ин равиши сода хуб кор мекунад, вале CNN-ро чандин бор, дар ин мисол 15 бор, иҷро мекунад ва суст аст. Хушбахтона, роҳи хеле тези ҳаракат додани CNN ҳаст: шабакаи пурра конволютсионӣ (fully convolutional network, FCN).
Шабакаҳои пурра конволютсионӣ
Ғояи FCN-ро Ҷонатан Лонг ва ҳамкоронаш дар мақолаи соли 2015 барои сегментатсияи маъноӣ, яъне таснифи ҳар пиксел аз рӯйи объекти ба он тааллуқдошта, пешниҳод карданд. Онҳо нишон доданд, ки қабатҳои зичи болоии CNN-ро бо конволютсия иваз кардан мумкин аст. Фарз кунед, қабати зичи 200-нейронӣ болои конволютсияест, ки 100 харитаи 7 × 7 мебарорад. Ин андозаи харита аст, на ядро. Ҳар нейрон ҷамъи вазндори ҳамаи 100 × 7 × 7 фаъолшавиро бо иловаи ғеҷиш ҳисоб мекунад. Онро бо конволютсияи дорои 200 филтри 7 × 7 ва пуркунии valid иваз мекунем. Азбаски ядро ба харитаи вуруд баробар аст, қабат 200 харитаи 1 × 1, яъне 200 адад, медиҳад — мисли қабати зич. Ҳисобҳоро бодиққат бинед: ин ададҳо айнан бо натиҷаи қабати зич баробаранд. Танҳо шакл фарқ мекунад: қабати зич [batch_size, 200], конволютсия [batch_size, 200, 1, 1] мебарорад.
Маслиҳат. Барои табдили қабати зич ба конволютсия шумораи филтрҳо бояд ба воҳидҳои қабати зич ва андозаи филтр ба андозаи харитаҳои вуруд баробар бошад. Пуркунӣ
validаст. Қадамро 1 ё бештар гузоштан мумкин аст, чунон ки ҳоло мебинем.
Чаро муҳим аст? Қабати зич андозаи муайяни вурудро мехоҳад, зеро барои ҳар хусусият вазни ҷудо дорад. Конволютсия тасвирҳои андозаҳои гуногунро коркард мекунад, ҳарчанд шумораи каналҳо бояд муайян бошад: ядро барои ҳар канали вуруд маҷмӯи вазнҳои худро дорад. FCN танҳо конволютсия ва pooling дорад, ки ҳар ду ҳамин хосиятро доранд; пас онро дар тасвирҳои андозаҳои гуногун омӯзондан ва иҷро кардан мумкин аст!
Масалан, фарз мекунем CNN-и таснифу ҷойёбии гулро бо сари иловагии мавҷудияти объект дар тасвирҳои 224 × 224 омӯзондаем. Он барои ҳар тасвир 107 қимат мебарорад:
- Сари таснифот 102 логити синф, барои ҳар синф якто, мебарорад ва бо
nn.CrossEntropyLossомӯзонида мешавад. - Сари мавҷудияти объект як логит медиҳад ва бо
nn.BCEWithLogitsLossомӯзонида мешавад. - Сари ҷойёбӣ чор адади тавсифкунандаи чорчӯба медиҳад ва бо талафоти CIoU омӯзонида мешавад.
Эзоҳи тарҷумон. Дар манбаъ
nn.BCELossомадааст. Он эҳтимолиятҳои баъди sigmoid-ро мегирад; барои логитnn.BCEWithLogitsLossлозим аст.
Акнун nn.Linear-ҳоро ба nn.Conv2d табдил медиҳем. Ҳатто аз нав омӯзондан шарт нест: вазнҳои қабатҳои зичро ба конволютсия нусха мекунем. Метавонистем CNN-ро пеш аз омӯзиш ҳам ба FCN табдил диҳем.
Фарз кунем, қабати охирини конволютсионӣ пеш аз баромад — қабати тангкунанда — барои вуруди 224 × 224 харитаҳои 7 × 7 мебарорад (қисми чапи расми 12.26). Масалан, шабака 5 қабати қадамаш 2 ва пуркунии same дорад, пас андозаҳои фазоӣ дар маҷмӯъ ба 2⁵ = 32 тақсим мешаванд. Агар тасвири 448 × 448 диҳем (қисми рост), тангкунанда харитаҳои 14 × 14 мебарорад. Қабати зичи баромадро конволютсияи 107 филтри 7 × 7, valid ва қадами 1 иваз кардааст, пас 107 харитаи 8 × 8 ҳосил мешавад: 14 − 7 + 1 = 8.
Яъне FCN тамоми тасвирро танҳо як бор коркард карда, шабакаи 8 × 8 медиҳад. Ҳар ҳуҷайра пешгӯиҳои як минтақа — 102 қимати синф, як холи мавҷудият ва чор координатаи чорчӯба — дорад. Барои гирифтани эҳтимолиятҳо аз логитҳо фаъолсозии мувофиқ лозим аст. Ин ба ҳаракат додани CNN-и аслӣ бо 8 мавқеъ дар ҳар сатр ва 8 мавқеъ дар ҳар сутун монанд мебошад. Тасвирро ба шабакаи 14 × 14 тақсимшуда тасаввур кунед ва тирезаи 7 × 7-ро рӯйи он ҳаракат диҳед: 8 × 8 = 64 мавқеъ ва ҳамин қадар пешгӯӣ ҳаст. Аммо FCN самараноктар аст, зеро тасвирро танҳо як бор мебинад. Воқеан, You Only Look Once (YOLO) — «Танҳо як бор нигоҳ мекунӣ» — номи меъмории хеле маъмули ошкорсозист, ки ҳоло мебинем.
Расми 12.26. Як FCN ҳангоми коркарди тасвири хурд (чап) ва калон (рост).
Танҳо як бор нигоҳ мекунӣ — YOLO
YOLO меъмории тезу дақиқи ошкорсозии объектҳост, ки Ҷозеф Редмон ва ҳамкоронаш дар мақолаи соли 2015 пешниҳод карданд. Он чунон тез аст, ки дар видеои зинда ҳамзамон кор мекунад, чунон ки дар намоиши Редмон дида мешавад. Сохтори YOLO ба равиши пешина монанд, вале чанд фарқи муҳим дорад:
- Барои ҳар ҳуҷайраи шабака танҳо объектҳоеро мегирад, ки маркази чорчӯбаашон дар он ҳуҷайра аст. Координатаҳо нисбат ба ҳуҷайра дода мешаванд:
(0, 0)гӯшаи болоии чап ва(1, 1)поёнии рост аст. Вале баландию паҳнои чорчӯба метавонад аз ҳуҷайра хеле берун равад. - Барои ҳар ҳуҷайра ба ҷойи якто ду чорчӯба мебарорад. Ин имкон медиҳад ду объекти наздикро, ки марказҳояшон дар як ҳуҷайраанд, коркард кунад. Ҳар чорчӯба холи мавҷудияти объекти худро дорад.
- Барои ҳар ҳуҷайра тақсимоти эҳтимолияти синфҳоро низ мебарорад: 20 эҳтимолият, зеро YOLO-и аслӣ дар PASCAL VOC-и 20-синфа омӯзонида шуд. Ин харитаи дағали эҳтимолияти синфҳоро медиҳад. Модел барои ҳар ҳуҷайра як тақсимот пешгӯӣ мекунад, на барои ҳар чорчӯба. Вале дар паскоркард метавон мувофиқати чорчӯбаро ба ҳар синфи харита чен карда, эҳтимолияти синфи ҳар чорчӯбаро тахмин кард. Масалан, шахсеро пеши автомобил тасаввур кунед: чорчӯбаи калони уфуқӣ барои мошин ва хурди амудӣ барои шахс. Марказҳои ҳар ду шояд дар як ҳуҷайра бошанд. Дар харитаи эҳтимолият минтақаи калони «мошин» ва дар дохилаш минтақаи хурди «шахс» ҳаст. Умед меравад, ки чорчӯбаи мошин ба минтақаи мошин ва чорчӯбаи шахс ба минтақаи шахс мувофиқ шавад ва синфҳо дуруст таъин гарданд.
YOLO аввал бо Darknet, чорчӯбаи кушодаасоси омӯзиши амиқе, ки Редмон онро бо C сохта буд, таҳия шуд; баъд ба PyTorch ва китобхонаҳои дигар гузаронда шуд. Дар тӯли солҳо аввал Редмон ва ҳамкоронаш — YOLOv2, YOLOv3 ва YOLO9000 — ва аз соли 2020 гурӯҳҳои дигар онро пайваста беҳтар карданд. Ҳар версия бо усулҳои гуногун суръату дурустиро зиёд кард. Масалан, дар матн истифодаи пешфарзҳои лангарӣ (anchor priors) яке аз сабабҳои беҳбудии YOLOv3 гуфта шудааст: вобаста ба синф баъзе шаклҳои чорчӯба эҳтимолияти бештар доранд, масалан одамон одатан амудӣ ҳастанд, автомобилҳо одатан не. Шумораи чорчӯбаҳои ҳар ҳуҷайра зиёд шуд; моделҳо дар маҷмӯаҳои гуногун бо синфҳои бештар омӯзонида шуданд — YOLO9000 то 9000 синфи иерархӣ дошт; пайвастҳои ҷаҳишӣ барои барқарор кардани ҷузъиёти фазоии гумшуда илова шуданд ва тағйироти зиёди дигар ворид гардиданд. Дар бахши сегментатсия барқарорсозии фазоиро мебинем. Вариантҳои хурди tiny YOLO ҳам ҳастанд, ки барои компютерҳои камқувват муносибанд ва, ба гуфтаи матн, метавонанд аз 1000 кадр дар сония зиёд кор кунанд, вале mAP-и каме пасттар доранд.
Миёнаи дақиқиҳои миёна — mAP
Ченаки хеле маъмули ошкорсозии объектҳо mean average precision (mAP) аст. «Миёнаи миёна» такрорӣ менамояд, ҳамин тавр не? Барои фаҳмидан ба дақиқӣ (precision) ва фарогирӣ (recall)-и боби 3 бармегардем. Одатан бо афзоиши фарогирӣ дақиқӣ кам мешавад. Инро дар каҷхати precision/recall мебинем (расми 3.6). Барои ҷамъбасти каҷхат ба як адад метавон масоҳати зери он (AUC)-ро гирифт. Аммо дар баъзе қисмҳо, махсусан фарогирии паст, дақиқӣ бо зиёд шудани фарогирӣ ҳам зиёд мешавад; дар болоии чапи расми 3.6 мебинед. Ин яке аз сабабҳои истифодаи mAP аст.
Фарз кунед, дар фарогирии 10% дақиқӣ 90%, вале дар фарогирии 20% дақиқӣ 96% аст. Дар ин ҷо созиш нест: истифодаи 20% беҳтар аст, зеро ҳам фарогирӣ ва ҳам дақиқӣ баландтаранд. Пас ба ҷойи дақиқии маҳз 10% бояд баландтарин дақиқии дастрас бо фарогирии ҳадди ақал 10%-ро гирем — 96%, на 90%. Як роҳи арзёбии муносиб чунин аст: баландтарин дақиқиро барои фарогирии на камтар аз 0%, баъд 10%, 20% ва то 100% ҳисоб карда, миёнаи онҳоро гирем. Ин дақиқии миёна (AP) аст. Агар зиёда аз ду синф бошад, AP-и ҳар синфро ҳисоб карда, миёнаашон (mAP)-ро мегирем. Китобхонаи TorchMetrics инро дар MeanAveragePrecision татбиқ мекунад.
Дар ошкорсозӣ мушкили иловагӣ ҳаст: агар синф дуруст, вале ҷой нодуруст, яъне чорчӯба тамоман берун бошад, чӣ? Инро пешгӯии мусбати дуруст ҳисоб кардан мумкин нест. Як роҳ муайян кардани остонаи IoU аст: масалан, пешгӯӣ танҳо вақте дуруст аст, ки синф дуруст ва IoU аз 0,5 калон бошад. mAP-и мувофиқро mAP@0.5, mAP@50% ё баъзан AP50 меноманд. PASCAL VOC ҳамин равишро истифода мекунад. Дар COCO mAP барои остонаҳои гуногуни IoU — 0.50, 0.55, 0.60, …, 0.95 — ҳисоб шуда, миёнаи онҳо ченаки ниҳоӣ аст: mAP@[.50:.95] ё mAP@[.50:0.05:.95]. Бале, ин боз «миёнаи миёнаи миёна» мешавад.
TorchVision YOLO надорад. Аммо Ultralytics API-и содаро барои боргирӣ ва истифодаи моделҳои пешомӯхташудаи YOLO дар асоси PyTorch медиҳад. Онҳо дар COCO пешомӯхта шудаанд: маҷмӯа зиёда аз 330 000 тасвир, аз ҷумла 200 000 тасвири аннотатсияшуда барои ошкорсозии 80 синф, монанди шахс, автомобил, мошини боркаш, велосипед ва тӯб дорад. Ultralytics дар Colab пешфарз насб нест, пас %pip install ultralytics-ро иҷро мекунем. Баъд моделро гирифта, истифода мебарем. Масалан, YOLOv9-и миёнаро бор карда, объектҳои як бастаи тасвирро меёбем. Модел тасвирҳои PIL, массивҳои NumPy ва ҳатто URL қабул мекунад:
from ultralytics import YOLO
model = YOLO('yolov9m.pt') # n=nano, s=small, m=medium, x=large
images = ["https://homl.info/soccer.jpg", "https://homl.info/traffic.jpg"]
results = model(images)
Баромад рӯйхати объектҳои Results бо методи қулайи summary() аст. Объекти якуми ошкоршудаи тасвири якум:
>>> results[0].summary()[0]
{'name': 'sports ball',
'class': 32,
'confidence': 0.96214,
'box': {'x1': 245.35733, 'y1': 286.03003, 'x2': 300.62509, 'y2': 343.57184}}
Яъне «тӯби варзишӣ», синфи 32, эътимод 0.96214 ва координатаҳои чорчӯба.
Маслиҳат. Ultralytics API-и содаи омӯзонидани YOLO дар маҷмӯаҳои маъмул ё додаҳои худатонро низ дорад. Тафсилот: https://docs.ultralytics.com/modes/train.
TorchVision чанд модели дигари пешомӯхташудаи ошкорсозӣ дорад. Онҳоро мисли ConvNeXt истифода бурдан мумкин аст, вале пешгӯии ҳар тасвир ҳамчун луғати дорои "labels", яъне ID-и синфҳо, ва "boxes" бармегардад. Барои ҳамаи вариантҳо ба саҳифаи моделҳо нигаред:
- Faster R-CNN. Думарҳилавӣ аст: тасвир аввал аз CNN мегузарад; баромад ба шабакаи пешниҳоди минтақаҳо (RPN) меравад, ки чорчӯбаҳои эҳтимолан дорои объектро пешниҳод мекунад. Баъд барои ҳар чорчӯба аз рӯйи қисми буридашудаи баромади CNN таснифгар иҷро мешавад.
- SSD. Ошкорсози якмарҳилаии «як бор нигоҳ кардан», монанди YOLO.
- SSDlite. Варианти сабуки SSD барои дастгоҳҳои мобилӣ.
- RetinaNet. Якмарҳилаӣ аст ва варианти кросс-энтропия бо номи талафоти фокусӣ (focal loss) пешниҳод кард;
torchvision.ops.sigmoid_focal_loss()-ро бинед. Он ба намунаҳои душвор вазни бештар дода, натиҷаи объектҳои хурд ва синфҳои камёбро беҳтар мекунад. - FCOS. Шабакаи пурра конволютсионии якмарҳилаӣ, ки чорчӯбаҳоро мустақиман, бе такя ба чорчӯбаҳои лангарӣ, пешгӯӣ мекунад.
То ин ҷо объектҳоро дар тасвирҳои ҷудогона ёфтем. Дар видео чӣ? Онҳо бояд на танҳо дар ҳар кадр ошкор, балки дар тӯли вақт пайгирӣ шаванд. Ба ин кӯтоҳ назар мекунем.
Пайгирии объектҳо
Пайгирӣ душвор аст: объект ҳаракат мекунад; бо наздик ё дур шудан калон ё хурд менамояд; ҳангоми гардиш ё тағйири рӯшноӣ ва замина намуди зоҳириаш дигар мешавад; мумкин аст муваққатан пушти объекти дигар пинҳон шавад ва ғайра.
Яке аз системаҳои маъмултарин DeepSORT аст. Он алгоритмҳои классикӣ ва омӯзиши амиқро якҷо мекунад:
- Бо филтрҳои Калман, аз рӯйи ошкорсозиҳои пешина ва бо фарзияи суръати доимӣ, эҳтимолитарин ҷойи ҷории объектро тахмин мекунад.
- Бо модели омӯзиши амиқ монандии ошкорсозиҳои навро ба объектҳои аллакай пайгиришаванда чен мекунад.
- Бо алгоритми маҷорӣ ошкорсозиҳои навро ба объектҳои мавҷуда ё нави пайгиришаванда мувофиқ мекунад. Он таркиби мувофиқкуниеро самаранок меёбад, ки ҳам масофаи ошкорсозиҳо аз ҷойҳои пешгӯишуда ва ҳам фарқи намуди зоҳириро камтарин кунад.
Масалан, тӯби сурхеро тасаввур кунед, ки ба тӯби кабуди самти муқобил бархӯрда, баргаштааст. Филтри Калман аз рӯйи ҷойҳои пешина тахмин мекунад, ки тӯбҳо аз даруни ҳам мегузаранд: фарзияи суръати доимӣ бархӯрдро пешбинӣ намекунад. Агар алгоритми маҷорӣ танҳо ҷойро ба ҳисоб гирад, ошкорсозиҳои навро ба тӯбҳои нодуруст мепайвандад, гӯё тӯбҳо аз ҳам гузашта, ранг иваз кардаанд. Вале ченаки монандӣ мушкилро ошкор мекунад. Агар тӯбҳо ба ҳам хеле монанд набошанд, алгоритм онҳоро дуруст мувофиқ мекунад.
Ultralytics пайгириро дастгирӣ мекунад. Пешфарз Bot-SORT истифода мешавад: ба DeepSORT монанд, вале бо беҳбудиҳое чун ҷуброни ҳаракати камера ва тағйири филтри Калман тезтару дақиқтар аст. Бо YOLOv9-и пешина чунин видео пайгирӣ мешавад. Дар ҳар кадр ID-и объектҳо чоп ва нусхаи аннотатсияшудаи видео захира мешавад; роҳаш дар охир нишон дода мешавад:
my_video = "https://homl.info/cars.mp4"
results = model.track(source=my_video, stream=True, save=True)
for frame_results in results:
summary = frame_results.summary() # ҷамъбасти монанди пешина бо ID-и пайгирӣ
track_ids = [obj["track_id"] for obj in summary]
print("Track ids:", track_ids)
То ин ҷо ҷойи объектҳоро бо чорчӯба муайян кардем. Аксар вақт ин кофист, вале баъзан дақиқии бештар мехоҳем, масалан барои дур кардани заминаи пушти шахс дар видеоконфронс. Биёед ба сатҳи пиксел гузарем.
Сегментатсияи маъноӣ
Дар сегментатсияи маъноӣ ҳар пиксел аз рӯйи синфи объекти ба он тааллуқдошта — осмон, дарахт, бино, об ва ғайра — тасниф мешавад (расми 12.27). Объектҳои ҷудогонаи як синф аз ҳам фарқ карда намешаванд. Масалан, ҳамаи дарахтони тасвири сегментшуда ба як маҷмӯи калони пикселҳои синфи «Дарахт» муттаҳид мешаванд. Душвории асосӣ ин аст, ки тасвир ҳангоми гузаштан аз CNN-и одӣ, аз сабаби қабатҳои қадамашон аз 1 калон, тадриҷан тафсилнокии фазоиро гум мекунад. Дар охир шабака шояд донад, ки дар поёнии чап шахсе ҳаст, вале ҷойро аз ин дақиқтар гуфта натавонад.
Расми 12.27. Сегментатсияи маъноӣ: модели SegFormer ҳар пикселро ба як синф — осмон, дарахт, бино, об ва ғайра — нисбат медиҳад.
Мисли ошкорсозӣ, роҳҳои бисёри ҳалли масъала, баъзеашон мураккаб, ҳастанд. Аммо Ҷонатан Лонг ва ҳамкоронаш дар мақолаи соли 2015 оид ба FCN, ки пештар гуфтем, ҳалли нисбатан сода пешниҳод карданд. CNN-и пешомӯхташударо ба FCN табдил медиҳанд. CNN ба вуруд қадами умумии 32 татбиқ мекунад — ҳосили зарби ҳамаи қадамҳо — пас харитаҳои қабати охир аз тасвири вуруд 32 баробар хурдтаранд. Ин хеле дағал аст, бинобар ин як қабати калонкунии андоза (upsampling) илова карданд, ки тафсилнокиро 32 баробар зиёд мекунад.
Барои калонкунӣ роҳҳои гуногун, монанди интерполятсияи духаттӣ ҳастанд, вале он одатан танҳо то ×4 ё ×8 натиҷаи қобили қабул медиҳад. Ба ҷойи он қабати конволютсионии транспозашуда истифода мешавад: гӯё аввал бо ворид кардани сатрҳо ва сутунҳои холии пур аз сифр тасвирро мекашед ва баъд конволютсияи одӣ мегузаронед (расми 12.28). Баъзеҳо онро конволютсияи қадами касрӣ мешуморанд: масалан дар расм қадам 1/2 аст. Қабатро метавон ба амали наздик ба интерполятсияи хаттӣ ибтидосозӣ кард, вале чун омӯзишпазир аст, ҳангоми омӯзиш беҳтар кор карданро меомӯзад. Дар PyTorch nn.ConvTranspose2d истифода мешавад.
Эзоҳ. Дар конволютсияи транспозашуда қадам дараҷаи кашида шудани вурудро муайян мекунад, на андозаи қадами филтрро. Пас ҳар қадар қадам калон бошад, баромад калонтар аст — баръакси конволютсия ё pooling-и одӣ.
Расми 12.28. Калонкунии андоза бо конволютсияи транспозашуда.
Қабатҳои дигари конволютсионии PyTorch
PyTorch чанд навъи дигар низ дорад:
nn.Conv1d. Барои вурудҳои якченака, монанди силсилаи вақтӣ ё матн — пайдарпайии ҳарфҳо ё калимаҳо — аст. Дар боби 13 мебинем.
nn.Conv3d. Барои вурудҳои сеченака, масалан сканҳои сеченакаи PET.
Конволютсияи à trous. Агар dilation-и ҳар конволютсияро 2 ё бештар гузорем, қабати à trous ҳосил мешавад; ин ибораи фаронсавӣ «сӯрохдор» маъно дорад. Он ба конволютсияи одӣ бо филтре монанд аст, ки тавассути ворид кардани сатрҳою сутунҳои сифрӣ васеъ шудааст. Масалан, филтри 1 × 3-и [[1, 2, 3]] бо dilation=4 ба [[1, 0, 0, 0, 2, 0, 0, 0, 3]] мувофиқ мешавад. Ин бе параметр ё хароҷоти иловагии ҳисобӣ майдони қабули калонтар медиҳад.
Конволютсияи транспозашуда барои калонкунӣ қобили қабул, вале ҳанӯз камдақиқ аст. Барои беҳтар кардан Лонг ва ҳамкоронаш аз қабатҳои поёнӣ пайвастҳои ҷаҳишӣ илова карданд. Масалан, баромадро ба ҷойи 32 аввал 2 баробар калон карданд, ба он баромади қабати поёнии дорои ҳамин тафсилнокии дукаратаро илова намуданд ва натиҷаро 16 баробар калон карданд: афзоиши умумӣ 32 шуд (расми 12.29). Ин қисми ҷузъиёти фазоии дар pooling-ҳои пешина гумшударо барқарор кард. Дар беҳтарин меъмориашон пайвасти дуюми монанд аз қабати боз поёнтар ҷузъиёти нозуктарро баргардонд. Яъне баромади CNN-и аслӣ чунин мегузарад: калонкунӣ ×2, иловаи қабати поёнии миқёсаш мувофиқ, калонкунӣ ×2, иловаи қабати боз поёнтар ва ниҳоят калонкунӣ ×8. Ҳатто аз андозаи тасвири аслӣ ҳам калон кардан мумкин аст: ин барои афзоиши тафсилнокии тасвир истифода мешавад ва фавқултафсилнокӣ (super-resolution) ном дорад.
Расми 12.29. Пайвастҳои ҷаҳишӣ қисми тафсилнокии фазоиро аз қабатҳои поёнӣ барқарор мекунанд.
Маслиҳат. TorchVision FCN ва чанд модели дигари сегментатсияи маъноӣ дорад. Намунаи код дар дафтари боб аст.
Сегментатсияи намунаҳои ҷудогона (instance segmentation) ба сегментатсияи маъноӣ монанд аст, вале ба ҷойи якҷо кардани ҳамаи объектҳои ҳамсинф ҳар объектро алоҳида мешиносад, масалан ҳар велосипедро ҷудо мекунад. Mask R-CNN, ки Каймин Ҳэ ва ҳамкоронаш соли 2017 пешниҳод карданд, Faster R-CNN-ро васеъ карда, барои ҳар чорчӯба ниқоби пикселӣ низ мебарорад. Пас ғайр аз чорчӯба ва эҳтимолиятҳои синф, ниқобе мегиред, ки нишон медиҳад кадом пикселҳои дохили чорчӯба ба объект тааллуқ доранд. Ин модел дар TorchVision бо пешомӯзиш дар COCO 2017 дастрас аст.
Маслиҳат. API-и transforms v2-и TorchVision ба шарофати
VideoваMask-и TVTensor мисли чорчӯбаҳо ба ниқобҳо ва видеоҳо низ татбиқ мешавад.
Биниши амиқи компютерӣ соҳаи васеъ ва босуръат аст; ҳар сол меъмориҳои нав пайдо мешаванд. Барои санҷидани моделҳои нав ба мақолаҳои мавриди таваҷҷуҳи https://huggingface.co/papers нигаред. Пештар аксари онҳо ба CNN такя мекарданд, вале аз соли 2020 меъмории дигар — трансформерҳо, ки дар бобҳои 15 ва 16 муҳокима мекунем — ба биниши компютерӣ ворид шуд. Пешрафти 15 соли охир ҳайратовар буд. Ҳоло муҳаққиқон ба масъалаҳои душвортар рӯ меоранд: омӯзиши зиддиятӣ, ки шабакаро ба тасвирҳои махсуси фиребдиҳанда устувортар мекунад; шарҳпазирӣ, яъне фаҳмидани сабаби таснифи муайян; тавлиди тасвирҳои воқеиятмонанд, ки дар боби 18 боз мебинем; омӯзиш аз як намуна, яъне шинохтани объект баъди танҳо як бор дидан; пешгӯии кадрҳои навбатии видео; якҷо кардани вазифаҳои матну тасвир ва ғайра.
Акнун ба боби оянда мегузарем: дар он коркарди додаҳои пайдарпай, монанди силсилаҳои вақтӣ, бо шабакаҳои нейронии бозгаштӣ ва конволютсионӣ баррасӣ мешавад.

Барномасозӣ
Олами Афсонаҳо
Ахбор