Perché normalizzare le immagini sottraendo la media dell'immagine del set di dati, anziché la media dell'immagine attuale nell'apprendimento profondo?


88

Esistono alcune varianti su come normalizzare le immagini ma la maggior parte sembra utilizzare questi due metodi:

  1. Sottrai la media per canale calcolata su tutte le immagini (ad es. VGG_ILSVRC_16_layers )
  2. Sottrai dal pixel / canale calcolato su tutte le immagini (es. CNN_S , vedi anche la rete di riferimento di Caffe )

Nella mia mente l'approccio naturale dovrebbe normalizzare ogni immagine. Un'immagine scattata in pieno giorno provocherà un maggior numero di neuroni rispetto a un'immagine notturna e mentre può darci informazioni sul tempo che di solito ci interessa delle caratteristiche più interessanti presenti nei bordi, ecc.

Pierre Sermanet fa riferimento in 3.3.3 che la normalizzazione del contrasto locale sarebbe basata sull'immagine ma non me ne sono imbattuto in nessuno degli esempi / tutorial che ho visto. Ho anche visto un'interessante domanda su Quora e il post di Xiu-Shen Wei, ma non sembrano supportare i due approcci di cui sopra.

Cosa mi manca esattamente? È un problema di normalizzazione del colore o esiste un documento che spiega in realtà perché così tanti usano questo approccio?


Non conosco la risposta, ma hai provato ciascuno dei metodi? C'è qualche differenza nelle esibizioni?
user112758

@ user112758 - implementarli è un po 'doloroso (specialmente per il by-pixel) e la mia esperienza è che la normalizzazione per immagine funziona bene ma i miei dati non sono così rappresentativi. Proverò a sperimentare la normalizzazione ma sono curioso di sentire la motivazione dietro queste (nella mia mente) strane procedure di normalizzazione.
Max Gordon,

Ok, forse puoi chiedere questo nei problemi di caffe Google gruppo caffe GitHub. Immagino che ci sarebbero più esperti su questo argomento.
user112758

Risposte:


58

Sottrarre la media del set di dati serve per "centrare" i dati. Inoltre, idealmente ti piacerebbe dividere per lo sttdev di quella caratteristica o pixel anche se vuoi normalizzare ogni valore di caratteristica su un punteggio z.

Il motivo per cui facciamo entrambe queste cose è perché nel processo di addestramento della nostra rete, moltiplicheremo (pesi) e aggiungeremo (tendenzialmente) questi input iniziali al fine di causare attivazioni che poi riproponiamo con i gradienti a allena il modello.

In questo processo vorremmo che ogni funzione avesse un intervallo simile in modo che i nostri gradienti non vadano fuori controllo (e che abbiamo bisogno solo di un moltiplicatore del tasso di apprendimento globale).

Un altro modo in cui puoi pensarci è che le reti di apprendimento profondo tradizionalmente condividono molti parametri - se non si ridimensionassero i tuoi input in un modo che portasse a valori di funzionalità simili (ad esempio: sull'intero set di dati sottraendo la media) la condivisione non sarebbe accade molto facilmente perché per una parte dell'immagine il peso wè molto e per un'altra è troppo piccolo.

Vedrai in alcuni modelli della CNN che viene utilizzato lo sbiancamento per immagine, che è più lungo le linee del tuo pensiero.


4
Grazie per la risposta. Conosco il concetto di centrare i dati e assicurarmi che l'intervallo sia simile per ottenere gradienti stabili. La domanda è di più sul perché dobbiamo farlo nell'intero set di dati e perché questo potrebbe aiutare in contrasto con lo sbiancamento per immagine? Vorrei un semplice riferimento che dimostri in qualche modo che questo migliora l'apprendimento prima di accettare la risposta. So che la normalizzazione batch è una tecnica incredibilmente potente ma non vedo la connessione all'intera normalizzazione del set di dati.
Max Gordon,

Se si accetta la normalizzazione batch è buona, allora ci sei già. L'unico motivo per cui si normalizza in batch è quando non è possibile adattare l'intero set di dati in memoria o si sta distribuendo la formazione (spesso lo stesso problema). Ecco perché abbiamo lotti.
lollercoaster,

Pensavo che i lotti fossero anche la base per la discesa gradiente stocastica. Anche se potessi inserire tutto nella memoria, voglio aggiornare i parametri più frequentemente che dopo ogni epoca.
Max Gordon,

3
Loro sono. E puoi aggiornare ogni volta che vuoi: le implicazioni analitiche sono identiche, ed è ciò che è così bello e scalabile nella discesa del gradiente. Il motivo per cui usiamo la discesa gradiente stocastica (ordine di immissione casuale + dosaggio) è di appianare la nostra salita in salita attraverso lo spazio del gradiente. Dato un singolo punto, non possiamo davvero essere sicuri che il nostro aggiornamento ci spingerà nella direzione dei massimi locali, tuttavia se selezioni abbastanza punti, questa probabilità diventa più alta (in previsione).
montagne russe

2
In che modo questo aiuta a ottenere funzionalità in un intervallo simile? Se ho due immagini, una che va da 0 a 255 e una che va da 0 a 50 in valori di pixel, diciamo con una media di 50 e stdev di 15. La normalizzazione mi dà l'immagine 1 che va da -3.3 a 13.6 e l'immagine 2 che va da Da -3.3 a 0. Non sono ancora nella stessa scala.
Daniel,

9

Prima della normalizzazione batch, è stata utilizzata la sottrazione media per canale per centrare i dati attorno alla media zero per ciascun canale (R, G, B). Questo in genere aiuta la rete ad apprendere più velocemente poiché i gradienti agiscono in modo uniforme per ciascun canale. Sospetto che se usi la normalizzazione batch, la fase di pre-elaborazione della sottrazione media per canale non è realmente necessaria poiché ti stai normalizzando comunque per mini-batch.


1
"Sospetto che se usi la normalizzazione batch, la fase di pre-elaborazione della sottrazione media per canale non è realmente necessaria poiché ti stai normalizzando comunque per mini-batch." Ma la norma batch si riferisce alla normalizzazione dei pesi negli strati della rete ... non alle immagini di input effettive. Queste sono 2 cose diverse.
Monica Heddneck,

4

La normalizzazione per immagine è comune ed è persino l'unica funzione integrata attualmente in Tensorflow (principalmente perché molto facile da implementare). È usato per il motivo esatto che hai citato (giorno VS notte per la stessa immagine). Tuttavia, se immagini uno scenario più ideale in cui l'illuminazione era controllata, le differenze relative tra ogni immagine sarebbero di grande valore nell'algoritmo e non vorremmo cancellarlo con la normalizzazione per immagine (e vorremmo fare normalizzazione nel contesto dell'intero set di dati di allenamento).


4

Questo si chiama preelaborazione dei dati prima di utilizzarli. È possibile elaborare in molti modi, ma esiste una condizione per cui è necessario elaborare ogni dato con la stessa funzione X_preproc = f (X) e questa f (.) Non dovrebbe dipendere dai dati stessi, quindi se si utilizza l'immagine corrente significa elaborare questo l'immagine attuale quindi la tua f (X) sarà effettivamente f (X, immagine) e non la vuoi.

La normalizzazione del contrasto dell'immagine di cui parlavi ha uno scopo diverso. La normalizzazione del contrasto dell'immagine aiuterà nella funzionalità.

Ma f (.) Sopra aiuterà l'ottimizzazione mantenendo tutte le caratteristiche numericamente uguali tra loro (ovviamente approssimativamente)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.