Site Overlay

Învățarea mașinilor este distractivă! Partea 3: Învățarea profundă și rețelele neuronale convoluționale

Potem antrena acest tip de rețea neuronală în câteva minute pe un laptop modern. Când va fi gata, vom avea o rețea neuronală care poate recunoaște imagini de „8” cu o precizie destul de mare. Bine ați venit în lumea recunoașterii imaginilor (de la sfârșitul anilor 1980)!

Tunnel Vision

Este foarte interesant faptul că simpla introducere de pixeli într-o rețea neuronală a funcționat de fapt pentru a construi recunoașterea imaginilor! Învățarea automată este magică! …nu-i așa?

Bine, bineînțeles că nu este atât de simplu.

În primul rând, vestea bună este că dispozitivul nostru de recunoaștere „8” chiar funcționează bine pe imagini simple în care litera se află chiar în mijlocul imaginii:

Dar acum vestea cu adevărat proastă:

Recunoscătorul nostru „8” nu reușește să funcționeze deloc atunci când litera nu este perfect centrată în imagine. Doar cea mai mică schimbare de poziție strică totul:

Acest lucru se datorează faptului că rețeaua noastră a învățat doar modelul unui „8” perfect centrat. Nu are absolut nicio idee despre ce este un „8” descentrat. Cunoaște exact un model și un singur model.

Aceasta nu este foarte util în lumea reală. Problemele din lumea reală nu sunt niciodată atât de clare și de simple. Așa că trebuie să ne dăm seama cum să facem rețeaua noastră neuronală să funcționeze în cazurile în care „8”-ul nu este perfect centrat.

Ideea de forță brută #1: Căutarea cu o fereastră glisantă

Am creat deja un program foarte bun pentru a găsi un „8” centrat într-o imagine. Ce-ar fi dacă am căuta în jurul imaginii posibilele „8”-uri în secțiuni mai mici, pe rând, până când găsim unul?

Această abordare se numește fereastră glisantă. Este soluția de forță brută. Funcționează bine în unele cazuri limitate, dar este foarte ineficientă. Trebuie să verificați aceeași imagine de nenumărate ori, căutând obiecte de dimensiuni diferite. Putem face mai mult decât atât!

Ideea de forță brută nr. 2: Mai multe date și o rețea neuronală profundă

Când am antrenat rețeaua noastră, i-am arătat doar „8”-uri care erau perfect centrate. Ce-ar fi dacă am antrena-o cu mai multe date, incluzând „8”-uri în toate pozițiile și mărimile diferite din jurul imaginii?

Nici măcar nu este nevoie să colectăm noi date de antrenament. Putem pur și simplu să scriem un script pentru a genera noi imagini cu „8”-uri în tot felul de poziții diferite în imagine:

Am creat date sintetice de antrenament prin crearea unor versiuni diferite ale imaginilor de antrenament pe care le aveam deja. Aceasta este o tehnică foarte utilă!

Utilizând această tehnică, putem crea cu ușurință o sursă nesfârșită de date de antrenament.

Mai multe date fac ca problema să fie mai greu de rezolvat pentru rețeaua noastră neuronală, dar putem compensa acest lucru făcând rețeaua noastră mai mare și, astfel, capabilă să învețe modele mai complicate.

Pentru a face rețeaua mai mare, pur și simplu stivuim strat după strat de noduri:

Noi numim această rețea „rețea neuronală profundă”, deoarece are mai multe straturi decât o rețea neuronală tradițională.

Această idee a existat încă de la sfârșitul anilor 1960. Dar, până de curând, antrenarea unei rețele neuronale atât de mari era pur și simplu prea lentă pentru a fi utilă. Dar odată ce ne-am dat seama cum să folosim plăci grafice 3D (care au fost concepute pentru a face înmulțirea matricelor foarte rapid) în locul procesoarelor normale ale calculatoarelor, lucrul cu rețele neuronale mari a devenit brusc practic. De fapt, exact aceeași placă video NVIDIA GeForce GTX 1080 pe care o folosiți pentru a juca Overwatch poate fi folosită pentru a antrena rețele neuronale incredibil de rapid.

