Tensorflow Nan Verlust Gründe

13

Vielleicht eine zu allgemeine Frage, aber kann jemand erklären, was dazu führen würde, dass ein konvolutionelles neuronales Netzwerk auseinanderläuft?

Besonderheiten:

Ich verwende Tensorflow's iris_training Modell mit einigen meiner eigenen Daten und bekomme immer

  

FEHLER: Tensorflow: Modell divergierte mit Verlust = NaN.

     

Rückverfolgung ...

     

tensorflow.contrib.learn.python.learn.monitors.NanLossDuringTrainingError: NaN-Verlust während des Trainings.

Traceback stammt aus Zeile:

%Vor%

Ich habe versucht, den Optimierer anzupassen, indem ich eine Null für die Lernrate verwende und keinen Optimierer verwende. Irgendwelche Einblicke in Netzwerkschichten, Datengröße usw. werden geschätzt.

    
Zroach 14.10.2016, 19:07
quelle

3 Antworten

24

Es gibt viele Dinge, die ich gesehen habe, machen ein Modell divergieren.

1) Zu hohe Lernrate. Sie können oft sagen, ob dies der Fall ist, wenn der Verlust zu steigen beginnt und dann nach unendlich divergiert.

2) Ich bin nicht vertraut mit dem DNNC-Klassifikator, aber ich vermute, dass es die kategorische Kreuz-Entropie-Kostenfunktion verwendet. Dies beinhaltet das Nehmen des Logarithmus der Vorhersage, die divergiert, wenn die Vorhersage gegen Null geht. Aus diesem Grund addieren Leute normalerweise einen kleinen Epsilon-Wert zur Vorhersage, um diese Divergenz zu verhindern. Ich nehme an, dass der DNNClassifier das wahrscheinlich tut oder den Tensorflow opp dafür verwendet. Wahrscheinlich nicht das Problem.

3) Andere Probleme der numerischen Stabilität können auftreten, wie z. B. Division durch Null, wo das Hinzufügen des Epsilons helfen kann. Ein anderes, weniger auffälliges, wenn die Quadratwurzel, die eine Ableitung ist, divergieren kann, wenn sie nicht korrekt vereinfacht wird, wenn es sich um endliche Präzisionszahlen handelt. Wieder einmal bezweifle ich, dass dies das Problem beim DNNC-Klassifikator ist.

4) Möglicherweise haben Sie ein Problem mit den Eingabedaten. Versuchen Sie, assert not np.any(np.isnan(x)) für die Eingabedaten aufzurufen, um sicherzustellen, dass Sie die Nanotechnologie nicht einführen. Stellen Sie außerdem sicher, dass alle Zielwerte gültig sind. Stellen Sie abschließend sicher, dass die Daten ordnungsgemäß normalisiert sind. Wahrscheinlich möchten Sie die Pixel im Bereich [-1, 1] und nicht [0, 255] haben.

5) Die Labels müssen sich im Bereich der Verlustfunktion befinden. Wenn also eine logarithmische Verlustfunktion verwendet wird, müssen alle Labels größer als 0 sein (wie von evan pu und den Kommentaren unten angegeben).

    
chasep255 05.11.2016, 02:52
quelle
2

Wenn Sie für die Kreuzentropie trainieren, möchten Sie Ihrer Ausgangswahrscheinlichkeit eine kleine Zahl wie 1e-8 hinzufügen.

Da log (0) eine negative Unendlichkeit ist, wenn das Modell ausreichend trainiert ist, wird die Ausgabeverteilung sehr verzerrt sein, zum Beispiel wenn ich eine 4-Klassenausgabe mache, am Anfang sieht meine Wahrscheinlichkeit wie

aus %Vor%

aber gegen Ende wird die Wahrscheinlichkeit wahrscheinlich wie

aussehen %Vor%

Und Sie nehmen eine Kreuz-Entropie dieser Verteilung, alles wird explodieren. Die Lösung besteht darin, künstlich eine kleine Zahl zu allen Begriffen hinzuzufügen, um dies zu verhindern.

    
Evan Pu 27.07.2017 00:45
quelle
1

Wenn Sie Ganzzahlen als Ziele verwenden, stellen Sie sicher, dass sie nicht bei 0 symmetrisch sind.

Dh, verwenden Sie nicht die Klassen -1, 0, 1. Verwenden Sie stattdessen 0, 1, 2.

    
yper 14.07.2017 09:13
quelle