¿Por qué necesitamos normalizar las imágenes antes de ponerlas en CNN?

Respuestas:

34

Primera nota: también debería estar dividiendo entre la desviación estándar de cada valor de entidad (píxel). Restar la media centra la entrada en 0, y dividir por la desviación estándar hace que cualquier valor de entidad escalado sea el número de desviaciones estándar de la media.

Para responder a su pregunta: considere cómo una red neuronal aprende sus pesos. Los C (NN) aprenden agregando continuamente vectores de error de gradiente (multiplicados por una tasa de aprendizaje) calculados desde la retropropagación a varias matrices de peso en toda la red a medida que se pasan ejemplos de entrenamiento.

Lo que hay que notar aquí es el "multiplicado por una tasa de aprendizaje".

Si no escalamos nuestros vectores de entrenamiento de entrada, los rangos de nuestras distribuciones de valores de características probablemente serían diferentes para cada característica y, por lo tanto, la tasa de aprendizaje causaría correcciones en cada dimensión que serían diferentes (proporcionalmente hablando) entre sí. Podríamos estar sobrecompensando una corrección en una dimensión de peso mientras que sobrecompensa en otra.

Esto no es ideal, ya que podríamos encontrarnos en un estado oscilante (incapaz de centrarnos en un máximo máximo en el espacio de costos (pesos)) o en un estado de movimiento lento (viajar demasiado lento para llegar a un máximo máximo).

Por supuesto, es posible tener una tasa de aprendizaje por peso, pero aún hay más hiperparámetros para introducir en una red ya complicada que también tendríamos que optimizar para encontrar. Generalmente las tasas de aprendizaje son escalares.

Por lo tanto, tratamos de normalizar las imágenes antes de usarlas como entrada en el algoritmo NN (o cualquier gradiente basado).

montaña rusa
fuente
1
¿Qué pasa con las imágenes en color? ¿Lo hago para cada canal de color? ¿No estropearía eso la distribución del color?
user10024395
2
Cree que se supone que debes decir sí. Puedes hacer algo como:(image - image.mean()) / (image.std() + 1e-8)
JohnAllen
¿Es esto realmente útil para el entrenamiento? Estoy entrenando el detector de objetos, y usando estos adaptadores, las imágenes son realmente confusas, es difícil ver los objetos que estoy detectando
Darlyn
Es bastante útil para la capacitación en términos de capacidad de aprendizaje y precisión: no es para usted, es para el modelo :) Es posible que desee generar la imagen no normalizada cuando está depurando para que parezca normal a los ojos humanos.
lollercoaster