Cum funcționează straturile convoluționale în rețelele neuronale de învățare profundă?

Tweet Share Share

Ultima actualizare la 17 aprilie 2020

Straturile convoluționale sunt elementele principale utilizate în rețelele neuronale convoluționale.

O convoluție este simpla aplicare a unui filtru la o intrare care are ca rezultat o activare. Aplicarea repetată a aceluiași filtru la o intrare are ca rezultat o hartă a activărilor denumită hartă de caracteristici, indicând locațiile și puterea unei caracteristici detectate într-o intrare, cum ar fi o imagine.

Inovația neuronalei convoluționale rețelele este abilitatea de a învăța automat un număr mare de filtre în paralel specifice unui set de date de antrenament sub constrângerile unei probleme specifice de modelare predictivă, cum ar fi clasificarea imaginilor. Rezultatul este caracteristici foarte specifice care pot fi detectate oriunde pe imaginile de intrare.

În acest tutorial, veți descoperi modul în care convoluțiile funcționează în rețeaua neuronală convoluțională.

După finalizarea acestui tutorial, veți ști:

  • Rețelele neuronale convoluționale aplică un filtru la o intrare pentru a crea o hartă a caracteristicilor care să rezume prezența caracteristicilor detectate în intrare.
  • Filtrele pot fi realizate manual , cum ar fi detectoarele de linie, dar inovația rețelelor neuronale convoluționale este de a învăța filtrele în timpul antrenamentului în contextul unei probleme specifice de predicție.
  • Cum se calculează harta caracteristicilor pentru o convoluție unidimensională și bidimensională straturi într-o rețea neuronală convoluțională.

Lansați proiectul cu noua mea carte Deep Learning for Computer Vision, inclusiv tutoriale pas cu pas și fișierele cod sursă Python pentru toate exemplele.

Să începem.

A Gentle Introducere în straturile convoluționale pentru rețelele neuronale de învățare profundă
Fotografie de mendhak, unele drepturi rezervate.

Prezentare generală a tutorialului

Acest tutorial este împărțit în patru părți; acestea sunt:

  1. Convoluție în rețelele neuronale convoluționale
  2. Convoluție în viziunea computerizată
  3. Puterea filtrelor învățate
  4. Exemplu de lucru Straturi convoluționale

Vrei rezultate cu învățare profundă pentru viziunea computerizată?

curs gratuit de 7 zile pentru e-mail acum (cu un exemplu de cod).

Faceți clic pentru a vă înscrie și pentru a obține, de asemenea, o versiune gratuită PDF Ebook a cursului.

Descărcați Mini-GRATUIT Curs

Convoluția în rețelele neuronale convoluționale

Rețeaua neuronală convoluțională sau CNN pe scurt, este un tip specializat de model de rețea neuronală conceput pentru a lucra cu date de imagine bidimensionale, deși pot fi utilizate cu date unidimensionale și tridimensionale.

Centrul rețelei neuronale convoluționale este stratul convoluțional care dă numele rețelei. Acest strat efectuează o operație numită „convoluție”.

În contextul unei rețele neuronale convoluționale, o convoluție este o operație liniară care implică multiplicarea unui set de greutăți cu intrarea, la fel ca o tradițională Retea neurala. Având în vedere că tehnica a fost concepută pentru intrarea bidimensională, înmulțirea se realizează între o matrice de date de intrare și o matrice bidimensională de greutăți, numită filtru sau nucleu.

Filtrul este mai mic decât datele de intrare și tipul de multiplicare aplicat între un patch de dimensiune de filtru al intrării și filtrul este un produs punct. Un produs dot este multiplicarea elementară între patch-ul de dimensiune de filtrare al intrării și filtrul, care este apoi însumat, rezultând întotdeauna o singură valoare. Deoarece are ca rezultat o singură valoare, operația este adesea denumită „produs scalar”.

Utilizarea unui filtru mai mic decât intrarea este intenționată, deoarece permite același filtru (set de greutăți) să fie înmulțit cu matricea de intrare de mai multe ori în diferite puncte de pe intrare. Mai exact, filtrul se aplică sistematic fiecărei părți suprapuse sau patch-uri de dimensiuni de filtru ale datelor de intrare, de la stânga la dreapta, de sus în jos.