Dar chiar dacă putem face rețeaua noastră neuronală foarte mare și o putem antrena rapid cu o placă grafică 3d, asta tot nu ne va duce până la capăt la o soluție. Trebuie să fim mai inteligenți în ceea ce privește modul în care procesăm imaginile în rețeaua noastră neuronală.

Gândiți-vă la asta. Nu are sens să antrenăm o rețea pentru a recunoaște un „8” în partea de sus a unei imagini separat de antrenarea ei pentru a recunoaște un „8” în partea de jos a imaginii, ca și cum acestea ar fi două obiecte total diferite.

Ar trebui să existe o modalitate de a face rețeaua neuronală suficient de inteligentă pentru a ști că un „8” oriunde în imagine este același lucru fără toată această pregătire suplimentară. Din fericire… există!

Soluția este convoluția

În calitate de om, știți intuitiv că imaginile au o ierarhie sau o structură conceptuală. Luați în considerare această imagine:

Imaginea grațioasă a fiului meu

Ca om, recunoașteți instantaneu ierarhia din această imagine:

  • Terenul este acoperit cu iarbă și beton
  • Există un copil
  • Copilul stă pe un cal săltăreț
  • Calul săltăreț se află deasupra ierbii

Cel mai important, recunoaștem ideea de copil indiferent de suprafața pe care se află copilul. Nu trebuie să re-învățăm ideea de copil pentru fiecare suprafață posibilă pe care ar putea apărea.

Dar în acest moment, rețeaua noastră neuronală nu poate face acest lucru. Ea crede că un „8” într-o altă parte a imaginii este un lucru complet diferit. Nu înțelege că mutarea unui obiect în jurul imaginii nu îl transformă în ceva diferit. Acest lucru înseamnă că trebuie să învețe din nou identificarea fiecărui obiect în fiecare poziție posibilă. Asta e nasol.

Trebuie să dăm rețelei noastre neuronale înțelegerea invarianței de translație – un „8” este un „8” indiferent de locul din imagine în care apare.

Vom face acest lucru folosind un proces numit Convoluție. Ideea de convoluție este inspirată parțial de informatică și parțial de biologie (de exemplu, oamenii de știință nebuni care, la propriu, scormonesc creierele pisicilor cu sonde ciudate pentru a-și da seama cum procesează pisicile imaginile).

Cum funcționează convoluția

În loc să introducem imagini întregi în rețeaua noastră neuronală ca o grilă de numere, vom face ceva mult mai inteligent care profită de ideea că un obiect este același indiferent unde apare într-o imagine.

Iată cum va funcționa, pas cu pas –

Pasul 1: Împărțiți imaginea în plăci de imagine suprapuse

În mod similar cu căutarea noastră cu fereastră glisantă de mai sus, să trecem o fereastră glisantă peste întreaga imagine originală și să salvăm fiecare rezultat ca o placă de imagine separată, mică:

Făcând acest lucru, am transformat imaginea noastră originală în 77 de mici plăci de imagine de dimensiuni egale.

Pasul 2: Alimentați fiecare tăbliță de imagine într-o rețea neuronală mică

Anterior, am alimentat o singură imagine într-o rețea neuronală pentru a vedea dacă este un „8”. Vom face exact același lucru aici, dar o vom face pentru fiecare tăbliță de imagine individuală:

Repetă acest lucru de 77 de ori, o dată pentru fiecare tăbliță.

Cu toate acestea, există o mare întorsătură: vom păstra aceleași ponderi ale rețelei neuronale pentru fiecare țiglă din aceeași imagine originală. Cu alte cuvinte, tratăm fiecare piesă din imagine în mod egal. Dacă apare ceva interesant într-o anumită piesă, vom marca acea piesă ca fiind interesantă.

Etapa 3: Salvați rezultatele de la fiecare piesă într-o nouă matrice

Nu vrem să pierdem urma aranjamentului pieselor originale. Așa că salvăm rezultatul de la procesarea fiecărei plăcuțe într-o grilă în același aranjament ca și imaginea originală. Arată astfel:

