tensorflow 运行时内存持续增长(溢出)
tensorflow 训练部分代码几乎都采用循环,如果在循环中用到tf的op操作,就会导致节点越来越多,图的大小也不停的增大,故而内存会持续增长
常见情况有几种
1、sess.run(a+b)
写成sess.run(add_a_b)最好
2、tf.train.Saver()
3.不要使用额外的图
原因是在对每一张图片正向传播结束后,都会在留下中间信息。具体地说是在我将正向传播的代码与模型的代码分离了,在每次遍历图片时都会正向传播,在tensorflow中新增加了很多的计算节点(如tf.matmul等等),导致内存中遗留了大量的过期信息。
纠正的做法就是一个前提:避免在循环训练图片时额外使用tf计算资源。
使用placeholder作为输入数据的入口,在模型中定义需要使用的函数,包括正向传播。不要在遍历图片时额外使用tf计算。
遇到这种问题一定要回头检查代码,尤其是在别人写的代码基础上改时。 多学习公开的源码。
4.保存模型时候,不要直接写tf.train.Saver().save()/restore(),这样也会导致内存持续增长,猜测可能是tf.train.Saver()增加了图节点,其余未知情况可以在循环开始处使用sess.graph.finalize()代码,如果循环中有导致节点增加的代码,程序会报错
不要直接写tf.train.Saver().save()/restore()”,那应该怎么写呢?
答:
-
self.saver = tf.train.Saver(tf.global_variables(), max_to_keep=1)
-
self.saver.restore(sess, ckpt.model_checkpoint_path)
相关参考:
https://blog.****.net/wcc11404/article/details/80239290
https://blog.****.net/qq_18714153/article/details/80682387