Această aplicație sistematică a aceluiași filtru pe o imagine este o idee puternică . Dacă filtrul este conceput pentru a detecta un anumit tip de caracteristică în intrare, atunci aplicarea filtrului respectiv în mod sistematic pe întreaga imagine de intrare permite filtrului o oportunitate de a descoperi acea caracteristică oriunde în imagine. Această capacitate este denumită în mod obișnuit invarianța traducerii, de ex. interesul general dacă caracteristica este prezentă mai degrabă decât locul în care a fost prezentă.

Invarianța la traducerea locală poate fi o proprietate foarte utilă dacă ne pasă mai mult de dacă este prezentă o caracteristică decât exact unde se află.De exemplu, atunci când stabilim dacă o imagine conține o față, nu trebuie să știm locația ochilor cu o precizie perfectă a pixelilor, trebuie doar să știm că există un ochi în partea stângă a feței și un ochi în dreapta partea feței.

– Pagina 342, Deep Learning, 2016.

Rezultatul din înmulțirea filtrului cu matricea de intrare o singură dată este o singură valoare. Deoarece filtrul este aplicat de mai multe ori matricei de intrare, rezultatul este o matrice bidimensională de valori de ieșire care reprezintă o filtrare a intrării. Ca atare, matricea de ieșire bidimensională din această operațiune se numește „hartă caracteristică”.

Odată creată o hartă caracteristică, putem trece fiecare valoare din harta caracteristicilor printr-o neliniaritate, cum ar fi o ReLU, la fel ca pentru ieșirile unui strat complet conectat.

Exemplu de filtru Aplicat la o intrare bidimensională pentru a crea o hartă de caracteristici

Dacă proveniți dintr-un câmp de procesare a semnalului digital sau dintr-o zonă conexă a matematicii, este posibil să înțelegeți operația de convoluție pe o matrice ca ceva diferit . Mai exact, filtrul (nucleul) este răsturnat înainte de a fi aplicat la intrare. Din punct de vedere tehnic, convoluția descrisă în utilizarea rețelelor neuronale convoluționale este de fapt o „corelație încrucișată”. Cu toate acestea, în învățarea profundă, aceasta este denumită o operație de „convoluție”.

Multe biblioteci de învățare automată implementează corelația încrucișată, dar o numesc convoluție.

– Pagina 333, Deep Learning, 2016.

În rezumat, avem o intrare, cum ar fi o imagine a valorilor pixelilor, și avem un filtru, care este un set de greutăți, iar filtrul este aplicat sistematic la datele de intrare pentru a crea o hartă de caracteristici .

Convoluție în viziunea computerizată

Ideea aplicării operației convoluționale la datele de imagine nu este nouă sau unică rețelelor neuronale convoluționale; este o tehnică obișnuită utilizată în viziunea pe computer.

Din punct de vedere istoric, filtrele au fost proiectate manual de către experți în viziune pe computer, care au fost apoi aplicate unei imagini pentru a rezulta într-o hartă a caracteristicilor sau a rezultat din aplicarea filtrului apoi face analiza imaginii este mai ușoară într-un fel.

De exemplu, mai jos este un filtru de element 3 × 3 realizat manual pentru detectarea liniilor verticale:

1
2
3

0.0, 1.0, 0.0
0.0, 1.0, 0.0
0.0, 1.0, 0.0

Aplicarea acestui filtru la un imaginea va avea ca rezultat o hartă a caracteristicilor care conține doar linii verticale. Este un detector de linie verticală.

Puteți vedea acest lucru din valorile de greutate din filtru; toate valorile pixelilor din linia verticală centrală vor fi activate pozitiv și orice de ambele părți va fi activat negativ. Tragerea sistemică a acestui filtru între valorile pixelilor dintr-o imagine poate evidenția doar pixelii liniei verticale.

Un detector de linie orizontală ar putea fi creat și aplicat imaginii, de exemplu:

1
2
3

0.0, 0.0, 0.0
1.0, 1.0, 1.0
0.0, 0.0, 0.0

