Нэн в сводной гистограмме
Моя программа сталкивается с этим несколько раз (не каждый запуск сталкивается с этим..), тогда, если сталкиваюсь с этим, я всегда могу воспроизвести эту ошибку загрузки из последней модели, которую я сохранил до сбоя программы из-за nan. При повторном запуске из этой модели первый процесс обучения выглядит нормально с использованием модели для генерирования потерь (я напечатал потери и не вижу проблем), но после применения градиентов значения переменных вложения превратятся в Nan.
Так в чем же причина проблемы нан? Смущенный, поскольку не знает, как отлаживать дальше, и эта программа с теми же данными и параметрами будет в основном работать нормально и только столкнется с этой проблемой во время некоторого запуска.
Loading existing model from: /home/gezi/temp/image-caption//model.flickr.rnn2.nan/model.ckpt-18000
Train from restored model: /home/gezi/temp/image-caption//model.flickr.rnn2.nan/model.ckpt-18000
I tensorflow/core/common_runtime/gpu/pool_allocator.cc:245] PoolAllocator: After 5235 get requests, put_count=4729 evicted_count=1000 eviction_rate=0.211461 and unsatisfied allocation rate=0.306781
I tensorflow/core/common_runtime/gpu/pool_allocator.cc:257] Raising pool_size_limit_ from 100 to 110
2016-10-04 21:45:39 epoch:1.87 train_step:18001 duration:0.947 elapsed:0.947 train_avg_metrics:['loss:0.527'] ['loss:0.527']
2016-10-04 21:45:39 epoch:1.87 eval_step: 18001 duration:0.001 elapsed:0.948 ratio:0.001
W tensorflow/core/framework/op_kernel.cc:968] Invalid argument: Nan in summary histogram for: rnn/HistogramSummary_1
[[Node: rnn/HistogramSummary_1 = HistogramSummary[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](rnn/HistogramSummary_1/tag, rnn/image_text_sim/image_mlp/w_h/read/_309)]]
W tensorflow/core/framework/op_kernel.cc:968] Invalid argument: Nan in summary histogram for: rnn/HistogramSummary_1
[[Node: rnn/HistogramSummary_1 = HistogramSummary[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](rnn/HistogramSummary_1/tag, rnn/image_text_sim/image_mlp/w_h/read/_309)]]
W tensorflow/core/framework/op_kernel.cc:968] Invalid argument: Nan in summary histogram for: rnn/HistogramSummary_1
[[Node: rnn/HistogramSummary_1 = HistogramSummary[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](rnn/HistogramSummary_1/tag, rnn/image_text_sim/image_mlp/w_h/read/_309)]]
W tensorflow/core/framework/op_kernel.cc:968] Invalid argument: Nan in summary histogram for: rnn/HistogramSummary_1
[[Node: rnn/HistogramSummary_1 = HistogramSummary[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](rnn/HistogramSummary_1/tag, rnn/image_text_sim/image_mlp/w_h/read/_309)]]
W tensorflow/core/framework/op_kernel.cc:968] Invalid argument: Nan in summary histogram for: rnn/HistogramSummary_1
[[Node: rnn/HistogramSummary_1 = HistogramSummary[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](rnn/HistogramSummary_1/tag, rnn/image_text_sim/image_mlp/w_h/read/_309)]]
Traceback (most recent call last):
File "./train.py", line 308, in <module>
tf.app.run()
7 ответов
Иногда на начальных итерациях обучения случается, что модель может извергать только один класс предсказания. Если случайно, класс оказался равным 0 для всех обучающих примеров, тогда может существовать значение NaN для категориальной перекрестной потери энтропии.
Убедитесь, что вы вводите небольшое значение при расчете потерь, таких как tf.log(predictions + 1e-8)
, Это поможет в преодолении этой численной нестабильности.
Обычно NaN является признаком нестабильности модели, например, взрывающихся градиентов. Это может остаться незамеченным, потеря просто перестанет сокращаться. Попытка записать сводку весов делает проблему явной. Я предлагаю вам снизить скорость обучения в качестве первой меры. Если это не поможет, опубликуйте свой код здесь. Не видя этого, трудно предложить что-то более конкретное.
У меня была аналогичная ошибка, и я безуспешно пробовал разные скорости обучения, размеры пакетов, функции потерь и архитектуры моделей. Но потом я заметил, что могу нормально обучать свою модель, если не использую обратный вызов тензорной доски. Похоже, что "Nan в сводной гистограмме" относится к сохранению гистограммы весов модели, что каким-то образом делает эти Nans явными. Отключение гистограмм в обратном вызове тензорной доски решило проблему для меня: tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=0)
У меня была аналогичная проблема, и в моем случае я изменил активацию с tf.nn.relu на tf.nn.sigmoid, и это сработало. Надеюсь, это поможет.
Я считаю, что это как-то связано с нехваткой памяти в вашей системе. Это особенно кажется проблемой, если вы получаете ошибку после определенного количества шагов.
Установка параметра train в значение false в batch_norm (в файле pipeline.config), похоже, решает эту проблему.
Это должно выглядеть примерно так:
batch_norm {
decay: 0.999
center: true
scale: true
epsilon: 0.001
train: false
}
Удалите каталог обучения (logdir) и снова начните его обучение. Возобновление с последней контрольной точки приведет к той же ошибке.
Надеюсь, это помогло.
Если вы используете tensorflow.keras.layers.Masking
и одна или несколько входных функций оказались замаскированы для всех входных данных в пакете, тогда вы можете получить эту ошибку.
Подобно случаю Наджиба Хана, но срабатывает иначе.
Это имеет смысл, потому что, когда tenorflow вызывает _log_weights
из on_epoch_end
, некоторые веса, относящиеся к входным объектам, которые всегда маскировались, на самом деле все еще NaN.
Для меня решение заключалось в явной загрузке весов (через tensorflow.keras.models.load_model
)
Это случилось со мной с RaggedTensors. Я использовал tf.concat для разделения и объединения многомерного рваного тензора в плоский, то есть (None, 6, 7) -> (None, 42) и начал получать ошибку. Отключение гистограмм в обратном вызове Tensorboard также исправило это для моего случая.