web-dev-qa-db-fra.com

Prévention du surajustement dans les couches convolutives d'un CNN

J'utilise TensorFlow pour former un réseau neuronal convolutionnel (CNN) pour une application en langue des signes. Le CNN doit classer 27 étiquettes différentes, donc sans surprise, un problème majeur a été de s'attaquer au sur-ajustement. J'ai pris plusieurs mesures pour y parvenir:

  1. J'ai collecté une grande quantité de données d'entraînement de haute qualité (plus de 5000 échantillons par étiquette).
  2. J'ai construit une étape de prétraitement raisonnablement sophistiquée pour aider à maximiser l'invariance à des choses comme les conditions d'éclairage.
  3. J'utilise l'abandon sur les couches entièrement connectées.
  4. J'applique la régularisation L2 aux paramètres entièrement connectés.
  5. J'ai fait une optimisation hyperparamétrique approfondie (dans la mesure du possible compte tenu des limitations matérielles et temporelles) pour identifier le modèle le plus simple qui peut atteindre près de 0% de perte sur les données d'entraînement.

Malheureusement, même après toutes ces étapes, je constate que je ne peux pas obtenir beaucoup mieux qu'une erreur de test d'environ 3%. (Ce n'est pas terrible, mais pour que l'application soit viable, je devrai l'améliorer considérablement.)

Je soupçonne que la source du sur-ajustement réside dans les couches convolutives car je ne prends aucune mesure explicite pour régulariser (en plus de garder les couches aussi petites que possible). Mais sur la base des exemples fournis avec TensorFlow, il ne semble pas que la régularisation ou l'abandon soit généralement appliqué aux couches convolutives.

La seule approche que j'ai trouvée en ligne qui traite explicitement de la prévention du sur-ajustement dans les couches convolutives est une approche assez nouvelle appelée Stochastic Pooling . Malheureusement, il semble qu'il n'y ait aucune implémentation pour cela dans TensorFlow, du moins pas encore.

Donc, en bref, existe-t-il une approche recommandée pour empêcher le sur-ajustement dans les couches convolutives qui peut être réalisé dans TensorFlow? Ou sera-t-il nécessaire de créer un opérateur de regroupement personnalisé pour prendre en charge l'approche de regroupement stochastique?

Merci pour tout conseil!

13
Aenimated1

Comment puis-je lutter contre le sur-ajustement?

  • Obtenez plus de données (ou augmentation de données)
  • Abandon (voir papier , explication , abandon pour cnns )
  • DropConnect
  • Régularisation (voir ma thèse de maîtrise , page 85 pour des exemples)
  • Découpage à l'échelle des fonctionnalités
  • Mise en commun moyenne mondiale
  • Rendre le réseau plus petit
  • Arrêt précoce

Comment puis-je améliorer mon CNN?

Thoma, Martin. " Analyse et optimisation des architectures de réseaux de neurones convolutionnels ." arXiv preprint arXiv: 1707.09725 (2017).

Voir le chapitre 2.5 pour les techniques d'analyse. Comme indiqué au début de ce chapitre, vous pouvez généralement effectuer les opérations suivantes:

  • (I1) Changer la définition du problème (par exemple, les classes à distinguer)
  • (I2) Obtenez plus de données d'entraînement
  • (I3) Nettoyer les données d'entraînement
  • (I4) Modifier le prétraitement (voir Annexe B.1)
  • (I5) Augmenter l'ensemble de données de formation (voir Annexe B.2)
  • (I6) Modifier la configuration de la formation (voir les annexes B.3 à B.5)
  • (I7) Changer le modèle (voir Annexes B.6 et B.7)

Divers

Le CNN doit classer 27 étiquettes différentes, donc sans surprise, un problème majeur a été de s'attaquer au sur-ajustement.

Je ne comprends pas comment cela est connecté. Vous pouvez avoir des centaines d'étiquettes sans problème de sur-ajustement.

15
Martin Thoma