Combinând rezultatele din ambele filtre, de ex combinând ambele hărți ale caracteristicilor, va rezulta evidențierea tuturor liniilor dintr-o imagine.

O suită de zeci sau chiar sute de alte filtre mici poate fi proiectată pentru a detecta alte caracteristici din imagine.

Inovația utilizării operației de convoluție într-o rețea neuronală este că valorile filtrului sunt greutăți care trebuie învățate în timpul antrenamentului rețelei.

Rețeaua va afla ce tipuri de caracteristici să extrage din intrare. În mod specific, formându-se în coborâre cu gradient stochastic, rețeaua este forțată să învețe să extragă din imagine caracteristici care să minimizeze pierderea pentru sarcina specifică pe care rețeaua este pregătită să o rezolve, de ex. extrageți caracteristici care sunt cele mai utile pentru clasificarea imaginilor ca câini sau pisici.

În acest context, puteți vedea că aceasta este o idee puternică.

Puterea filtrelor învățate

Învățarea unui singur filtru specific unei sarcini de învățare automată este o tehnică puternică.

Cu toate acestea, rețelele neuronale convoluționale realizează mult mai mult în practică. .

Filtre multiple

Rețelele neuronale convoluționale nu învață un singur filtru; ei, de fapt, învață mai multe caracteristici în paralel pentru o intrare dată.

De exemplu, este obișnuit ca un strat convoluțional să învețe de la 32 la 512 filtre în paralel pentru o intrare dată.

Acest lucru oferă modelului 32, sau chiar 512, diferite moduri de extragere a caracteristicilor dintr-o intrare, sau multe modalități diferite atât de „învățare a vedea”, cât și după antrenament, multe modalități diferite de „a vedea” datele de intrare.

Această diversitate permite specializarea, de ex nu doar linii, ci liniile specifice văzute în datele dvs. specifice de antrenament.

Mai multe canale

Imaginile color au mai multe canale, de obicei unul pentru fiecare canal de culoare, cum ar fi roșu, verde, și albastru.

Din perspectiva datelor, asta înseamnă că o singură imagine furnizată ca intrare în model este, de fapt, trei imagini.

Un filtru trebuie să aibă întotdeauna același număr de canale ca intrare, adesea denumită „adâncime”. Dacă o imagine de intrare are 3 canale (de exemplu, o adâncime de 3), atunci un filtru aplicat acelei imagini trebuie să aibă și 3 canale (de exemplu, o adâncime de 3). În acest caz, un filtru 3 × 3 ar fi de fapt 3x3x3 sau pentru rânduri, coloane și adâncime. Indiferent de adâncimea intrării și adâncimea filtrului, filtrul este aplicat intrării utilizând o operație de produs punct care are ca rezultat o singură valoare.

Aceasta înseamnă că, dacă un strat convoluțional are 32 de filtre, aceste 32 de filtre nu sunt doar bidimensionale pentru intrarea bidimensională a imaginii, ci sunt și tridimensionale, având greutăți de filtrare specifice pentru fiecare dintre cele trei canale. Cu toate acestea, fiecare filtru are ca rezultat o singură hartă a caracteristicilor. Ceea ce înseamnă că adâncimea de ieșire a aplicării stratului convoluțional cu 32 de filtre este de 32 pentru cele 32 de hărți ale caracteristicilor create.

Straturi multiple

Straturile convoluționale nu se aplică doar datelor de intrare , de exemplu valori brute ale pixelilor, dar pot fi aplicate și la ieșirea altor straturi.

Stivuirea straturilor convoluționale permite o descompunere ierarhică a intrării.

Luați în considerare faptul că filtrele care funcționează direct pe valorile brute ale pixelilor va învăța să extragă caracteristici de nivel scăzut, cum ar fi liniile.

Filtrele care funcționează la ieșirea straturilor de primă linie pot extrage caracteristici care sunt combinații de caracteristici de nivel inferior, cum ar fi caracteristicile care cuprind mai multe linii pentru a exprima forme.

Acest proces continuă până când straturile foarte adânci extrag fețe, animale, case și așa mai departe.

Exact ceea ce vedem in practica. Abstracția caracteristicilor la comenzi mari și mai mari pe măsură ce adâncimea rețelei este crescută.

