解决Tensorflow 内存泄露问题


Posted in Python onFebruary 05, 2020

使用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。代码如下:

with tf.Session() as session:
  #codes

#一般使用with以后就会释放内存,否则运行如下释放
session.close()
del session

另一方面,我是在session中加载graph(训练好的模型),导致每次关闭程序再运行,graph出现重复加载的现象。错误代码示例:

with tf.Seesion() as session:
  # 在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()
with graph.as_default():
  saver = tf.train.import_meta_graph('./CNN_cracks.meta')

with tf.Session(graph=graph) as session:
  saver.restore(session, "./CNN_cracks")

2.

一些tensorflow的运算似乎也会修改图,原因未明。所以在在训练里面把所有属于tensorflow的运算都写进去,运行session.run返回的只能是只读。

##错误代码

#训练
graph = tf.Graph()
with graph.as_default():
  #codes
  predict = tf.nn.softmax(model(data))

#预测,这里训练文件与预测文件是分离的
with tf.Session(graph=graph) as session:
  #codes
  predict = session.run(predict, feed_dict={data: block})
  prediction = tf.argmax(predict, -1) #这里会对图进行修改
##正确代码

#训练
graph = tf.Graph()
with graph.as_default():
  #codes
  predict = tf.argmax(tf.nn.softmax(model(data)), -1)

#预测
with tf.Session(graph=graph) as session:
  #codes
  prediction = session.run(predict, feed_dict={data: block})

以上这篇解决Tensorflow 内存泄露问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python基础教程之自定义函数介绍
Aug 29 Python
Python简单获取自身外网IP的方法
Sep 18 Python
浅谈python中列表、字符串、字典的常用操作
Sep 19 Python
Numpy中转置transpose、T和swapaxes的实例讲解
Apr 17 Python
通过python顺序修改文件名字的方法
Jul 11 Python
Python for循环中的陷阱详解
Jul 13 Python
python实现随机梯度下降法
Mar 24 Python
Python时间和字符串转换操作实例分析
Mar 16 Python
react+django清除浏览器缓存的几种方法小结
Jul 17 Python
python数据预处理 :样本分布不均的解决(过采样和欠采样)
Feb 29 Python
django 获取字段最大值,最新的记录操作
Aug 09 Python
python3美化表格数据输出结果的实现代码
Apr 14 Python
TensorFlow实现指数衰减学习率的方法
Feb 05 #Python
关于Tensorflow使用CPU报错的解决方式
Feb 05 #Python
解决Tensorflow sess.run导致的内存溢出问题
Feb 05 #Python
解决TensorFlow训练内存不断增长,进程被杀死问题
Feb 05 #Python
浅谈tensorflow之内存暴涨问题
Feb 05 #Python
对Tensorflow中Device实例的生成和管理详解
Feb 04 #Python
关于windows下Tensorflow和pytorch安装教程
Feb 04 #Python
You might like
php在线打包程序源码
2008/07/27 PHP
php守护进程 加linux命令nohup实现任务每秒执行一次
2011/07/04 PHP
php ios推送(代码)
2013/07/01 PHP
ThinkPHP快速入门实例教程之数据分页
2014/07/01 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
2014/12/24 PHP
js实现select组件的选择输入过滤代码
2014/10/14 Javascript
浅谈javascript中return语句
2015/07/15 Javascript
基于JQuery实现仿网易邮箱全屏动感滚动插件fullPage
2015/09/20 Javascript
js一维数组、多维数组和对象的混合使用方法
2016/04/03 Javascript
AngularJS通过$sce输出html的方法
2016/09/22 Javascript
easyui combotree加载静态数据问题(选不上)解决方法
2016/12/26 Javascript
微信小程序开发经验总结(推荐)
2017/01/11 Javascript
Javascript Event(事件)的传播与冒泡
2017/01/23 Javascript
jQuery控制元素隐藏和显示
2017/03/03 Javascript
jQuery图片瀑布流的简单实现代码
2017/03/15 Javascript
Vue.js 60分钟快速入门教程
2017/03/28 Javascript
vue基于mint-ui的城市选择3级联动的示例
2017/10/25 Javascript
详解Immutable及 React 中实践
2018/03/01 Javascript
js实现前面自动补全位数的方法
2018/10/10 Javascript
解决layui-table单元格设置为百分比在ie8下不能自适应的问题
2019/09/28 Javascript
vue-cli3.0实现一个多页面应用的历奇经历记录总结
2020/03/16 Javascript
python按照多个字符对字符串进行分割的方法
2015/03/17 Python
Python中用PIL库批量给图片加上序号的教程
2015/05/06 Python
Python中的自省(反射)详解
2015/06/02 Python
在Django的form中使用CSS进行设计的方法
2015/07/18 Python
VSCode下好用的Python插件及配置
2018/04/06 Python
python生成带有表格的图片实例
2019/02/03 Python
python实现简单图书管理系统
2019/11/22 Python
Python列表嵌套常见坑点及解决方案
2020/09/30 Python
pytorch 移动端部署之helloworld的使用
2020/10/30 Python
安全的后院和健身蹦床:JumpSport
2019/07/15 全球购物
《小壁虎借尾巴》教学反思
2014/02/16 职场文书
重阳节标语大全
2014/10/07 职场文书
班主任工作总结范文
2015/08/13 职场文书
一篇合格的广告文案,其主要目的是什么?
2019/07/12 职场文书
jdbc中自带MySQL 连接池实践示例
2022/07/23 MySQL