• Non ci sono risultati.

Analisi delle CNN più avanzate

5.1.2 Esempio di forward propagation con AlexNet

Si vedrà ora nel dettaglio una singola fase di forward propagation per rendere l’idea della moltitudine di operazioni all’interno di una rete neurale

convolu-zionale che in questo caso risulta anche essere architetturalmente piuttosto semplice. Infatti per le successive reti che verranno presentate, sarà omessa questa parte, dato che le cose si complicano abbastanza e si rischierebbe di creare troppa confusione con i conteggi. Ovviamente è sufficiente verificare direttamente le dimensioni di un modello finale di una rete per sapere le sue precise dimensioni, cosa che è stata fatta con le reti più complesse, ma avendo in questo caso un’architettura semplice può essere utile capire come si arriva ad avere un file del modello di determinate dimensioni.

Una singola fase di forward propagation di AlexNet implica dunque le seguenti principali operazioni: il primo layer convoluzionale accetta in input un’immagine 227 x 227 x 3 e ad essa applica ben 96 kernel, ognuno di di-mensioni 11 x 11 x 3 con uno stride di 4 e nessun zero-padding, ottenendo un volume 55 x 55 x 96 (per i conti si riguardi paragrafo 3.2.1 e tutte le successive sottosezioni interne ad esso).

Il secondo layer convoluzionale prende in input un volume a cui sono state applicate le funzioni di ReLU, normalizzazione ed anche un overlapping pooling; l’ultima di queste operazioni trasforma il volume precedente in uno di dimensioni 27 x 27 x 96 (si veda paragrafo 3.2.3). Tale volume viene dato in input al secondo layer convoluzionale che lo convolve con 256 kernel di dimensioni 5 x 5 x 96 ed uno stride pari a 1 e uno zero-padding di 2, ottenendo un volume 27 x 27 x 256 (si noti che uno stride di 1 in pratica lascia inalterate le dimensioni spaziali, aumentando solo la profondità dovuta al numero di kernel). Successivamente, dopo le operazioni di ReLU e di normalizzazione, viene applicato un altro layer di pooling identico al precedente e si ottiene un volume 13 x 13 x 256.

Il terzo layer convoluzionale possiede 384 kernel con un receptive field 3 x 3 x 256 ed uno stride di 1 ed uno zero-padding di 1: risulta un volume di 13 x 13 x 384. Questa volta non c’è un altro pooling e nemmeno una normalizzazione, bensì solo un layer ReLU che non intacca le dimensioni.

Il quarto layer convoluzionale possiede altri 384 kernel di dimensioni 3 x 3 x 384, sempre con stride 1 ed uno zero-padding di 1: si ottiene un volume uguale a quello di prima, ovvero 13 x 13 x 384. Anche stavolta, dopo il layer convoluzionale, c’è solo un’operazione di ReLU.

Il quinto layer convoluzionale ha 256 kernel di dimensioni 3 x 3 x 384, con stride 1 e zero-padding 1: il volume risultante ha dimensioni 13 x 13 x 256. Questa volta oltre ad un layer ReLU vi è successivamente anche uno dei soliti layer di pooling che trasforma il volume di prima in uno di taglia 6 x 6 x 256.

A questo punto il primo dei 3 FC layer, possedente 4096 neuroni, effettua il suo normale lavoro, cioè i vari prodotti e somme per ottenere le attivazioni

Figura 5.1: Architettura di AlexNet

dei suoi 4096 neuroni, ottenendo un volume (anche se in realtà ha solo una dimensione) 1 x 1 x 4096.

Analoga cosa con il secondo layer FC, avente sempre 4096 unità, e suc-cessivamente con il terzo ed ultimo layer FC, il quale possedendo solo 1000 unità, il numero di classi nel dataset, produce in output un vettore delle stesse dimensioni, cioè 1 x 1 x 1000.

Se si guarda tuttavia il paper di AlexNet [16], si nota che le cose in realtà non sono esattamente come descritte sopra, anche se sono comunque equivalenti. L’architettura della rete è stata in questo caso divisa in due rami perchè nei vari test sono state utilizzate due GPU in parallelo. Specificando il parametro group, in questo caso pari a 2, è teoricamente possibile con Caffe suddividere il lavoro in più unità GPU dimezzando la profondità di ciascun volume, cioè il numero di depth slice considerati, esattamente come mostrato in figura 5.1.

Ciò però comporta alcuni rischi, dovuti al fatto che la comunicazione fra i due rami di elaborazione delle due GPU non avviene sempre, perchè se fos-se così non converrebbe utilizzare questo approccio, ma solo in determinati punti della rete. Nello specifico solo i kernel del terzo layer convoluzionale sono connessi a tutte le feature create dal secondo; tutti gli altri layer con-voluzionali sono collegati solamente alle feature dei layer precedenti presenti nella loro GPU locale. Quindi con questo metodo si ottiene sicuramente un grande aumento di velocità computazionale, ma tuttavia si può perdere un po’ di generalità, in quanto le feature non sono sempre analizzate tutte insie-me. Oltre a questo è ovviamente necessario sviluppare un apposito codice, CUDA in questo caso, adatto a questo scopo, dato che a quel tempo ancora non esisteva. Nonostante tutto ciò, i risultati non sono comunque andati male.

La rete originale eseguiva esattamente le operazioni descritte accurata-mente prima; tuttavia si è poi visto che la rete risultava troppo pesante da

Figura 5.2: Rete AlexNet densa

allenare e quindi si è optato per un aumento del parallelismo come appena visto. La limitazione più grande derivava probabilmente dalla quantità di memoria che una GPU possedeva 3 anni fa (nei test erano state utilizzate due NVIDIA GTX 580 aventi 3GB di memoria ciascuna) rispetto alla quan-tità di dati che con la loro rete si voleva processare di volta in volta per avere tempi abbastanza ragionevoli.

Avviando la rete in modalità CPU non sono sicuro del fatto che Caffe suddivida il lavoro fra i vari processori presenti, assumendo che nel computer per effettuare il training ce ne sia più di uno. Ad ogni modo è sufficiente con-siderare la rete originale, senza parallelismo, per evitare eventuali problemi: il training risulterà un po’ più lungo, ma i risultati saranno comunque gli stessi, anzi teoricamente si dovrebbero avere feature migliori avendo sempre a disposizione tutti i dati sulla stessa memoria. Spesso infatti anche altri team o utenti utilizzano una versione di AlexNet “densa”, ovvero senza la partizione in due rami per le due GPU vista in precedenza, come mostrato in figura 5.2.

Come si può notare alcuni parametri mostrati in figura 5.2 non sono esat-tamente tutti gli stessi rispetto a quanto detto finora. Questo perchè la figura rappresenta una vecchia versione di AlexNet. Col passare del tempo tale ver-sione è stata leggermente migliorata, apportando proprio alcune modifiche ai parametri della rete. All’interno di questa tesi quando si parlerà di Ale-xNet ci si riferirà sempre all’ultima versione attualmente disponibile, la più accurata, che è quella con i parametri illustrati finora all’interno di questo paragrafo.