Exemplu lucrat de straturi convoluționale

Biblioteca de învățare profundă Keras oferă o suită de straturi convoluționale.

Putem înțelege mai bine operațiunea de convoluție uitându-ne la câteva exemple lucrate cu date artificiale și filtre realizate manual.

În această secțiune, vom analiza atât un strat convoluțional unidimensional, cât și un exemplu de strat convoluțional bidimensional pentru a face ca operațiunea de convoluție să fie concretă și să ofere un exemplu de utilizare a straturilor Keras.

Exemplu de strat 1D convoluțional

Putem defini un intrare dimensională care are opt elemente, toate cu valoarea 0.0, cu un element cu două elemente în mijloc cu valorile 1.0.

1

Intrarea în Keras trebuie să fie tridimensională pentru un strat convoluțional 1D.

Prima dimensiune se referă la fiecare eșantion de intrare; în acest caz, avem doar un singur eșantion. A doua dimensiune se referă la lungimea fiecărui eșantion; în acest caz, lungimea este de opt. A treia dimensiune se referă la numărul de canale din fiecare eșantion; în acest caz, avem doar un singur canal.

Prin urmare, forma matricei de intrare va fi.

1
2
3

# define input date
data = asarray ()
data = data.reshape (1, 8, 1)

Vom defini un model care se așteaptă ca mostrele de intrare să aibă forma.

Modelul va avea un singur filtru cu forma a 3 sau trei elemente lățime. Keras se referă la forma filtrului ca kernel_size.

1
2
3

# create model
model = Sequential ()
model.add (Conv1D (1, 3, input_shape = (8, 1)))

În mod implicit, filtrele dintr-un strat convoluțional sunt inițializate cu greutăți aleatorii. În acest exemplu inventat, vom specifica manual greutățile pentru filtrul unic. Vom defini un filtru care este capabil să detecteze denivelări, adică o valoare de intrare ridicată înconjurată de valori de intrare scăzute, așa cum am definit în exemplul nostru de intrare.

Filtrul cu trei elemente pe care îl vom defini arată după cum urmează:

1

Stratul convoluțional are, de asemenea, o valoare de intrare de părtinire care necesită, de asemenea, o greutate pe care o vom seta la zero.

Prin urmare, putem forța greutățile stratului nostru convoluțional unidimensional să utilizeze filtrul fabricat manual, după cum urmează:

Greutățile trebuie specificate în la structură tridimensională, în termeni de rânduri, coloane și canale. Filtrul are un singur rând, trei coloane și un canal.

Putem prelua greutățile și putem confirma că acestea au fost setate corect.

1
2

# confirmați că au fost stocate
print (model.get_weights ())

În cele din urmă, putem aplica filtrul unic datelor noastre de intrare.

Putem realiza acest lucru apelând funcția predict () pe model. Aceasta va returna harta caracteristicilor direct: aceasta este rezultatul aplicării filtrului în mod sistematic pe secvența de intrare.

1
2
3

# aplică filtrul la datele de intrare
yhat = model.predict (date)
print (yhat )

Legând toate acestea împreună, exemplul complet este enumerate mai jos.

Rularea exemplului imprimă mai întâi greutățile rețelei; aceasta este confirmarea că filtrul nostru manual a fost setat în model așa cum ne-am așteptat.

Apoi, filtrul este aplicat modelului de intrare și harta caracteristicilor este calculată și afișată. Din valorile hărții de funcții putem vedea că defectul a fost detectat corect.

1
2
3
4
5
6
7
8
9
10

],
],
]], dtype = float32), matrice (, dtype = float32)]
]]

Să aruncăm o privire mai atentă la ceea ce s-a întâmplat aici.

Reamintim că intrarea este o vector de opt elemente cu valorile:.

În primul rând, filtrul cu trei elemente a fost aplicat primelor trei intrări ale intrării pus prin calcularea produsului punct (operatorul „.”), care a rezultat într-o singură valoare de ieșire în harta caracteristică zero.

1
2

din numpy import asarray
print (asarray (). dot (asarray ()))

În exemplul nostru manual, acesta este următorul:

