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

ben*_*min 24 python memory-management keras tensorflow

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

我正在使用的是什么
- PyCharm Community 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()
Run Code Online (Sandbox Code Playgroud)

或使用后删除模型:

del model
Run Code Online (Sandbox Code Playgroud)

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

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

Chr*_*att 16

当您连续创建多个模型时(例如在超参数搜索或交叉验证期间),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个张量操作。如果您有1,000个纪元,那么在考虑预处理,后处理以及更复杂的模型(例如递归网络,编码器-解码器,注意模型等)之前,图形的末尾至少包含1,000,000个节点。

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


小智 6

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