2016-10-20 19 views
5

Problem

biegnę Deep Neural Network na MNIST gdzie strata zdefiniowana następująco:Jak rozwiązać problem strat nan?

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, label))

program wydaje się działać poprawnie, dopóki nie dostanę stratę nan w 10000+ th minibatch. Czasami program działa poprawnie, aż do zakończenia. Myślę, że tf.nn.softmax_cross_entropy_with_logits daje mi ten błąd. To dziwne, ponieważ kod zawiera tylko operacje mul i add.

Możliwe rozwiązanie

Może używać:

if cost == "nan": 
    optimizer = an empty optimizer 
else: 
    ... 
    optimizer = real optimizer 

Ale nie mogę znaleźć typ nan. Jak mogę sprawdzić zmienną jest nan czy nie?

Jak inaczej mogę rozwiązać ten problem?

+1

Sprawdź implementację "tf.add_check_numerics_ops", która dodaje 'Assert' ops do każdego tensora, aby upewnić się, że nie ma nans, więc możesz użyć wszystkiego, co używa do sprawdzenia nanness –

+0

Jestem nowicjuszem tensorflow, kiedy używam "tf.add_check_numerics_ops", przynosi mi błąd "tensorflow.python.framework.errors.InvalidArgumentError: Wszystkie dane wejściowe do modelu węzła/CheckNumerics_254 muszą pochodzić z tej samej ramki." Czy użyłem go w niewłaściwy sposób? –

+0

Po prostu chodziło o to, że możesz zajrzeć do implementacji 'add_check_numerics_ops', aby zobaczyć, który op determinuje, czy zmienna ma wartość NaN, i użyć tego op –

Odpowiedz

1

Nie mam twojego kodu ani danych. Ale tf.nn.softmax_cross_entropy_with_logits powinien być stabilny z prawidłowym rozkładem prawdopodobieństwa (więcej informacji here). Zakładam, że twoje dane nie spełniają tego wymogu. Podobny problem omówiono również pod adresem here. Które doprowadziłoby Cię do:

  1. Wprowadź w życie własną funkcję softmax_cross_entropy_with_logits, np. spróbuj (source):

    epsilon = tf.constant(value=0.00001, shape=shape) 
    logits = logits + epsilon 
    softmax = tf.nn.softmax(logits) 
    cross_entropy = -tf.reduce_sum(labels * tf.log(softmax), reduction_indices=[1]) 
    
  2. zaktualizować swoje dane w taki sposób, że ma ważny rozkład prawdopodobieństwa

+0

Używam standardowego zestawu danych mniam, myślę, że jego rozkład prawdopodobieństwa jest ważny. –

+0

Dlaczego epsilon jest dodawany do logi zamiast softmax? –

+0

'epsilon' jest dodawany do logitów, więc suma wynikowego softmax jest nadal 1, ale nie może zawierać zer (te skutkują NaN). To bardzo dziwne, że masz ten problem ze standardowym zestawem danych mni ... Czy możesz sprawdzić, co się stanie, jeśli użyjesz tej nowej funkcji 'cross_entropy'? Jeśli to nie zadziała, prawdopodobnie musisz przejrzeć rzeczywiste logi. – Fematich

7

Sprawdź swoją szybkość uczenia się. Im większa twoja sieć, więcej parametrów do nauki. Oznacza to, że musisz także zmniejszyć wskaźnik uczenia się.

6

Powód, dla którego otrzymujesz NaN jest najbardziej prawdopodobne, że gdzieś w funkcji kosztowej lub softmax próbujesz wziąć dziennik zero, który nie jest liczbą. Ale aby odpowiedzieć na twoje konkretne pytanie dotyczące wykrywania NaN, Python ma wbudowaną możliwość testowania NaN w module matematycznym. Na przykład:

import math 
val = float('nan') 
val 
if math.isnan(val): 
    print('Detected NaN') 
    import pdb; pdb.set_trace() # Break into debugger to look around 
+0

log (0) = -Infinity o ile wiem – Magnus

2

znajdę podobny problem tutaj TensorFlow cross_entropy NaN problem

Dzięki autora user1111929

tf.nn.softmax_cross_entropy_with_logits => -tf.reduce_sum(y_*tf.log(y_conv)) 

jest rzeczywiście straszny sposób obliczania entropii krzyżowej. W niektórych próbach niektóre klasy mogły zostać po pewnym czasie wykluczone, co skutkowało Y_conv = 0 dla tej próbki. Zwykle nie stanowi to problemu, ponieważ nie jesteś nimi zainteresowany, ale w sposobie, w jaki jest tam zapisana wartość cross_entropy, daje 0 * log (0) dla tej konkretnej próbki/klasy. Stąd NaN.

zastępując ją

cross_entropy = -tf.reduce_sum(y_*tf.log(y_conv + 1e-10)) 

Albo

cross_entropy = -tf.reduce_sum(y_*tf.log(tf.clip_by_value(y_conv,1e-10,1.0))) 

rozwiązano problemu nan.

Powiązane problemy