1

. = 0

Filtrul a fost apoi mutat de-a lungul unui element al secvența de intrare și procesul s-au repetat; în mod specific, același filtru a fost aplicat secvenței de intrare la indexurile 1, 2 și 3, ceea ce a dus și la o ieșire zero în harta caracteristicilor.

1

. = 0

Suntem sistematici, deci, din nou, filtrul este mutat de-a lungul unui alt element al intrării și aplicat intrării la indicii 2, 3 și 4. De data aceasta, ieșirea este o valoare de unul în harta caracteristicilor. Am detectat caracteristica și am activat în mod corespunzător.

1

. = 1

Procesul se repetă până când calculăm întregul harta caracteristicilor.

1

Rețineți că harta caracteristicilor are șase elemente, în timp ce intrarea noastră are opt elemente. Acesta este un artefact al modului în care filtrul a fost aplicat secvenței de intrare. Există și alte modalități de a aplica filtrul la secvența de intrare care schimbă forma hărții de caracteristici rezultate, cum ar fi umplerea, dar nu vom discuta aceste metode în această postare.

Vă puteți imagina acest lucru cu diferite intrări, putem detecta caracteristica cu mai mult sau mai puțină intensitate și cu greutăți diferite în filtru, că am detecta diferite caracteristici în secvența de intrare.

Exemplu de strat convoluțional 2D

Putem extinde exemplul de detectare a defectelor din secțiunea anterioară la un detector de linie verticală într-o imagine bidimensională.

Din nou , putem constrânge intrarea, în acest caz, la o imagine pătrată de intrare de 8 × 8 pixeli cu un singur canal (de ex. în nuanțe de gri), cu o singură linie verticală în mijloc. div>

1
2
3
4
5
6
7
8

Intrarea într-un strat Conv2D trebuie să fie cu patru dimensiuni.

Prima dimensiune definește eșantioanele; în acest caz, există doar un singur eșantion. A doua dimensiune definește numărul de rânduri; în acest caz, opt. A treia dimensiune definește numărul de coloane, din nou opt în acest caz și, în cele din urmă, numărul de canale, care este unul în acest caz.

Prin urmare, intrarea trebuie să aibă forma în patru dimensiuni sau în acest caz case.

Vom defini Conv2D cu un singur filtru așa cum am făcut în secțiunea anterioară cu exemplul Conv1D.

Filtrul va fi bidimensional și pătrat cu forma 3 × 3. Stratul se va aștepta ca mostrele de intrare să aibă forma sau.

1
2
3

# create model
model = Sequential ()
model.add (Conv2D (1, (3,3), input_shape = (8, 8, 1)))

Vom defini o verticală filtru detector de linie pentru a detecta singura linie verticală din datele noastre de intrare.

Filtrul arată după cum urmează:

1
2
3

0, 1, 0
0, 1, 0
0, 1, 0

Putem implementa acest lucru după cum urmează:

În cele din urmă, vom aplicați filtrul la imaginea de intrare, ceea ce va duce la o hartă a caracteristicilor pe care ne-am aștepta să arate detectarea liniei verticale în imaginea de intrare.

1
2
# aplicați filtrul la datele de intrare
yhat = model.predict (data)

Forma ieșirii hărții de caracteristici va fi cu patru dimensiuni cu forma. Vom efectua un singur lot și avem un singur filtru (un filtru și un canal de intrare), prin urmare forma de ieșire este. Putem imprima destul de mult conținutul hărții de caracteristici unice după cum urmează:

1
2
3

pentru r în interval (yhat.shape):
# tipăriți fiecare coloană din rând
print (pentru c în interval ( yhat.shape)])

Legând toate acestea împreună , exemplul complet este listat mai jos.

Rularea exemplului confirmă mai întâi că filtrul realizat manual a fost definit corect în greutățile stratului

Apoi, se imprimă harta caracteristicilor calculate. Putem vedea din scara numerelor că într-adevăr filtrul a detectat singura linie verticală cu activare puternică în mijlocul hărții caracteristicilor.

Să aruncăm o privire mai atentă asupra a ceea ce a fost calculat.

