2015-11-13 10 views
6

Я пытаюсь TensorFlow, и у меня возникает странная ошибка. Я редактировал глубокий пример MNIST, чтобы использовать другой набор изображений, и алгоритм сходится хорошо снова, пока вокруг iteration 8000 (точность 91% в этой точке), когда он выходит из строя со следующей ошибкой.Вложения RelusGrad от TensorFlow не являются конечными

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

Сначала я думал, что, возможно, некоторые коэффициенты достигали предел для поплавка, но добавление l2 упорядочению всех весов & уклонов не удалось решить эту проблему. Это всегда первое приложение Relu, что выходит из StackTrace:

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

Я работаю на CPU только сейчас. Любая идея, что может вызвать это и как обойти его?

Редактировать: Я проследил его до этой проблемы Tensorflow NaN bug?, решение там работает.

+0

Я также заметил, что если строка 'train_step = tf.train.AdamOptimizer (1e-4) .minimize (cross_entropy)' Я изменяю значение до 1e-3, авария происходит значительно раньше. Однако изменение его до 1e-5 не позволяет алгоритму сходиться. – user1111929

+0

Для Адама вы можете увеличить аргумент 'epsilon'. Текущее значение по умолчанию - 'epsilon = 1e-8'. Посмотрите документацию. В нем говорится: «Например, при обучении начальной сети на ImageNet текущий хороший выбор - 1,0 или 0,1». Также см. [This] (https://github.com/tensorflow/tensorflow/issues/323#issuecomment-159116515) обсуждение. – Albert

ответ

3

Поскольку у меня была другая тема по этому вопросу [Tensorflow NaN bug?] Я не держать этот обновленный, но решение было там некоторое время, и с тех пор вторит плакаты здесь. Проблема действительно в том, что 0 * log (0) приводит к NaN.

Один из вариантов заключается в использовании линии Muaaz предлагает здесь или тот, который я написал в связанной теме. Но в итоге TensorFlow использует эту процедуру: tf.nn.softmax_cross_entropy_with_logits, и это более эффективно и, следовательно, должно быть предпочтительным, когда это возможно. Это следует использовать там, где это возможно, вместо того, что было предложено мной и Муаазом ранее, как отметил комментатор по указанной ссылке.

1

Я испытал эту ошибку: input is not finite ранее (не с tf.nn.relu). В моем случае проблема заключалась в том, что элементы в моей тензорной переменной достигли очень большого числа (которые обозначили их как бесконечные и, следовательно, сообщение input is not finite).

Я бы предложил добавить кучу отладочного вывода в tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) на каждой n-й итерации, чтобы отслеживать, когда именно он достиг бесконечности.

Это выглядит в соответствии с Вашим комментарием:

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

+0

Куле вы уточните, почему это согласуется с моим комментарием? Я добавил клиппинг: relu (клип (...)), и теперь я получаю значения NaN в своем выходе вместо бесконечности, поэтому я чувствую, что это не корень проблемы. Может быть, когда решение получится хорошо, алгоритм оптимизации больше ничего не может сделать, а сбой (или 0/0) вместо остановки? Не уверен, как продолжить, если это так. – user1111929

+0

Что касается добавления информации об отладке, я сделал и некоторые ценности эффективно продолжают расти. Логика: свертка заставляет их увеличиваться на большой коэффициент. Рост настолько велик, что регуляризация недостаточно помогает (или, по крайней мере, делает алгоритм неэффективным до фактического решения этой проблемы). Обрезание, по-видимому, тоже не помогает. Также не заменил relu by softplus (тогда алгоритм больше не сходится к хорошему классификатору). Любые другие идеи, что я мог попробовать? – user1111929

+0

@ user1111929 если они достигли бесконечности, то этот вопрос решается. Задайте еще один вопрос о том, как обращаться с 'relu', чтобы он не достиг бесконечности. –

9

ошибки из-за 0log (0)

Этого можно избежать путем:

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

Кажется, это работает для меня. – bge0

+0

Прямо на. Как вы это поняли? – syzygy

1

не могу комментировать, потому что репутации, но у Муаза есть ответ. Ошибка может быть реплицирована путем обучения системы с 0 ошибкой - результатом является log (0). Его решение работает, чтобы предотвратить это. Альтернативно поймайте ошибку и перейдите.

...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") 

 Смежные вопросы

  • Нет связанных вопросов^_^