Perché dobbiamo normalizzare le immagini prima di metterle nella CNN?


Risposte:


34

Prima nota: dovresti davvero dividere anche per la deviazione standard di ogni valore di funzione (pixel). Sottrarre la media centra l'input su 0 e dividendo per la deviazione standard si fa in modo che qualsiasi valore in scala riduca il numero di deviazioni standard alla media.

Per rispondere alla tua domanda: considera come una rete neurale apprende i suoi pesi. I C (NN) apprendono aggiungendo continuamente vettori di errore del gradiente (moltiplicati per una velocità di apprendimento) calcolati dalla backpropagation a varie matrici di peso in tutta la rete man mano che vengono passati esempi di allenamento.

La cosa da notare qui è il "moltiplicato per un tasso di apprendimento".

Se non ridimensionassimo i nostri vettori di formazione di input, gli intervalli delle nostre distribuzioni di valori di funzionalità sarebbero probabilmente diversi per ciascuna funzionalità, e quindi il tasso di apprendimento causerebbe correzioni in ogni dimensione che differirebbero (in termini proporzionali) l'una dall'altra. Potremmo compensare eccessivamente una correzione in una dimensione di peso mentre compensiamo in un'altra.

Questo non è l'ideale in quanto potremmo trovarci in uno stato oscillante (incapace di centrare su un massimo dei massimi nello spazio di costo (pesi)) o in uno stato a movimento lento (viaggiando troppo lentamente per arrivare a un massimo migliore).

È ovviamente possibile avere un tasso di apprendimento per peso, ma è ancora più iperparametro introdurre in una rete già complicata che dovremmo anche ottimizzare per trovare. In genere i tassi di apprendimento sono scalari.

Quindi proviamo a normalizzare le immagini prima di usarle come input nell'algoritmo NN (o qualsiasi gradiente basato).


1
che dire delle immagini a colori? lo faccio per ogni canale di colore? non rovinerebbe la distribuzione del colore?
user10024395,

2
Credi che dovresti sì. Puoi semplicemente fare qualcosa del tipo:(image - image.mean()) / (image.std() + 1e-8)
John Allen,

È davvero utile per l'allenamento? Sto addestrando il rilevatore di oggetti e, usando questi installatori, le immagini sono davvero confuse, è difficile vedere gli oggetti che sto rilevando
Darlyn,

È abbastanza utile per l'addestramento in termini di apprendibilità e precisione - non è per te, è per il modello :) Potresti voler produrre un'immagine non normalizzata durante il debug in modo che appaia normale ai tuoi occhi umani.
sottobicchiere
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.