În primul rând, filtrul a fost aplicat în colțul din stânga sus al imaginii sau un patch de imagine de 3 × 3 elemente. Din punct de vedere tehnic, patch-ul de imagine este tridimensional cu un singur canal, iar filtrul are aceleași dimensiuni. Nu putem implementa acest lucru în NumPy folosind funcția dot (), în schimb, trebuie să folosim funcția tensordot (), astfel încât să putem însuma în mod corespunzător toate dimensiunile, de exemplu:

Acest calcul are ca rezultat o singură valoare de ieșire de 0,0, de exemplu, caracteristica nu a fost detectată. Acest lucru ne oferă primul element din colțul din stânga sus al hărții de funcții.

Manual, acesta ar fi după cum urmează:

1
2
3

0, 1, 0 0, 0, 0
0, 1, 0. 0, 0, 0 = 0
0, 1, 0 0, 0, 0

Filtrul este mutat de-a lungul unei coloane spre stânga și procesul se repetă. Din nou, caracteristica nu este detectată.

1
2
3

0, 1, 0 0, 0, 1
0, 1, 0. 0, 0, 1 = 0
0, 1, 0 0, 0, 1

Încă o mișcare spre stânga către coloana următoare și caracteristica este detectată pentru prima dată, rezultând o activare puternică.

1
2
3

0, 1, 0 0, 1, 1
0, 1, 0. 0, 1, 1 = 3
0, 1, 0 0, 1, 1

Acest proces se repetă până când marginea filtrului se sprijină de marginea sau coloana finală a imaginii de intrare. Aceasta oferă ultimul element din primul rând complet al hărții caracteristicilor.

1

Filtrul se deplasează apoi cu un rând în jos și revine la prima coloană și procesul este legat de la stânga la dreapta pentru a da al doilea rând al hărții de caracteristici. Și continuu până când partea de jos a filtrului se află pe partea de jos sau pe ultimul rând al imaginii de intrare.

Din nou, ca și în secțiunea anterioară, putem vedea că harta caracteristicilor este o matrice 6 × 6, mai mică decât imaginea de intrare 8 × 8 din cauza limitărilor modului în care filtrul poate fi aplicat imaginii de intrare.

Lecturi suplimentare

Această secțiune oferă mai multe resurse pe subiect, dacă sunteți căutând să aprofundăm.

Postări

  • Curs accidental în rețele neuronale convoluționale pentru învățarea automată

Cărți

  • Capitolul 9: Rețele convoluționale, Deep Learning, 2016.
  • Capitolul 5: Deep Learning pentru computer Vision, Deep Learning cu Python, 2017.

API

  • API Keras Convolutional Layers
  • API numpy.asarray

Rezumat

În acest tutorial, ați descoperit cum funcționează convoluțiile în rețeaua neuronală convoluțională.

Mai exact, ați aflat:

  • Rețelele neuronale convoluționale aplică un filtru la o intrare pentru a crea o hartă a caracteristicilor care să rezume prezența caracteristicilor detectate în intrare.
  • Filtrele pot fi fabricate manual, cum ar fi detectoarele de linie, dar inovația rețelelor neuronale convoluționale este de a învăța filtrele în timpul antrenamentului în contextul unei probleme specifice de predicție.
  • Cum se calculează harta caracteristicilor pentru straturi convoluționale unidimensionale și bidimensionale dintr-o rețea neuronală convoluțională.

Aveți întrebări?
Puneți întrebările dvs. în comentariile de mai jos și îmi voi face cel mai bun răspuns.

Dezvoltați modele de învățare profundă pentru Vision Today!

Dezvoltați-vă propriile modele de viziune în minute

… cu doar câteva linii de cod Python

Descoperiți cum în noua mea carte electronică:
Deep Learning for Computer Vision

Oferă tutoriale de auto-studiu pe subiecte precum: clasificare
, detectarea obiectelor (yolo și rcnn), recunoașterea feței (vggface și facenet) , pregătirea datelor și multe altele …

În cele din urmă, aduceți învățarea profundă în proiectele dvs. de viziune

Omiteți academicii. Doar rezultate.

Vedeți ce este în interiorul

Distribuiți Tweet Share Share

Leave a Reply

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *