Для чего мне нужны модели K.clear_session() и del для (Keras with Tensorflow-gpu)?

Что я делаю
Я тренируюсь и использую сверточную нейронную сеть (CNN) для классификации изображений, используя Keras с Tensorflow-GPU в качестве бэкэнда.

Что я использую
- Сообщество PyCharm 2018.1.2
- оба Python 2.7 и 3.5 (но не оба одновременно)
- Ubuntu 16.04
- Керас 2.2.0
- Tensorflow-GPU 1.8.0 в качестве бэкэнда

Что я хочу знать
Во многих кодах я вижу людей, использующих

from keras import backend as K 

# Do some code, e.g. train and save model

K.clear_session()

или удаление модели после ее использования:

del model

В документации keras говорится о clear_session: "Уничтожает текущий график TF и создает новый. Полезно, чтобы избежать беспорядка в старых моделях/слоях". - https://keras.io/backend/

Какой смысл делать это и должен ли я это делать? При загрузке или создании новой модели моя модель все равно перезаписывается, так зачем беспокоиться?

Ответ 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 по этому поводу, так что, надеюсь, с тех пор это было исправлено.

Ответ 2

del удалит переменную в python, и поскольку модель является переменной, del model удалит ее, но график TF не изменится (TF - ваш бэкэнд Keras). При этом K.clear_session() уничтожит текущий график TF и создаст новый. Создание новой модели кажется самостоятельным шагом, но не забудьте про бэкэнд :)