2015-11-13 23 views
6

Próbuję TensorFlow i mam dziwny błąd. Zmontowałem głęboki przykład MNIST, aby użyć innego zestawu obrazów, a algorytm znowu ładnie się zestala, aż dookoła iteracji 8000 (dokładność 91% w tym punkcie), gdy zawiedzie się z następującym błędem.TensorFlow's ReluGrad roszczenia roszczeń nie jest skończona

tensorflow.python.framework.errors.InvalidArgumentError: ReluGrad input is not finite 

Na początku myślałem, że może niektóre współczynniki zostały osiągnięciu limitu pływaka, ale dodanie l2 uregulowania wszystkich odważników & uprzedzeń nie rozwiązało problemu. Jest to zawsze pierwsza aplikacja relu, która pochodzi z stacktrace:

h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) 

Na razie pracuję tylko na procesorze. Jakiś pomysł, co może spowodować ten problem i jak go obejść?

Edycja: Porównałem to z tym problemem Tensorflow NaN bug?, rozwiązanie tam działa.

+0

Zauważyłem również, że jeśli linia 'train_step = tf.train.AdamOptimizer (1e-4) .minimize (cross_entropy)' Zmienię wartość na 1e-3, awaria nastąpi znacznie wcześniej. Jednak zmiana go na 1e-5 zapobiega konwergencji algorytmu. – user1111929

+0

Dla Adama, możesz chcieć zwiększyć argument "epsilon". Aktualną wartością domyślną jest 'epsilon = 1e-8'. Spójrz na dokumentację. Mówi "Na przykład podczas szkolenia sieci Inception w ImageNet aktualny dobry wybór to 1.0 lub 0.1." Zobacz także dyskusję [this] (https://github.com/tensorflow/tensorflow/issues/323#issuecomment-159116515). – Albert

Odpowiedz

3

Ponieważ miałem inny wątek na ten temat [Tensorflow NaN bug?] Nie utrzymać ten jeden zaktualizowany, ale rozwiązanie nie było tam na chwilę i od tego czasu zostały powtórzone przez plakatów tutaj. Problem polega na tym, że 0 * log (0) powoduje powstanie NaN.

Jedną z opcji jest skorzystanie z linii sugerowanej przez Muaaz lub tej, którą napisałem w połączonym temacie. Ale w końcu TensorFlow ma to rutynowe osadzenie: tf.nn.softmax_cross_entropy_with_logits i jest to bardziej wydajne i dlatego powinno być preferowane, kiedy to możliwe. Powinno to zostać wykorzystane tam, gdzie to możliwe, zamiast tego, o czym mówili ja i Muaaz wcześniej, o czym wspomniał komentujący link.

1

Wystąpił ten błąd: input is not finite wcześniej (nie z tf.nn.relu). W moim przypadku problem polegał na tym, że elementy w mojej zmiennej tensorowej osiągnęły bardzo dużą liczbę (co oznaczało je jako nieskończone i stąd komunikat input is not finite).

Proponuję dodać kilka wyników debugowania do tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) w każdej n-tej iteracji do śledzenia, kiedy dokładnie osiągnie nieskończoność.

Wygląda to zgodne z Twojego komentarza:

I modify the value to 1e-3, the crash occurs significantly earlier. However, changing it to 1e-5 prevents the algorithm from converging

+0

Czy chcesz wyjaśnić, dlaczego jest to zgodne z moim komentarzem? Dodałem wycinek: relu (clip (...)) i teraz otrzymuję wartości NaN w moim wyniku zamiast nieskończoności, więc uważam, że to nie jest główny problem. Czy możliwe jest, że gdy rozwiązanie się poprawi, algorytm optymalizacji nie może już nic więcej robić i zawiesza się (lub robi 0/0) zamiast po prostu zatrzymać? Nie wiem, jak kontynuować, jeśli tak jest. – user1111929

+0

Co do dodawania informacji do debugowania, zrobiłem i niektóre wartości skutecznie rosną. Logiczne: splot powoduje, że zwiększają się o duży współczynnik. Wzrost jest tak duży, że regularyzacja nie pomaga wystarczająco (lub przynajmniej sprawia, że ​​algorytm jest nieefektywny przed faktycznym rozwiązaniem tego problemu). Wycinanie najwyraźniej też nie pomaga. Nie zastąpił również relu przez softplus (wtedy algorytm nie jest już zbieżny z dobrym klasyfikatorem). Jakieś inne pomysły, które mógłbym wypróbować? – user1111929

+0

@ user1111929 jeśli osiągną nieskończoność, wtedy to pytanie zostanie rozwiązane. Zadaj kolejne pytanie, jak sobie poradzić z 'relu', aby zapobiec osiągnięciu nieskończoności. –

9

błędu jest spowodowane (0)

Można tego uniknąć przez do 0log:

cross_entropy = -tf.reduce_sum(y*tf.log(yconv+ 1e-9)) 
+1

To wydaje się działać dla mnie. – bge0

+0

Zaraz. Jak to rozgryzłeś? – syzygy

1

nie mogę wypowiedzieć, ponieważ reputacji, ale Muaaz ma odpowiedź. Błąd można zreplikować, szkoląc system, który ma 0 błędów - w wyniku czego log (0). Jego rozwiązanie działa, aby temu zapobiec. Ewentualnie złap błąd i idź dalej.

...your other code... 
try : 
    for i in range(10000): 
    train_accuracy = accuracy.eval(feed_dict={ 
      x:batch_xs, y_: batch_ys, keep_prob: 1.0}) 

except : print("training interupted. Hopefully deliberately")