2017-12-19 4 views
0

Ich habe versucht, ein neuronales Netzwerk ohne versteckte Schicht zu implementieren, um mit dem MNIST-Dataset zu hacken.Was ist falsch an der Implementierung meines Backpropagation-Algorithmus?

Ich verwendete Sigmoid als Aktivierungsfunktion und Cross-Entropie als Verlustfunktion.

Zur Vereinfachung habe ich im Netzwerk keine versteckte Ebene, nur Eingabe und Ausgabe.

Dies ist der Teil meiner Implementierung von Backpropagation-Algorithmus, aber es nicht wie erwartet funktionieren. Das Absenken der Verlustfunktion ist extrem langsam (ich habe versucht, die Lernrate von 0,001 auf 1 zu variieren), und die Genauigkeit wird nie größer als 0,1.

Die Ausgabe ist wie folgt aus:

# 0 loss: 279788.368245 acc: 0.0903333333333 
# 1 loss: 279788.355211 acc: 0.09035 
# 2 loss: 279788.350629 acc: 0.09035 
# 3 loss: 279788.348228 acc: 0.09035 
# 4 loss: 279788.346736 acc: 0.09035 
# 5 loss: 279788.345715 acc: 0.09035 
# 6 loss: 279788.344969 acc: 0.09035 
# 7 loss: 279788.3444 acc: 0.09035 
# 8 loss: 279788.343951 acc: 0.09035 
# 9 loss: 279788.343587 acc: 0.09035 
# 10 loss: 279788.343286 acc: 0.09035 
# 11 loss: 279788.343033 acc: 0.09035 

Antwort

0

Von dem, was ich hier sehe, gibt es einige mögliche Faktoren, die diese von der Arbeit verhindern.

Zuerst müssen Sie Ihre Gewichte und Verzerrungen zufällig initialisieren. Von dem, was ich sehe, versuchen Sie einen Wert zu ändern, der noch keinen greifbaren Wert hat (zB: w1 = 0).

Zweitens ist Ihr Optimierer nicht für den MNIST-Datensatz geeignet. Der Optimierer ändert die Werte basierend auf der Backpropagation. Daher ist es sehr wichtig, dass Sie den richtigen Optimierer auswählen. Gradient Descent eignet sich besser für diesen Datensatz und von dem, was ich sehen kann, verwenden Sie nicht Gradient Descent. Wenn Sie versuchen, mit Ihrem Code einen Gradientenabstiegsoptimierer zu erstellen, machen Sie höchstwahrscheinlich einen Fehler. Gradient Descent beinhaltet partielle Ableitungen der SSE (Sum of Squared Error), die ich in diesem Code nicht sehe.

Wenn Sie mit dem Gradienten-Optimierer gehen möchten, müssen Sie neben der Mathematik hinter Gradient Descent einige Änderungen an Ihrem Code vornehmen. Sie müssen die ReLU-Aktivierungsfunktion (die ich Ihnen ohnehin vorschlage) anstelle der Sigmoid-Funktion verwenden. Dadurch wird sichergestellt, dass das Problem des verschwindenden Farbverlaufs nicht auftritt. Außerdem sollten Sie Ihre Verlustfunktion zum reduzierten Mittelwert der Kreuzentropie machen. Der Optimierer wird auf diese Weise viel effektiver sein.

Hoffe, das hilft.

Verwandte Themen