Sto giocando un po 'con le convnet. In particolare, sto usando il set di dati Kaggle Gatti contro cani che consiste in 25000 immagini etichettate come gatto o cane (12500 ciascuna).
Sono riuscito a raggiungere un'accuratezza della classificazione dell'85% circa sul mio set di test, tuttavia ho fissato un obiettivo per ottenere un'accuratezza del 90%.
Il mio problema principale è l'adattamento eccessivo. In qualche modo finisce sempre per succedere (normalmente dopo l'8-10). L'architettura della mia rete è liberamente ispirata a VGG-16, in particolare le mie immagini vengono ridimensionate a , quindi eseguo:
Convolution 1 128x128x32 (kernel size is 3, strides is 1)
Convolution 2 128x128x32 (kernel size is 3, strides is 1)
Max pool 1 64x64x32 (kernel size is 2, strides is 2)
Convolution 3 64x64x64 (kernel size is 3, strides is 1)
Convolution 4 64x64x64 (kernel size is 3, strides is 1)
Max pool 2 32x32x64 (kernel size is 2, strides is 2)
Convolution 5 16x16x128 (kernel size is 3, strides is 1)
Convolution 6 16x16x128 (kernel size is 3, strides is 1)
Max pool 3 8x8x128 (kernel size is 2, strides is 2)
Convolution 7 8x8x256 (kernel size is 3, strides is 1)
Max pool 4 4x4x256 (kernel size is 2, strides is 2)
Convolution 8 4x4x512 (kernel size is 3, strides is 1)
Fully connected layer 1024 (dropout 0.5)
Fully connected layer 1024 (dropout 0.5)
Tutti i livelli eccetto l'ultimo hanno relus come funzioni di attivazione.
Nota che ho provato diverse combinazioni di convoluzioni (ho iniziato con convoluzioni più semplici).
Inoltre, ho aumentato il set di dati rispecchiando le immagini, in modo da avere in totale 50000 immagini.
Inoltre, sto normalizzando le immagini usando la normalizzazione minima massima, dove X è l'immagine
Il codice è scritto in tensorflow e le dimensioni del lotto sono 128.
I mini-batch di dati di allenamento finiscono per sovrautilizzare e avere una precisione del 100% mentre i dati di validazione sembrano smettere di apprendere all'84-85% circa.
Ho anche provato ad aumentare / diminuire il tasso di abbandono.
L'ottimizzatore utilizzato è AdamOptimizer con un tasso di apprendimento di 0,0001
Al momento ho giocato a questo problema nelle ultime 3 settimane e l'85% sembra aver fissato una barriera davanti a me.
Per la cronaca, so che potrei usare l'apprendimento di trasferimento per ottenere risultati molto più alti, ma sono interessante costruire questa rete come esperienza di autoapprendimento.
Aggiornare:
Sto gestendo la rete SAME con una dimensione batch diversa, in questo caso sto utilizzando una dimensione batch molto più piccola (16 invece di 128) e sto raggiungendo una precisione dell'87,5% (invece dell'85%). Detto questo, la rete finisce comunque con un overfitting. Ancora non capisco come un abbandono del 50% delle unità non sia d'aiuto ... ovviamente sto facendo qualcosa di sbagliato qui. Qualche idea?
Aggiornamento 2:
Sembra che il problema abbia a che fare con la dimensione del lotto, come con una dimensione più piccola (16 invece di 128) Sto raggiungendo ora un'accuratezza del 92,8% sul mio set di test, con le dimensioni del lotto più piccole che la rete si adatta ancora (i mini lotti finiscono con un'accuratezza del 100%), tuttavia, la perdita (errore) continua a diminuire ed è generalmente più stabile. I contro sono molto più lenti, ma vale la pena aspettare.