我需要什么K.clear_session()和del model(Keras with Tensorflow-gpu)?

问题描述 投票:15回答:2

我在做什么 我正在训练并使用卷积神经网络(CNN)进行图像分类,使用Keras和Tensorflow-gpu作为后端。

我在用什么 - PyCharm社区2018.1.2 - Python 2.7和3.5(但不是一次两者) - Ubuntu 16.04 - Keras 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

关于clear_session的keras文档说:“破坏当前的TF图并创建一个新图。有助于避免旧模型/图层的混乱。” - https://keras.io/backend/

这样做有什么意义,我也应该这样做?在加载或创建新模型时,我的模型无论如何都会被覆盖,为什么还要费心呢?

python tensorflow memory-management keras
2个回答
9
投票

当您连续创建多个模型时,例如在超参数搜索或交叉验证期间,K.clear_session()非常有用。您训练的每个模型都会将节点(可能以数千个编号)添加到图形中。只要您(或Keras)调用tf.Session.run()或tf.Tensor.eval(),TensorFlow就会执行整个图形,因此您的模型将变得越来越慢以进行训练,并且您可能也会耗尽内存。清除会话将删除以前模型遗留的所有节点,释放内存并防止减速。

编辑21/06/19:默认情况下,TensorFlow是惰性评估的。不会立即评估TensorFlow操作:创建张量或对其执行某些操作会在数据流图中创建节点。当您调用tf.Session.run()或tf.Tensor.eval()时,通过一次性评估图的相关部分来计算结果。这是如此TensorFlow可以构建一个执行计划,该计划分配可以与不同设备并行执行的操作。它还可以将相邻节点折叠在一起或删除多余节点(例如,如果您连接两个张量,然后再将它们分开,则不会更改)。有关更多详细信息,请参阅https://www.tensorflow.org/guide/graphs

所有TensorFlow模型都作为一系列张量和张量运算存储在图表中。机器学习的基本操作是张量点积 - 神经网络的输出是输入矩阵和网络权重的点积。如果您有单层感知器和1,000个训练样本,那么每个纪元创建至少1,000个张量操作。如果你有1000个纪元,那么在考虑预处理,后处理和更复杂的模型(如循环网络,编码器解码器,注意模型等)之前,你的图表最后至少包含1,000,000个节点。

问题是最终图形太大而无法放入视频内存(在我的情况下为6 GB),因此TF会将图形的一部分从视频传送到主存储器并返回。最终它甚至会对主内存(12 GB)过大,并开始在主内存和硬盘之间移动。毋庸置疑,随着培训的进行,这使得事情变得令人难以置信,而且越来越慢。在开发这个保存模型/清除会话/重载模型流程之前,我计算出,在我经历的减速的每个时期速率下,我的模型将花费比宇宙年龄更长的时间来完成训练。免责声明:我近一年没有使用TensorFlow,所以这可能已经改变了。我记得有很多关于GitHub的问题,所以希望它已经修复了。


2
投票

del将删除python中的变量,因为model是一个变量,del模型将删除它,但TF图将没有变化(TF是你的Keras后端)。这就是说,K.clear_session()将破坏当前的TF图并创建一个新图。创建一个新模型似乎是一个独立的步骤,但不要忘记后端:)

© www.soinside.com 2019 - 2024. All rights reserved.