Cu alte cuvinte, am început cu o imagine mare și am terminat cu o matrice puțin mai mică care înregistrează ce secțiuni din imaginea noastră originală au fost cele mai interesante.

Pasul 4: Downsampling

Rezultatul pasului 3 a fost un array care cartografiază ce părți din imaginea originală sunt cele mai interesante. Dar această matrice este încă destul de mare:

Pentru a reduce dimensiunea matricei, o eșantionăm folosind un algoritm numit max pooling. Sună fantezist, dar nu este deloc!

Ne vom uita la fiecare pătrat 2×2 din matrice și vom păstra cel mai mare număr:

Ideea este că, dacă am găsit ceva interesant în oricare dintre cele patru dale de intrare care alcătuiesc fiecare pătrat al grilei 2×2, vom păstra doar partea cea mai interesantă. Acest lucru reduce dimensiunea matricei noastre, păstrând în același timp cei mai importanți biți.

Etapă finală: Faceți o predicție

Până acum, am redus o imagine gigantică la o matrice destul de mică.

Îndoiți-vă ce? Acea matrice este doar o grămadă de numere, așa că putem folosi acea matrice mică ca intrare într-o altă rețea neuronală. Această rețea neuronală finală va decide dacă imaginea se potrivește sau nu. Pentru a o diferenția de etapa de convoluție, o numim o rețea „complet conectată”.

Deci, de la început până la sfârșit, întreaga noastră conductă în cinci pași arată astfel:

Agregând și mai mulți pași

Convoluția noastră de procesare a imaginilor este o serie de pași: convoluție, max-pooling și, în final, o rețea complet conectată.

Când se rezolvă probleme în lumea reală, acești pași pot fi combinați și stivuiți de câte ori doriți! Puteți avea două, trei sau chiar zece straturi de convoluție. Puteți adăuga max pooling ori de câte ori doriți pentru a reduce dimensiunea datelor dumneavoastră.

Ideea de bază este să începeți cu o imagine mare și să o reduceți continuu, pas cu pas, până când obțineți în final un singur rezultat. Cu cât aveți mai mulți pași de convoluție, cu atât mai complicate vor fi caracteristicile pe care rețeaua dvs. va fi capabilă să învețe să le recunoască.

De exemplu, primul pas de convoluție ar putea învăța să recunoască marginile ascuțite, al doilea pas de convoluție ar putea recunoaște ciocurile folosind cunoștințele sale despre marginile ascuțite, al treilea pas ar putea recunoaște păsări întregi folosind cunoștințele sale despre ciocuri, etc.

Iată cum arată o rețea convoluțională profundă mai realistă (așa cum ați putea găsi într-o lucrare de cercetare):

În acest caz, se pornește de la o imagine de 224 x 224 pixeli, se aplică convoluția și max pooling de două ori, se aplică convoluția de încă trei ori, se aplică max pooling și apoi se obțin două straturi complet conectate. Rezultatul final este că imaginea este clasificată într-una dintre cele 1000 de categorii!

Construirea rețelei potrivite

Atunci, cum știți ce pași trebuie să combinați pentru ca clasificatorul dvs. de imagini să funcționeze?

Honestly, trebuie să răspundeți la această întrebare făcând o mulțime de experimente și teste. S-ar putea să trebuiască să antrenați 100 de rețele înainte de a găsi structura și parametrii optimi pentru problema pe care o rezolvați. Învățarea automată implică multe încercări și erori!

Construirea clasificatorului nostru de păsări

Acum, în sfârșit, știm suficient pentru a scrie un program care poate decide dacă o imagine este o pasăre sau nu.

Ca întotdeauna, avem nevoie de câteva date pentru a începe. Setul gratuit de date CIFAR10 conține 6.000 de imagini de păsări și 52.000 de imagini de lucruri care nu sunt păsări. Dar, pentru a obține și mai multe date, vom adăuga și setul de date Caltech-UCSD Birds-200-2011, care conține alte 12.000 de imagini de păsări.

Iată câteva dintre păsările din setul nostru combinat de date:

Lasă un răspuns

Adresa ta de email nu va fi publicată.