2016-04-16 10 views
1

Я попытался взломать код из курса Udacity Deep Learning (Assignment 3 - Регуляризация) и Tensorflow mnist_with_summaries.py Tutorial. Мой код, как представляется, прекрасно работатьСкорость обучения более 0,001 приводит к ошибке

https://github.com/llevar/udacity_deep_learning/blob/master/multi-layer-net.py

но что-то странное происходит. Все задания используют скорость обучения 0,5 и в какой-то момент вводят экспоненциальный спад. Однако код, который я собрал, работает нормально, когда я устанавливаю скорость обучения 0,001 (с распадом или без). Если установить начальную скорость в 0,1 или выше, я получаю следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "/Users/siakhnin/Documents/workspace/udacity_deep_learning/multi-layer-net.py", line 175, in <module> 
    summary, my_accuracy, _ = my_session.run([merged, accuracy, train_step], feed_dict=feed_dict) 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 340, in run 
    run_metadata_ptr) 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 564, in _run 
    feed_dict_string, options, run_metadata) 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 637, in _do_run 
    target_list, options, run_metadata) 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 659, in _do_call 
    e.code) 
tensorflow.python.framework.errors.InvalidArgumentError: Nan in summary histogram for: layer1/weights/summaries/HistogramSummary 
    [[Node: layer1/weights/summaries/HistogramSummary = HistogramSummary[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](layer1/weights/summaries/HistogramSummary/tag, layer1/weights/Variable/read)]] 
Caused by op u'layer1/weights/summaries/HistogramSummary', defined at: 
    File "/Users/siakhnin/Documents/workspace/udacity_deep_learning/multi-layer-net.py", line 106, in <module> 
    layer1, weights_1 = nn_layer(x, num_features, 1024, 'layer1') 
    File "/Users/siakhnin/Documents/workspace/udacity_deep_learning/multi-layer-net.py", line 79, in nn_layer 
    variable_summaries(weights, layer_name + '/weights') 
    File "/Users/siakhnin/Documents/workspace/udacity_deep_learning/multi-layer-net.py", line 65, in variable_summaries 
    tf.histogram_summary(name, var) 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/logging_ops.py", line 113, in histogram_summary 
    tag=tag, values=values, name=scope) 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/gen_logging_ops.py", line 55, in _histogram_summary 
    name=name) 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/op_def_library.py", line 655, in apply_op 
    op_def=op_def) 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 2154, in create_op 
    original_op=self._default_original_op, op_def=op_def) 
    File "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1154, in __init__ 
    self._traceback = _extract_stack() 

Если установить скорость на уровне 0,001, то код работает до завершения с тестируемой точностью 0,94.

Использования tensorflow 0,8 RC0 на Mac OS X.

ответ

5

Похоже, ваше обучение расходящееся (что заставляет вас получить бесконечности или пренебрежимо малый). Нет простого объяснения того, почему вещи расходятся в некоторых условиях, но не в других, но, как правило, более высокий уровень обучения позволяет с большей вероятностью расходиться.

Редактировать, 17 апреля Вы получаете NaN в вашем Histogram резюме, которое, скорее всего, означает, что в ваших весов или активаций NaN. NaN s вызваны численно неправильными вычислениями, т. Е. Взятием логарифма 0 и умножением результата на 0. Существует также небольшая вероятность, что на гистограммах есть ошибка, чтобы исключить это, отключить резюме и посмотреть, можете ли вы еще тренироваться до хорошая точность.

Чтобы отключить сводки, замените эту строку слиты = tf.merge_all_summaries()

с этим

merged = tf.constant(1) 

и закомментируйте эту строку

test_writer.add_summary(summary) 
+0

Hi Ярослав, Спасибо за ваш ответ. Можете ли вы мне немного разобраться с сообщением об ошибке? Как мне отладить это? Кажется, это происходит во вторую эпоху, поэтому слишком быстро расходиться. Это гистограмма, это проблема или вес? Можно ли выполнить выполнение тензорного потока с помощью обычного отладчика? Похоже, что я могу использовать высокий уровень обучения 0,5 с примерами из готовых примеров в Udacity и обучающих программах для тензора, поэтому я боюсь, что это может быть какая-то тонкая ошибка в моем коде, которая заставляет вещи вести себя таким образом. Спасибо за вашу помощь. – llevar

+0

обновлен с некоторыми советами по отладке –

+0

Когда я комментирую резюме и увеличиваю скорость обучения до 0,1, программа больше не вылетает, но она также не учится. Точность остается на уровне 10% в течение нескольких тысяч эпох. Поскольку данные обучения постоянны, а начальные веса - это выборки из нормального (0, 0.1) Я ожидаю, что прогоны моего кода будут похожи на код udacity, но они отлично работают со скоростью даже 0,5. Правильный способ отладки (например, для поиска неожиданно большого градиента ошибок), собирая возвращаемое значение из метода session.run или есть другие более удобные способы опроса состояния системы? – llevar

0

Вы пересекаться энтропию:

diff = y_ * tf.log(y) 

также может потребоваться рассмотреть случай 0 * журнал (0)

Вы можете изменить его:

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

источник: Tensorflow NaN bug?