• Non ci sono risultati.

Utilizzo dei layer convoluzionali in una CNN

3.2.3 Pooling layer

Un altro tipo di layer indispensabile in una rete neurale convoluzionale è senz’altro il pooling layer. Questi layer vengono periodicamente inseriti al-l’interno di una rete per ridurre la dimensione spaziale (larghezza ed altezza) delle attuali rappresentazioni, cioè dei volumi in uno specifico stadio della rete; ciò serve per ridurre il numero di parametri ed il tempo computazionale della rete, ed inoltre tiene sotto controllo l’overfitting. Un pooling layer opera su ciascun depth slice del volume di input in maniera indipendente, andan-do a ridimensionarlo spazialmente. Per il ridimensionamento si utilizza una semplice funzione, come ad esempio un’operazione di MAX oppure di AVE (il massimo o la media di un determinato insieme di elementi). I pooling layer hanno alcuni parametri settabili:

• il lato F dell’estensione spaziale della selezione quadrata che verrà di volta in volta considerata sull’input in ogni suo depth slice

• il parametro di stride S

Si può notare una certa somiglianza con i parametri di un layer convoluzio-nale: questo perchè anche qui si ha una sorta di receptive field che viene spostato di volta in volta, con un passo specificato dal parametro di stride, su ciascun depth slice del volume di input. In realtà oltre a questo, la situa-zione in questo caso è completamente diversa, dato che qui non vi è alcuna operazione di convoluzione. Tuttavia esattamente come in un layer convo-luzionale anche qui c’è una relazione fra i parametri dell’estensione spaziale F e lo stride S (qui non c’è lo zero-padding), dato che bisogna comunque riuscire a coprire l’intera area di ciascun depth slice. La relazione è infatti molto simile a quella osservata in precedenza: considerando la larghezza W1 di un volume di input, il volume di output di un pooling layer avrà larghezza

W1−F

S + 1. In figura 3.5 è mostrato un esempio di pooling con F=2 ed S=2 tramite la quale la dimensione spaziale viene dimezzata, mentre in figura 3.6 viene illustrato un esempio di operazione di MAX pooling applicata ad un singolo depth slice.

Figura 3.5: Effetti di un’operazione generale di pooling

• accetta in ingresso un volume W1 x H1 x D1

• richiede il settaggio dei seguenti parametri

– il lato F dell’estensione spaziale della selezione quadrata – lo stride S

• produce un volume di output di dimensioni W2 x H2 x D2, dove – W2 = W1−F

S  + 1 – H2 = H1−F

S  + 1 – D1 = D2

Si noti il fatto che un pooling layer non intacca in alcun modo la dimensio-ne della profondità di un volume di input. Come già detto, a differenza di un layer convoluzionale non c’è lo zero-padding. Ciò non vuol dire che non si possa usare, solo che non è pratica comune utilizzarlo in questo tipo di layer in quanto in generale non apporta alcun miglioramento in questo caso. Rispetto ad un ReLU layer, un pooling layer possiede alcuni parametri setta-bili, ma non possiede però alcun parametro allenabile, a differenza di un layer convoluzionale: infatti, una volta settati i parametri, si procede con l’appli-cazione di una funzione fissa. Per questo, esattamente come un layer ReLU, un pooling layer svolge le sue mansioni solo nelle fasi di forward propagation, mentre nelle fasi di backward propagation retropropaga gli errori e basta. Potrebbe sembrare che esistano svariate tipologie di pooling, in base a come vengono settati i relativi parametri. In realtà ne esistono fondamentalmente solo 3 di veramente utili, con alcuni casi particolari oltre ad essi:

1. MAX pooling con F=2 ed S=2

2. MAX pooling con F=3 ed S=2 (detto anche overlapping pooling) 3. AVE pooling con F pari al lato di un intero depth slice del volume di

input ed S=1 (detto anche average global pooling)

Innanzitutto, come si può notare, in un layer di pooling di norma il pa-rametro F non supera mai il valore di 3, in quanto considerare aree di input troppo grandi porterebbe ad una perdita di informazioni troppo elevata e quindi ad una conseguente diminuzione delle prestazioni della rete. Il terzo dei tre casi elencati è un caso speciale che è esente da questa regola e che verrà spiegato più avanti.

Per quanto riguarda il parametro S invece, esso normalmente può valere 1 o 2: innanzitutto perchè avere un valore di stride maggiore del lato della

selezione quadrata significherebbe perdere informazioni, dato che ogni volta alcuni dati della matrice di input non verrebbero considerati; si potrebbe teoricamente impostare F=3 ed S=3, ma nella pratica questo non viene mai fatto, probabilmente perchè considerando un’area più grande su cui effettuare il pooling è meglio avere un po’ di overlapping per non perdere anche qui troppe informazioni. Ci sono casi speciali comunque, come ad esempio F=3 ed S=1 ma in questo modo si rischia di avere troppo overlapping. Si può in ogni caso applicare comunque una scelta di questo genere: è il caso ad esempio di GoogLeNet [18], dove però vi sono delle condizioni particolari riguardanti l’architettura della rete che si vedranno più avanti. Il caso F=1 ed S=1 invece non ha senso perchè vorrebbe dire che sostanzialmente si lascia completamente inalterato il volume di input: tanto vale non applicare il pooling a questo punto.

Detto questo, nel primo dei tre casi, si ha sostanzialmente un MAX poo-ling senza overlapping fra le aree selezionate dell’input, e che complessiva-mente va a dimezzare le dimensioni spaziali dei vari depth slice. Le reti VGG [19] utilizzano esclusivamente questa tecnica.

Nel secondo caso invece si ha invece un MAX pooling con overlapping. Negli ultimi anni si è visto che questa tecnica pare leggermente più efficiente rispetto al primo caso, come sostiene Alex Krizhevsky et. al. [16], uno dei primi ad utilizzare questa tecnica di pooling. Anche la rete NIN [17] ed in generale GoogLeNet [18] utilizzano la stessa tecnica.

Come preannunciato, l’ultimo caso di pooling è molto particolare: l’ave-rage global pooling viene utilizzato solo ed esclusivamente come ultimo layer prima del layer di output, cioè della classificazione finale. L’area di input su cui agisce comprende un intero depth slice, in quanto per allora si dovrà avere un volume avente una profondità pari al numero di classi che si voglio-no distinguere, cioè il numero di depth slice del volume deve essere uguale al numero di classi. Ad ogni modo si vedrà più dettagliatamente la funzione di questo tipo di pooling nel capitolo 5, quando verranno presentate le varie reti utilizzate. Per ora è sufficiente sapere che esiste anche questo tipo di pooling e che è stato utilizzato per la prima volta nella rete NIN [17] ed è stato successivamente utilizzato anche da GoogLeNet [18].