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计算。

遇到这种问题一定要回头检查代码,尤其是在别人写的代码基础上改时。 多学习公开的源码。

tensorflow 运行时内存持续增长(溢出)

 4.保存模型时候,不要直接写tf.train.Saver().save()/restore(),这样也会导致内存持续增长,猜测可能是tf.train.Saver()增加了图节点,其余未知情况可以在循环开始处使用sess.graph.finalize()代码,如果循环中有导致节点增加的代码,程序会报错
 

不要直接写tf.train.Saver().save()/restore()”,那应该怎么写呢?

答:

  1. self.saver = tf.train.Saver(tf.global_variables(), max_to_keep=1)

  2. self.saver.restore(sess, ckpt.model_checkpoint_path)

相关参考:

https://blog.****.net/wcc11404/article/details/80239290

https://blog.****.net/qq_18714153/article/details/80682387

TensorFlow踩坑记(陆续上演……)已更新3记

https://blog.****.net/The_lastest/article/details/81130500