2016-10-14 5 views
8

Vielleicht zu allgemein eine Frage, aber kann jemand erklären, was würde eine Convolutional Neural Network zu divergieren führen?Tensorflow Nan Verlust Gründe

Besonderheiten:

ich mit einigen meiner eigenen Daten Tensorflow des iris_training Modell bin mit und halten

ERROR:tensorflow:Model diverged with loss = NaN.

Traceback...

tensorflow.contrib.learn.python.learn.monitors.NanLossDuringTrainingError: NaN loss during training.

Traceback mit Linie bekommen entstanden:

tf.contrib.learn.DNNClassifier(feature_columns=feature_columns, 
             hidden_units=[300, 300, 300], 
             #optimizer=tf.train.ProximalAdagradOptimizer(learning_rate=0.001, l1_regularization_strength=0.00001),               
             n_classes=11, 
             model_dir="/tmp/iris_model") 

Ich habe versucht Einstellung der Optimierer, der eine Null für die Lernrate verwendet und keinen Optimierer verwendet. Irgendwelche Einblicke in Netzwerkschichten, Datengröße usw. werden geschätzt.

+1

Es ist eine natürliche Eigenschaft der stochastischen Gradientenabstieg, wenn die Lernrate zu groß ist, kann SGD ins Unendliche abweichen –

+0

@YaroslavBulatov Ich habe mit diesem AdagradOptiizer mit einer Lernrate von etwa 1E-15 versucht. Vielleicht sind meine Daten nicht für SGD geeignet, können Sie einen anderen Algorithmus vorschlagen? Noch neu bei Tensorflow und Deep Learning. – Zroach

Antwort

22

Es gibt viele Dinge, die ich gesehen habe, ein Modell zu 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 DNNClassifier, aber ich vermute, es verwendet die kategorische Kreuz Entropie Kostenfunktion. 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, z. B. Division durch Null, wobei das Hinzufügen des Epsilons hilfreich sein 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 der Fall bei dem DNNC-Klassifikator ist.

4) Möglicherweise haben Sie ein Problem mit den Eingabedaten. Versuchen Sie, assert not np.any(np.isnan(x)) auf den Eingabedaten aufzurufen, um sicherzustellen, dass Sie das Nan 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 Bezeichnungen müssen im Bereich der Verlustfunktion liegen, wenn also eine logarithmische Verlustfunktion verwendet wird, müssen alle Markierungen größer als 0 sein (wie von evan pu und den Kommentaren unten angegeben).

+0

danke für den zusammenbruch. Mein Problem war, dass meine Labels symmetrisch um Null waren (d. H. [-5, ..., 5]). Das Verschieben hat das Problem gelöst. – Zroach

+1

Die Labels sollten binär sein. 1 oder 0. Andernfalls wäre die kategorische Kreuz-Entropie-Kostenfunktion nicht sinnvoll. – chasep255

+0

Meinst du in binär dargestellt [000, ..., 110]? Ich verstehe, was Sie mit der Cross-Entropie-Funktion meinen, aber ich denke, es hängt von der Implementierung ab. Ich habe zu diesem Zeitpunkt keine Probleme mit Labels von 0 bis 10, zumindest nicht mit Divergenz. Dies ist kein Computer-Vision-Modell, sondern ähnelt cifar-10 insofern, als es viele sich gegenseitig ausschließende Bezeichnungen gibt. – Zroach

1

Wenn ganze Zahlen als Ziele verwendet wird, stellt sicher, dass sie nicht symmetrisch sind auf 0.

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

2

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

Da log (0) negativ unendlich, wenn Ihr Modell die Ausgangsverteilung genug trainiert wird sehr verzerrt sein, zum Beispiel sagen, ich bin ein 4-Klasse Ausgang zu tun, in der Anfang meiner Wahrscheinlichkeit wie

sieht
0.25 0.25 0.25 0.25 

aber gegen Ende wird die Wahrscheinlichkeit, wahrscheinlich

1.0 0 0 0 

Und Sie nehmen eine Kreuzentropie dieser Verteilung alles explodiert aussehen. Die Lösung besteht darin, künstlich eine kleine Zahl zu allen Begriffen hinzuzufügen, um dies zu verhindern.

Verwandte Themen