Pourquoi normaliser les images en soustrayant la moyenne image du jeu de données, au lieu de la moyenne actuelle de l’apprentissage en profondeur?

88

Il existe quelques variantes sur la façon de normaliser les images, mais la plupart semblent utiliser ces deux méthodes:

  1. Soustrayez la moyenne par canal calculée pour toutes les images (par exemple, VGG_ILSVRC_16_layers )
  2. Soustrayez par pixel / canal calculé sur toutes les images (par exemple, CNN_S , voir aussi le réseau de référence de Caffe )

L’approche naturelle consisterait à normaliser chaque image. Une image prise en plein jour provoquera le déclenchement de plus de neurones qu'une image de nuit et, bien qu'elle puisse nous informer de l'heure à laquelle nous nous soucions généralement des caractéristiques plus intéressantes présentes sur les bords, etc.

Pierre Sermanet fait référence dans 3.3.3 à cette normalisation de contraste locale qui serait basée sur une image, mais je ne l’ai pas trouvé dans les exemples / tutoriels que j’ai vus. J'ai également vu une question intéressante sur Quora et le message de Xiu-Shen Wei, mais ils ne semblent pas soutenir les deux approches ci-dessus.

Qu'est-ce qui me manque exactement? S'agit-il d'un problème de normalisation des couleurs ou existe-t-il un document qui explique réellement pourquoi tant de gens utilisent cette approche?

Max Gordon
la source
Je ne connais pas la réponse, mais avez-vous essayé chacune des méthodes? Y a-t-il une différence dans les performances?
user112758
@ user112758 - leur mise en œuvre est un peu pénible (en particulier pour le pixel par pixel) et mon expérience est que la normalisation par image fonctionne bien, mais que mes données ne sont pas représentatives. Je vais essayer d’expérimenter la normalisation, mais je suis curieux d’entendre la motivation derrière ces étranges procédures de normalisation (dans mon esprit).
Max Gordon
Ok, vous pouvez peut-être poser cette question dans les problèmes GitHub du groupe Google Caffe. Je suppose qu'il y aurait plus d'experts sur ce sujet.
user112758

Réponses:

58

La soustraction de la moyenne du jeu de données sert à "centrer" les données. De plus, vous souhaitez idéalement diviser par le nombre d'éléments de cette caractéristique ou de ce pixel si vous souhaitez normaliser chaque valeur de fonctionnalité en z-score.

La raison pour laquelle nous faisons ces deux choses est parce que dans le processus de formation de notre réseau, nous allons multiplier (poids) et ajouter à (biais) ces entrées initiales afin de provoquer des activations que nous avons ensuite contre-projetées avec les gradients à former le modèle.

Dans ce processus, nous aimerions que chaque fonctionnalité ait une plage similaire afin que nos gradients ne deviennent pas incontrôlables (et que nous n’ayons besoin que d’un multiplicateur de taux d’apprentissage global).

Une autre façon de penser est que les réseaux d’apprentissage en profondeur partagent traditionnellement de nombreux paramètres. Si vous n’effectuiez pas une mise à l’échelle de vos entrées de manière à obtenir des valeurs d’entité similaires (c.-à-d.: Sur l’ensemble du jeu de données en soustrayant la moyenne), le partage ne serait pas Cela se produit très facilement, car pour une partie de l’image, le poids west trop élevé et pour une autre, il est trop petit.

Vous verrez dans certains modèles de CNN que le blanchiment par image est utilisé, ce qui correspond davantage à votre réflexion.

