解决Tensorflow 内存泄露问题
使用tensorflow进行编程时,经常遇到操作不当,带来的内存泄露问题,这里有一个可以帮助debug问题所在方法:
https://stackoverflow.com/questions/51175837/tensorflow-runs-out-of-memory-while-computing-how-to-find-memory-leaks/51183870#51183870
使用tf.Graph.finalize()把运算图变成只读的,从而对图的修改都会报错,从而找到内存泄露的定点。
目前我出现过内存泄露问题的有两处:
1.
session和graph没有释放内存。按照资料的说法,使用了with关键字可以在session异常退出时也释放内存,否则要用session.close()关闭session。代码如下:
withtf.Session()assession: #codes #一般使用with以后就会释放内存,否则运行如下释放 session.close() delsession
另一方面,我是在session中加载graph(训练好的模型),导致每次关闭程序再运行,graph出现重复加载的现象。错误代码示例:
withtf.Seesion()assession: #在session内部加载保存好的graph saver=tf.train.import_meta_graph('./CNN_cracks.meta') saver.restore(session,"./CNN_cracks") #codes
此处,在一次运行session时会加载一次graph,一次运行的时候没问题,但多次运行(调试时),每次graph都会加载到内存而不被释放,因而造成内存泄露。
正确的做法如下:
#用with新建一个graph,这样在运行完以及异常退出时就会释放内存 graph=tf.Gragh() withgraph.as_default(): saver=tf.train.import_meta_graph('./CNN_cracks.meta') withtf.Session(graph=graph)assession: saver.restore(session,"./CNN_cracks")
2.
一些tensorflow的运算似乎也会修改图,原因未明。所以在在训练里面把所有属于tensorflow的运算都写进去,运行session.run返回的只能是只读。
##错误代码 #训练 graph=tf.Graph() withgraph.as_default(): #codes predict=tf.nn.softmax(model(data)) #预测,这里训练文件与预测文件是分离的 withtf.Session(graph=graph)assession: #codes predict=session.run(predict,feed_dict={data:block}) prediction=tf.argmax(predict,-1)#这里会对图进行修改
##正确代码 #训练 graph=tf.Graph() withgraph.as_default(): #codes predict=tf.argmax(tf.nn.softmax(model(data)),-1) #预测 withtf.Session(graph=graph)assession: #codes prediction=session.run(predict,feed_dict={data:block})
以上这篇解决Tensorflow内存泄露问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。