Ответ 1
K.clear_session() полезна, когда вы создаете несколько моделей подряд, например, во время поиска гиперпараметра или перекрестной проверки. Каждая модель, которую вы тренируете, добавляет к графику узлы (которые могут исчисляться тысячами). TensorFlow выполняет весь граф всякий раз, когда вы (или Keras) вызываете tf.Session.run() или tf.Tensor.eval(), поэтому ваши модели будут работать медленнее и медленнее, и вы также можете исчерпать память. Очистка сеанса удаляет все узлы, оставшиеся от предыдущих моделей, освобождая память и предотвращая замедление.
Изменить 21/06/19: TensorFlow по умолчанию ленивый. Операции TensorFlow оцениваются не сразу: создание тензора или выполнение каких-либо операций с ним создает узлы в графе потока данных. Результаты рассчитываются путем оценки соответствующих частей графика за один раз, когда вы вызываете tf.Session.run() или tf.Tensor.eval(). Это так, TensorFlow может построить план выполнения, который распределяет операции, которые могут выполняться параллельно различным устройствам. Он также может складывать соседние узлы вместе или удалять лишние (например, если вы сцепили два тензора, а затем снова разделили их без изменений). Для получения дополнительной информации см. Https://www.tensorflow.org/guide/graphs.
Все ваши модели TensorFlow хранятся на графике в виде последовательности тензоров и тензорных операций. Основной операцией машинного обучения является произведение тензорных точек - выход нейронной сети является точечным произведением матрицы ввода и весов сети. Если у вас однослойный персептрон и 1000 тренировочных образцов, то каждая эпоха создает не менее 1000 тензорных операций. Если у вас 1000 эпох, тогда ваш график содержит не менее 1 000 000 узлов в конце, прежде чем принимать во внимание предварительную обработку, постобработку и более сложные модели, такие как рекуррентные сети, кодер-декодер, модели внимания и т.д.
Проблема в том, что в конечном итоге график будет слишком большим, чтобы поместиться в видеопамять (6 ГБ в моем случае), поэтому TF будет перемещать части графика из видео в основную память и обратно. В конечном итоге он даже станет слишком большим для основной памяти (12 ГБ) и начнет перемещаться между основной памятью и жестким диском. Само собой разумеется, это сделало вещи невероятно, и все медленнее, поскольку обучение продолжалось. Перед разработкой этого потока модели сохранения/очистки сеанса/перезагрузки модели я рассчитал, что при темпах замедления на каждую эпоху моя модель могла бы пройти больше времени, чем возраст вселенной, чтобы закончить обучение. Отказ от ответственности: я не использовал TensorFlow почти год, так что это могло измениться. Я помню, что было довольно много проблем с GitHub по этому поводу, так что, надеюсь, с тех пор это было исправлено.