2

Je lis Neural Networks and Deep Learning (les deux premiers chapitres), et j'essaie de suivre et de construire mon propre ANN pour classer les chiffres de l'ensemble de données MNIST. J'ai commencé à me gratter la tête depuis plusieurs jours, car ma mise en œuvre atteint une précision d'environ 57% lors de la classification des chiffres de l'ensemble de test (environ 5734/10000) après 10 époques (la précision de l'ensemble stagne après la dixième époque, et la précision de l'ensemble de tests se détériore vraisemblablement en raison d'un ajustement excessif). J'utilise à peu près la même configuration que dans le livre: ANNforge à deux couches ANN (784-30-10) avec toutes les couches entièrement connectées; fonctions d'activation sigmoïde standard; fonction de coût quadratique; Les seules différences sont que j'utilise une formation en ligne au lieu d'une formation par lots/mini-batch et un taux d'apprentissage de 1,0 au lieu de 3,0 (Cependant, ma mise en œuvre ne passe pas le percentile de 60% après un tas d'époques où, comme dans le livre, le ANN dépasse 90% juste après le première époque avec à peu près la même configuration exacte. Au début, je foiré la mise en œuvre de l'algorithme de rétropropagation, mais après réimplémentant rétropropagation différemment trois fois, avec les exactement les mêmes résultats dans chaque reimplementation, je suis déconcerté ...MNIST - Formation coincé

Un exemple des résultats de l'algorithme de rétropropagation est produisant:

Avec un réseau feedforward plus simple avec la même configuration mentionnée ci-dessus (formation en ligne + taux d'apprentissage de 1,0): 3 neurones d'entrée, 2 neurones cachés et 1 neurone de sortie.

Les poids initiaux sont initialisés comme suit:

Layer #0 (3 neurons) 

Layer #1 (2 neurons) 
    - Neuron #1: weights=[0.1, 0.15, 0.2] bias=0.25 
    - Neuron #2: weights=[0.3, 0.35, 0.4] bias=0.45 

Layer #2 (1 neuron) 
    - Neuron #1: weights=[0.5, 0.55] bias=0.6 

Compte tenu d'une entrée de [0,0, 0,5, 1,0], la sortie est 0,78900331. Backpropagating pour la même entrée et à la sortie souhaitée de 1,0 donne les dérivées partielles suivantes (dw = dérivé poids wrt, db = dérivé polarisation wrt):

Layer #0 (3 neurons) 

Layer #1 (2 neurons) 
    - Neuron #1: dw=[0, 0.0066968054, 0.013393611] db=0.013393611 
    - Neuron #2: dw=[0, 0.0061298212, 0.012259642] db=0.012259642 

Layer #2 (1 neuron) 
    - Neuron #1: dw=[0.072069918, 0.084415339] db=0.11470326 

Mise à jour du réseau avec les dérivées partielles donne un rendement corrigé valeur de 0,74862305.


Si quelqu'un serait assez aimable pour confirmer les résultats ci-dessus, il me aiderait énormément comme je l'ai à peu près Exclue rétropropagation défectueuses comme la raison du problème. Est-ce que quelqu'un qui s'est attaqué au problème MNIST a déjà rencontré ce problème? Même des suggestions pour les choses que je devrais vérifier aideraient puisque je suis vraiment perdu ici.

Répondre

3

Doh ..

Turns out n'y avait rien de mal à ma mise en œuvre de rétropropagation ...

Le problème était que je lis les images dans un tableau signed char (en C++), et les valeurs de pixel débordait , de sorte que lorsque j'ai divisé par 255.0 pour normaliser les vecteurs d'entrée dans la gamme de 0.0-1.0, j'ai effectivement eu des valeurs négatives ...; -; Donc, en gros, j'ai passé quatre jours à déboguer et réimplémenter la même chose quand le problème était entièrement ailleurs.