• Non ci sono risultati.

Il framework Caffe

4.3.3 Creazione formati LMDB

Fortunatamente, per creare dei dati con questo tipo di formato, Caffe fornisce uno script chiamato “crate_imagenet.sh”. Anche in questo caso, come per la mean subtraction, questo file era utilizzato per creare i dati in formato LMDB per il dataset ImageNet. Modificando opportunamente lo script si può tuttavia fare lo stesso su un qualsiasi proprio dataset. In figura 4.18 e 4.19 viene mostrato lo script originale dove vengono evidenziate le aree in cui apportare le modifiche.

La prima area da modificare riguarda i percorsi della cartella del training set e del validation set. La seconda area riguarda il resize: è bene setta-re a true il flag “RESIZE”, in modo che venga in automatico effettuato un ridimensionamento 256 x 256 di tutte le immagini. Le ultime due aree di modifica specificano i percorsi dei file di testo del training set e del validation set creati in precedenza e dove salvare i file di output .lmdb per ciascuno di essi. Una volta modificato il tutto secondo le specifiche, basta avviare lo script ed attendere i risultati; il processo potrebbe richiedere diversi minuti, a seconda di quante immagini si hanno nel dataset. Terminata l’elaborazione, i file .lmdb sono pronti per essere utilizzati da una qualsiasi rete avente un input layer di tipo Data, come mostrato in figura 4.20. Dalla stessa immagine si nota che nel campo source è sufficiente mettere il path della cartella che contiene i due file .lmdb.

4.4 I layer più comuni in Caffe

Per meglio comprendere le reti che verranno affrontate nei successivi capitoli, in questa sezione saranno mostrati i principali layer solitamente utilizzati con Caffe. Alcuni di questi layer sono già stati visti nello specifico nel capitolo precedente, come ad esempio il layer convoluzionale, e quindi in questo caso ci si limiterà a mostrarne la struttura su Caffe, senza spiegarne la funzione

Figura 4.19: Seconda parte script “create_imagenet.sh”

Figura 4.21: Esempio di layer convoluzionale con Caffe

che rimane esattamente la stessa. Verranno invece tralasciati i data layer, dato che sono già stati visti nel paragrafo 4.2.4 di questo capitolo.

4.4.1 Convolutional layer

Niente di nuovo in questo caso, a parte alcuni specifici parametri generali che Caffe utilizza, riguardanti non solo un layer convoluzionale e che fra poco verranno spiegati. In figura 4.21 ne viene mostrata la struttura su Caffe. Il layer convoluzionale risulta essere sicuramente il più complesso da definire su Caffe, per via di tutti i suoi parametri e del fatto che possiede anche una fase di backward propagation.

Il piccolo costrutto denotato con weight_filler serve per l’inizializzazione dei weight all’inizio dell’allenamento. Come era già stato detto nel paragrafo 2.2.2, è bene che i weight non siano tutti settati a 0, perchè questo vorreb-be dire che tutti i kernel (i filtri) apprenderebvorreb-bero le stesse informazioni; è meglio inizializzarli con valori molto prossimi allo 0, ma diversi fra loro. Nell’esempio i weight vengono inizializzati seguendo la distribuzione di una normale Gaussiana con media 0 e deviazione standard 0.01. Analoga fun-zione per quanto riguarda i bias (bias_filler ) che però possono invece essere settati tutti a 0 in maniera fissa. Il campo num_output rappresenta il nu-mero di kernel utilizzati, ovvero il parametro di depth K visto nel paragrafo

3.2.1 per il layer convoluzionale; kernel_size indica il lato del receptive field di ogni kernel.

I campi lr_mult e decay_mult, che si possono notare sempre in figura 4.21, sono invece una novità. Non sono parametri specifici di un layer convo-luzionale, ma bensì parametri per un qualunque layer che abbia una backward propagation, cioè che possegga dei parametri allenabili, anche se poi, come si vedrà meglio avanti, ciò ha effetti anche nelle forward propagation. Non sono nemmeno obbligatori, ma molto spesso aiutano a configurare ogni layer di questo tipo nella maniera che si vuole: intuitivamente essi fungono da fattore moltiplicativo per i parametri generali di learning rate, visto nel paragrafo 2.2.2 con la formula (2.4), e di weight decay, uno dei parametri presenti nella funzione di costo nella formula (2.3). Entrambi questi parametri sono già sta-ti presentasta-ti in precedenza e verranno comunque ripresi di nuovo anche nella sezione 4.5 di questo capitolo. Ad ogni modo, lo scopo dei campi menzionati è quello di poter regolare, settando opportuni valori per essi, il comporta-mento di un layer durante la sua backward propagation. Se ad esempio per un layer si settasse, sia per i weight che per i bias, un valore di lr_mult più grande rispetto a quello degli altri layer, ciò vorrebbe dire che quel layer avrà un learning rate più alto e quindi avrà un aggiornamento più incisivo dei propri parametri nella fase di backward propagation. Analoga cosa per quanto riguarda decay_mult : anch’esso permette di modificare la backward propagation di un layer, solo che in questo caso si avranno effetti sul calcolo dei gradienti, in quanto si avranno dei risultati diversi per la funzione di loss. Settare decay_mult a 0 significa annullare l’intero fattore di weight decay per il calcolo della loss di quel layer (il secondo fattore nella formula (2.3)) e quindi di avere risultati diversi nel calcolo dei gradienti della stessa funzio-ne di loss della formula (2.4). Come si può notare, non esiste una maniera specifica per dichiarare se, in questo contesto, ci si sta riferendo ai weight o ai bias. Semplicemente il primo costrutto param indica i weight, mentre il secondo indica i bias. Ovviamente questi campi, se utilizzati, riguardano solamente i layer aventi parametri allenabili.

4.4.2 ReLU layer

Qui non cambia praticamente nulla rispetto a quanto detto nel paragrafo 3.2.2. I ReLU layer sono i più utilizzati, non solo su Caffe, ma in generale per quanto riguarda le reti neurali convoluzionali negli ultimi anni, visto che risultano molto efficienti in termini di velocità computazionale, eseguendo co-munque bene la loro funzione di incremento di non linearità delle attivazioni. La figura 4.22 illustra un esempio di ReLU layer su Caffe.

Figura 4.22: Esempio di ReLU layer con Caffe

Figura 4.23: Esempio di Sigmoid layer con Caffe

Esattamente come specificato nel paragrafo 3.2.2, esistono altri tipi di funzioni diverse rispetto a quella che implementano i ReLU layer, potenzial-mente utilizzabili per lo stesso obbiettivo. Fra poco infatti se ne vedranno alcuni esempi.