web-dev-qa-db-ger.com

Deep-Learning Nan-Verlustgründe

Vielleicht eine zu allgemeine Frage, aber kann jemand erklären, was ein konvolutionäres neuronales Netzwerk zur Folge haben würde?

Besonderheiten:

Ich verwende das iris_training-Modell von Tensorflow mit einigen meiner eigenen Daten

FEHLER: Tensorfluss: Modell mit Verlust divergiert = NaN.

Zurück verfolgen...

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

Traceback entstand mit Zeile:

 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, den Optimierer anzupassen, eine Null für die Lernrate zu verwenden und keinen Optimierer zu verwenden. Jeder Einblick in Netzwerkschichten, Datengröße usw. wird geschätzt.

32
Zroach

Es gibt viele Dinge, die ich gesehen habe, um ein Modell voneinander zu unterscheiden.

  1. Zu hohe Lernrate. Sie können oft feststellen, ob dies der Fall ist, wenn der Verlust zuzunehmen beginnt und dann ins Unendliche divergiert. 

  2. Ich bin nicht mit dem DNNClassifier vertraut, aber ich schätze, er verwendet die kategoriale Cross-Entropie-Kostenfunktion. Dazu wird das Protokoll der Vorhersage erstellt, die divergiert, wenn sich die Vorhersage null nähert. Aus diesem Grund fügen die Menschen normalerweise einen kleinen Epsilon-Wert hinzu, um diese Abweichung zu verhindern. Ich vermute, dass der DNNClassifier dies wahrscheinlich tut oder den tensorflow opp verwendet. Wahrscheinlich nicht das Problem.

  3. Es gibt andere numerische Stabilitätsprobleme wie die Division durch Null, bei der das Hinzufügen des Epsilons hilfreich sein kann. Ein anderer, weniger offensichtlicher, wenn die Quadratwurzel, deren Ableitung bei der Verwendung von Zahlen mit endlicher Genauigkeit nicht richtig vereinfacht wird, divergieren kann. Nochmals bezweifle ich, dass dies beim DNNClassifier der Fall ist.

  4. Möglicherweise liegt ein Problem mit den Eingabedaten vor. Rufen Sie assert not np.any(np.isnan(x)) für die Eingabedaten auf, um sicherzustellen, dass Sie den 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. Sie möchten wahrscheinlich, dass die Pixel im Bereich von [-1, 1] und nicht in [0, 255] liegen.

  5. Die Labels müssen sich in der Domäne der Dossier-Funktion befinden. Wenn Sie eine logarithmische Dossier-Funktion verwenden, müssen alle Labels nicht negativ sein (wie von evan pu und den folgenden Kommentaren angegeben).

52
chasep255

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

Da log (0) eine negative Unendlichkeit ist, wird die Ausgabeverteilung, wenn Ihr Modell ausreichend trainiert ist, sehr schief sein, zum Beispiel, ich mache eine 4-Klassen-Ausgabe. Zu Beginn sieht meine Wahrscheinlichkeit so aus

0.25 0.25 0.25 0.25

aber am ende wird die wahrscheinlichkeit wahrscheinlich so aussehen

1.0 0 0 0

Und Sie nehmen eine Kreuzentropie dieser Verteilung an, alles wird explodieren. Das Update besteht darin, allen Begriffen künstlich eine kleine Zahl hinzuzufügen, um dies zu verhindern.

7
Evan Pu

Wenn Sie Ganzzahlen als Ziele verwenden, müssen Sie sicherstellen, dass sie bei 0 nicht symmetrisch sind. 

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

2
yper

Wenn Sie weitere Informationen zum Fehler sammeln möchten und der Fehler bei den ersten Iterationen auftritt, sollten Sie das Experiment im reinen CPU-Modus (keine GPUs) ausführen. Die Fehlermeldung wird viel genauer sein. 

Quelle: https://github.com/tensorflow/tensor2tensor/issues/574

1
Kevin Johnsrude

In meinem Fall erhielt ich NAN, wenn entfernte ganzzahlige LABELs eingestellt wurden. dh:

  • Etiketten [0..100] das Training war in Ordnung,
  • Labels [0..100] plus ein zusätzliches Label 8000, dann bekam ich NANs.

Verwenden Sie also kein sehr entferntes Label.

EDITSie können den Effekt im folgenden einfachen Code sehen:

from keras.models import Sequential
from keras.layers import Dense, Activation
import numpy as np

X=np.random.random(size=(20,5))
y=np.random.randint(0,high=5, size=(20,1))

model = Sequential([
            Dense(10, input_dim=X.shape[1]),
            Activation('relu'),
            Dense(5),
            Activation('softmax')
            ])
model.compile(optimizer = "Adam", loss = "sparse_categorical_crossentropy", metrics = ["accuracy"] )

print('fit model with labels in range 0..5')
history = model.fit(X, y, epochs= 5 )

X = np.vstack( (X, np.random.random(size=(1,5))))
y = np.vstack( ( y, [[8000]]))
print('fit model with labels in range 0..5 plus 8000')
history = model.fit(X, y, epochs= 5 )

Das Ergebnis zeigt die NANs nach dem Hinzufügen des Labels 8000:

fit model with labels in range 0..5
Epoch 1/5
20/20 [==============================] - 0s 25ms/step - loss: 1.8345 - acc: 0.1500
Epoch 2/5
20/20 [==============================] - 0s 150us/step - loss: 1.8312 - acc: 0.1500
Epoch 3/5
20/20 [==============================] - 0s 151us/step - loss: 1.8273 - acc: 0.1500
Epoch 4/5
20/20 [==============================] - 0s 198us/step - loss: 1.8233 - acc: 0.1500
Epoch 5/5
20/20 [==============================] - 0s 151us/step - loss: 1.8192 - acc: 0.1500
fit model with labels in range 0..5 plus 8000
Epoch 1/5
21/21 [==============================] - 0s 142us/step - loss: nan - acc: 0.1429
Epoch 2/5
21/21 [==============================] - 0s 238us/step - loss: nan - acc: 0.2381
Epoch 3/5
21/21 [==============================] - 0s 191us/step - loss: nan - acc: 0.2381
Epoch 4/5
21/21 [==============================] - 0s 191us/step - loss: nan - acc: 0.2381
Epoch 5/5
21/21 [==============================] - 0s 188us/step - loss: nan - acc: 0.2381
1
Guido

Regularisierung kann helfen. Für einen Klassifikator gibt es gute Gründe für die Regularisierung von Aktivitäten, ob es sich um einen binären Klassifikator oder einen Klassifikator mit mehreren Klassen handelt. Für einen Regressor ist die Kernel-Regularisierung möglicherweise besser geeignet.

0
chrishmorris