lollercoaster
la source
4
Merci pour la réponse. Je connais bien le concept consistant à centrer les données et à vérifier que la plage est similaire afin d'obtenir des gradients stables. La question est plutôt de savoir pourquoi nous devons le faire sur l’ensemble du jeu de données et pourquoi cela aiderait par opposition au blanchiment par image. Je voudrais une référence simple qui montre en quelque sorte que cela améliore l'apprentissage avant d'accepter la réponse. Je sais que la normalisation par lots est une technique incroyablement puissante, mais je ne vois pas le lien avec la normalisation de l'ensemble de données.
Max Gordon
Si vous acceptez la normalisation par lots, c'est bien, vous y êtes déjà. La seule raison pour laquelle vous normalisez les lots, c'est lorsque vous ne pouvez pas stocker l'ensemble de données complet en mémoire ou que vous distribuez la formation (souvent le même problème). C'est pourquoi nous avons des lots.
lollercoaster
Je pensais que les lots sont également à la base de la descente de gradient stochastique. Même si je pouvais tout mettre en mémoire, je souhaite mettre à jour les paramètres plus souvent qu'après chaque époque.
Max Gordon
3
Elles sont. Et vous pouvez mettre à jour aussi souvent que vous le souhaitez - les implications analytiques sont identiques, ce qui est si agréable et évolutif pour la descente de gradient. La raison pour laquelle nous utilisons la descente de gradient stochastique (ordre de saisie aléatoire + traitement par lots) est de lisser la pente dans l’espace de gradient. Étant donné un seul point, nous ne pouvons vraiment pas être certains que notre mise à jour nous poussera dans la direction des maxima locaux. Toutefois, si vous sélectionnez suffisamment de points, cette probabilité devient plus élevée (dans l’attente).
lollercoaster
2
Comment cela aide-t-il à intégrer des fonctionnalités dans une gamme similaire? Si j’ai deux images, l’une allant de 0 à 255 et l’autre allant de 0 à 50 en pixels, disons avec une moyenne de 50 et stdev de 15. La normalisation me donne l’image 1 allant de -3,3 à 13,6 et l’image 2 allant de -3,3 à 0. Ils ne sont toujours pas à la même échelle.
Daniel
9

Avant la normalisation des lots, une soustraction moyenne par canal était utilisée pour centrer les données autour de la moyenne zéro pour chaque canal (R, G, B). Cela aide généralement le réseau à apprendre plus rapidement car les gradients agissent de manière uniforme pour chaque canal. Je suppose que si vous utilisez la normalisation par lots, l’étape de prétraitement de la soustraction moyenne par canal n’est pas vraiment nécessaire puisque vous normalisez de toute façon par mini-lot.

Sid M
la source
1
"Je suppose que si vous utilisez la normalisation par lots, l'étape de pré-traitement par soustraction moyenne par canal n'est pas vraiment nécessaire car vous normalisez de toute façon par mini-lot." Mais la norme de lot se réfère à la normalisation des poids dans les couches de votre réseau ... pas les images d'entrée réelles. Ce sont 2 choses différentes.
Monica Heddneck le
4

La normalisation par image est courante et constitue même la seule fonction intégrée actuellement dans Tensorflow (principalement en raison de sa très grande facilité de mise en œuvre). Il est utilisé pour la raison exacte que vous avez mentionnée (jour contre nuit pour la même image). Cependant, si vous imaginez un scénario plus idéal dans lequel l'éclairage était contrôlé, les différences relatives entre chaque image auraient une grande valeur dans l'algorithme, et nous ne voudrions pas les effacer avec une normalisation par image (et nous voudrions normalisation dans le contexte de l’ensemble du jeu de données d’entraînement).

JPJ
la source
4

Ceci s'appelle le prétraitement des données avant de les utiliser. Vous pouvez traiter de nombreuses manières, mais il existe une condition selon laquelle vous devez traiter chaque donnée avec la même fonction X_preproc = f (X). Cette f (.) Ne doit pas dépendre des données elles-mêmes. Par conséquent, si vous utilisez l'image actuelle, vous devez traiter cette l’image actuelle, alors votre f (X) sera réellement f (X, image) et vous ne le voulez pas.

La normalisation du contraste d'image dont vous parliez a un but différent. La normalisation du contraste de l'image aidera dans la fonction.

Mais f (.) Ci-dessus aidera à l'optimisation en gardant toutes les caractéristiques numériquement égales les unes aux autres (bien sûr environ)

Hacklavya
la source