Site Overlay

L’apprendimento delle macchine è divertente! Parte 3: Apprendimento profondo e reti neurali convoluzionali

Possiamo addestrare questo tipo di rete neurale in pochi minuti su un portatile moderno. Quando avremo finito, avremo una rete neurale che può riconoscere immagini di “8” con una precisione piuttosto alta. Benvenuti nel mondo del riconoscimento delle immagini (fine anni ’80)!

Tunnel Vision

È davvero fantastico che il semplice inserimento di pixel in una rete neurale abbia effettivamente funzionato per costruire il riconoscimento delle immagini! L’apprendimento automatico è magico! …giusto?

Beh, ovviamente non è così semplice.

In primo luogo, la buona notizia è che il nostro riconoscitore “8” funziona davvero bene su immagini semplici dove la lettera è proprio al centro dell’immagine:

Ma ora la vera cattiva notizia:

Il nostro riconoscitore “8” non funziona assolutamente quando la lettera non è perfettamente centrata nell’immagine. Il minimo cambiamento di posizione rovina tutto:

Questo perché la nostra rete ha imparato solo il modello di un “8” perfettamente centrato. Non ha assolutamente idea di cosa sia un “8” decentrato. Conosce esattamente un modello e un solo modello.

Questo non è molto utile nel mondo reale. I problemi del mondo reale non sono mai così semplici e puliti. Quindi dobbiamo capire come far funzionare la nostra rete neurale nei casi in cui l'”8″ non è perfettamente centrato.

Idea della forza bruta #1: cercare con una finestra scorrevole

Abbiamo già creato un ottimo programma per trovare un “8” centrato in un’immagine. E se facessimo una scansione intorno all’immagine per trovare possibili “8” in sezioni più piccole, una sezione alla volta, finché non ne troviamo uno?

Questo approccio si chiama “sliding window”. È la soluzione della forza bruta. Funziona bene in alcuni casi limitati, ma è davvero inefficiente. Devi controllare la stessa immagine più e più volte alla ricerca di oggetti di dimensioni diverse. Possiamo fare meglio di così!

Idea forza bruta #2: Più dati e una rete neurale profonda

Quando abbiamo addestrato la nostra rete, le abbiamo mostrato solo “8” perfettamente centrati. E se la allenassimo con più dati, includendo “8” in tutte le diverse posizioni e dimensioni intorno all’immagine?

Non abbiamo nemmeno bisogno di raccogliere nuovi dati di allenamento. Possiamo semplicemente scrivere uno script per generare nuove immagini con gli “8” in tutte le diverse posizioni dell’immagine:

Abbiamo creato dati di allenamento sintetici creando diverse versioni delle immagini di allenamento che già avevamo. Questa è una tecnica molto utile!

Utilizzando questa tecnica, possiamo facilmente creare una fornitura infinita di dati di allenamento.

Più dati rendono il problema più difficile da risolvere per la nostra rete neurale, ma possiamo compensare rendendo la nostra rete più grande e quindi in grado di imparare modelli più complicati.

Per rendere la rete più grande, basta impilare strati su strati di nodi:

Lo chiamiamo “rete neurale profonda” perché ha più strati di una rete neurale tradizionale.

Questa idea esiste dalla fine degli anni 60. Ma fino a poco tempo fa, l’addestramento di una rete neurale così grande era troppo lento per essere utile. Ma una volta che abbiamo capito come utilizzare le schede grafiche 3D (che sono state progettate per fare la moltiplicazione delle matrici molto velocemente) invece dei normali processori del computer, lavorare con grandi reti neurali è diventato improvvisamente pratico. Infatti, la stessa identica scheda video NVIDIA GeForce GTX 1080 che si usa per giocare a Overwatch può essere usata per addestrare le reti neurali in modo incredibilmente rapido.

Ma anche se possiamo rendere la nostra rete neurale davvero grande e addestrarla rapidamente con una scheda grafica 3d, questo non ci porterà comunque a una soluzione. Dobbiamo essere più intelligenti su come elaboriamo le immagini nella nostra rete neurale.

Pensaci. Non ha senso addestrare una rete a riconoscere un “8” nella parte superiore di un’immagine separatamente dall’addestrarla a riconoscere un “8” nella parte inferiore di un’immagine come se fossero due oggetti completamente diversi.

Dovrebbe esserci un modo per rendere la rete neurale abbastanza intelligente da sapere che un “8” in qualsiasi punto dell’immagine è la stessa cosa senza tutto questo addestramento extra. Fortunatamente… c’è!

La soluzione è la convoluzione

Come uomo, sai intuitivamente che le immagini hanno una gerarchia o struttura concettuale. Considera questa immagine:

Gratuita immagine di mio figlio

Come umano, riconosci immediatamente la gerarchia in questa immagine:

  • Il terreno è coperto di erba e cemento
  • C’è un bambino
  • Il bambino è seduto su un cavallo gonfiabile
  • Il cavallo gonfiabile è sopra l’erba

Molto importante, riconosciamo l’idea di un bambino a prescindere dalla superficie su cui il bambino è. Non dobbiamo reimparare l’idea di bambino per ogni possibile superficie su cui potrebbe apparire.

Ma in questo momento, la nostra rete neurale non può fare questo. Pensa che un “8” in una parte diversa dell’immagine sia una cosa completamente diversa. Non capisce che spostare un oggetto nell’immagine non lo rende diverso. Questo significa che deve reimparare l’identificazione di ogni oggetto in ogni possibile posizione. Questo fa schifo.

Dobbiamo dare alla nostra rete neurale la comprensione dell’invarianza di traduzione – un “8” è un “8”, non importa in quale punto dell’immagine si trovi.

