问题:运行主程序时发现随时间增加速度越来越慢一段时间后会出现内存溢出OOM类型错误
分析问题如下:这个分析很好可参考下[https://zhuanlan.zhihu.com/p/31619020]
1、数据太大:调小batch,无用。。。思考是导入数据太大,转换导入方式,我这里输入的数据维度很大,而且是三个变量,几百张图片导出json/csv/txt就要十几个G,改尝试方式如下:
方法一:由于输入数据太大放弃批量将数据处理成上述格式;改变图片导入方式采用边导入batch个图片边处理数据的方式,这样图片处理部分和sess.run部分就会有重叠,导致在sess.run部分迭代过程不断增加op,运行速度下滑
方法二:换用tf自带的导入方式用tfrecord方式导入参考,参考之前的笔记https://www.jianshu.com/writer#/notebooks/23628696/notes/25628257
【最后就是通过换了数据处理方式解决的,同时速度也提高了,当然好的显卡很重要....】
2、tf本身每次sess迭代这块节点不断累加:通常我们的处理方式是定义好图,直接在sess部分反馈数据,然后run一下就可以了,但如果是动态图就不一样了,也就是说你在sess部分定义了其他的tf节点操作 ,随着每次操作图是动态的累加节点。当然最好解决办法是将op操作都放在sess前,不行的话这里考虑每次迭代时将旧图删除,运行新图,关于图调试基本知识,【查看具体问题出现在哪个节点上:print (tf.get_default_graph().as_graph_def()) 】参考[http://www.sohu.com/a/126825399_473283]
方法一:创建新图,sess.run()运行新图,这个在最初建立图的时候调用,就是说每次运行都是新建的图
tf.reset_default_graph()
train_graph = tf.Graph()
with trian_graph.as_default():
报错:某op出现错误,不在同一张图上,原因是我在默认图中还调用了其他的模型,也就是形成了嵌入图
方法二:在sess.run()模块重置图,在调用完成后关闭
for step in range(total_step):
tf.reset_default_graph()。。。。注:不能在嵌套图中调用
with tf.Session() as sess:
tfops = tf add Ops ...
sess.run(tfops)
tf.get_default_graph().finalize()
报错:is not an element of this graph。跟之前原因一样还是因为嵌入图,感觉没有嵌入图的话这两种解决方法逻辑上都是可行的
ps : 一个很好的训练保存测试模型笔记[http://blog.csdn.net/huachao1001/article/details/78501928]