Ich versuche, neuronale Netze in Python erneut zu implementieren. Ich habe die Kostenfunktion und den Backpropagation-Algorithmus korrekt implementiert. Ich habe sie überprüft, indem ich den entsprechenden Octave-Code ausgeführt habe.
Wenn ich jedoch versuche, die scipy.optimize.fmin_cg
Funktion zu verwenden, dauert die Ausführung der Iterationen sehr lange. Es wird mit einer Warnung beendet und gibt mir einen Fehler, der besagt, dass die "gewünschte Fehlerrate nicht erreicht wurde".
Das gleiche Programm in Octave wird einwandfrei ausgeführt. Es ist jedoch eine eigene fmincg
Funktion definiert.
Was mache ich falsch?
Antworten:
Verwenden Sie als zukünftigen Hinweis das doppelte Fragezeichen? So ziehen Sie die Quelle der Funktion:
Wenn Sie sich die Scipy-Quellen ansehen, wird diese Fehlermeldung angezeigt, wenn der interne Parameter alpha_k Null oder Keine ist.
Dieser Wert ist wiederum an den internen Wolfe Line-Suchalgorithmus gebunden. Insbesondere wird es aufgerufen, wenn die Suche entlang der Suchbahn keinen besseren Wert findet. Ihre Funktion hat wahrscheinlich irgendwo eine lineare Kontur, in die der Optimierer fällt und die verwirrt wird.
Versuchen Sie vielleicht, einen Rückruf hinzuzufügen, und sehen Sie, wo die fehlgeschlagene Suche generiert wird.
quelle
Ich gehe davon aus, dass Sie den
fprime
Parameter nicht angegeben haben . Wenn Sie diesen Parameter nicht angeben,fmin_cg
muss er seine eigene Lösung herausfinden, was normalerweise viel langsamer ist als die von ihm bereitgestellte optimale Lösung. Ihr Code könnte folgendermaßen aussehen:quelle
Ich weiß, dass dies eine alte Frage ist, aber ich hatte gerade mit einem ähnlichen Problem zu kämpfen und dachte, ich würde meine Lösung veröffentlichen, falls jemand anderes darauf stößt.
Ich fand das Problem, dass ich den Vektor nicht richtig initialisiert hatte , um die Symmetrie zu brechen.Θ
Danach lief ich
fmin_cg
mit f und fprime, und obwohl es immer noch ziemlich langsam lief, tat es dies ohne die Fehler oder Warnungen, die ich bis zu diesem Zeitpunkt gesehen hatte.Tatsächlich hat es die Kostenfunktion besser minimiert als die Matlab-Implementierung, obwohl beide dies getan haben
max_iters = 100
.quelle