Lo faremo usando un processo chiamato Convoluzione. L’idea della convoluzione è ispirata in parte dall’informatica e in parte dalla biologia (cioè scienziati pazzi che frugano letteralmente nel cervello dei gatti con strane sonde per capire come i gatti elaborano le immagini).

Come funziona la convoluzione

Invece di alimentare intere immagini nella nostra rete neurale come una griglia di numeri, faremo qualcosa di molto più intelligente che sfrutta l’idea che un oggetto è lo stesso, non importa dove appare in una foto.

Ecco come funzionerà, passo dopo passo –

Passo 1: Rompere l’immagine in mattonelle sovrapposte

Simile alla nostra ricerca a finestra scorrevole di cui sopra, passiamo una finestra scorrevole sull’intera immagine originale e salviamo ogni risultato come una mattonella separata, piccola immagine:

Così facendo, abbiamo trasformato la nostra immagine originale in 77 minuscole piastrelle di immagine di uguali dimensioni.

Passo 2: Alimentare ogni mattonella di immagine in una piccola rete neurale

Prima, abbiamo alimentato una singola immagine in una rete neurale per vedere se era un “8”. Faremo esattamente la stessa cosa qui, ma lo faremo per ogni singola piastrella immagine:

Ripetere questo 77 volte, una volta per ogni piastrella.

Tuttavia, c’è una grande novità: manterremo gli stessi pesi della rete neurale per ogni singola piastrella della stessa immagine originale. In altre parole, stiamo trattando ogni tile dell’immagine allo stesso modo. Se qualcosa di interessante appare in una data piastrella, segneremo quella piastrella come interessante.

Passo 3: Salvare i risultati di ogni piastrella in un nuovo array

Non vogliamo perdere traccia della disposizione delle piastrelle originali. Quindi salviamo il risultato dell’elaborazione di ogni tile in una griglia con la stessa disposizione dell’immagine originale. Si presenta così:

In altre parole, abbiamo iniziato con una grande immagine e abbiamo finito con un array leggermente più piccolo che registra quali sezioni della nostra immagine originale erano le più interessanti.

Passo 4: Downsampling

Il risultato del Passo 3 è stato un array che mappa quali parti dell’immagine originale sono le più interessanti. Ma quell’array è ancora piuttosto grande:

Per ridurre la dimensione dell’array, lo ricampioniamo utilizzando un algoritmo chiamato max pooling. Sembra fantasioso, ma non lo è affatto!

Guarderemo semplicemente ogni quadrato 2×2 dell’array e terremo il numero più grande:

L’idea qui è che se abbiamo trovato qualcosa di interessante in una qualsiasi delle quattro piastrelle di input che compongono ogni quadrato 2×2, terremo solo il bit più interessante. Questo riduce la dimensione del nostro array mantenendo i bit più importanti.

Passo finale: Fare una previsione

Finora abbiamo ridotto un’immagine gigantesca in un array abbastanza piccolo.

Indovina un po’? Quell’array è solo un mucchio di numeri, quindi possiamo usare quel piccolo array come input in un’altra rete neurale. Questa rete neurale finale deciderà se l’immagine è o non è una corrispondenza. Per differenziarla dalla fase di convoluzione, la chiamiamo una rete “completamente connessa”.

Così, dall’inizio alla fine, la nostra intera pipeline di cinque passi appare così:

Aggiungimento di ulteriori passi

La nostra pipeline di elaborazione delle immagini è una serie di passi: convoluzione, max-pooling, e infine una rete completamente connessa.

Quando si risolvono problemi nel mondo reale, questi passi possono essere combinati e sovrapposti quante volte si vuole! Potete avere due, tre o anche dieci strati di convoluzione. Puoi inserire il max pooling ovunque tu voglia per ridurre la dimensione dei tuoi dati.

L’idea di base è quella di iniziare con un’immagine di grandi dimensioni e ridurla continuamente, passo dopo passo, fino ad avere finalmente un unico risultato. Più passi di convoluzione hai, più caratteristiche complicate la tua rete sarà in grado di imparare a riconoscere.

Per esempio, il primo passo di convoluzione potrebbe imparare a riconoscere i bordi taglienti, il secondo passo di convoluzione potrebbe riconoscere i becchi usando la sua conoscenza dei bordi taglienti, il terzo passo potrebbe riconoscere interi uccelli usando la sua conoscenza dei becchi, ecc.

Ecco come appare una rete di convoluzione profonda più realistica (come quella che trovereste in un articolo di ricerca):

In questo caso, iniziano un’immagine di 224 x 224 pixel, applicano la convoluzione e il max pooling due volte, applicano la convoluzione altre 3 volte, applicano il max pooling e poi hanno due strati completamente connessi. Il risultato finale è che l’immagine viene classificata in una delle 1000 categorie!

Costruire la rete giusta

Come fai a sapere quali passi devi combinare per far funzionare il tuo classificatore di immagini?

In tutta onestà, devi rispondere a questo facendo molti esperimenti e test. Potresti dover addestrare 100 reti prima di trovare la struttura e i parametri ottimali per il problema che stai risolvendo. L’apprendimento automatico comporta un sacco di prove ed errori!

Costruire il nostro classificatore di uccelli

Ora finalmente sappiamo abbastanza per scrivere un programma che può decidere se un’immagine è un uccello o no.

Come sempre, abbiamo bisogno di alcuni dati per iniziare. Il set di dati gratuito CIFAR10 contiene 6.000 immagini di uccelli e 52.000 immagini di cose che non sono uccelli. Ma per avere ancora più dati aggiungeremo anche il set di dati Caltech-UCSD Birds-200-2011 che ha altre 12.000 foto di uccelli.

Ecco alcuni degli uccelli dal nostro set di dati combinato:

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.