浅谈tensorflow之内存暴涨问题


Posted in Python onFebruary 05, 2020

在用tensorflow实现一些模型的时候,有时候我们在运行程序的时候,会发现程序占用的内存在不断增长。最后内存溢出,程序被kill掉了。

这个问题,其实有两个可能性。一个是比较常见,同时也是很难发现的。这个问题的解决,需要我们知道tensorflow在构图的时候,是没有所谓的临时变量的,只要有operator。那么tensorflow就会在构建的图中增加这个operator所代表的节点。所以,在运行程序的过程中,内存不断增长的原因就是在模型训练迭代的过程中,tensorflow一直在帮你增加图的节点。导致内存占用越来越多。

那么什么情况下就会像上面说的那样呢?我们举个例子:

import tensorflow as tf

x = tf.Variable(tf.constant(1))
y = tf.constant(2)
sess = tf.Session()
sess.run(tf.global_variables_initializer())

while True:
 print(sess.run(x+y))

如果你运行上面这段代码,会发现在运行的过程中,内存占用越来越大。原因就在于sess.run(x+y)这个语句。我们知道在tensorflow中,所有的操作都是graph的节点。而在迭代的过程中,x+y这个operator(操作)是匿名的,所以它会不断地重复,在graph中创建节点,导致内存占用越来越大。

所以要对上面的代码进行修改:

z = x+y
while True:
 print(sess.run(z))

这样就不会出现问题了。

上面只是一个简单的例子,我们可以很快发现问题。但是有时候我们的模型比较复杂,很难判断是否在迭代的过程中一直在增加节点。那怎么办呢?

其实在tensorflow里面有个函数叫做:

sess.graph.finalize()

只要每一次构图完成后,调用这个函数。然后运行程序,如果你的程序在运行的过程中还一直新建节点,这个函数就会检测到,然后就会报错。这样你就知道你的程序中一定有不合理的地方。

另一个导致内存暴涨的原因是,数据的加载问题。tensorflow现在有一个API接口,tf.data.Dataset 。这个接口里面有个函数叫做cache(filename)。cache函数的作用是将加载进来的数据存放到filename指定的地方。但是如果我们没有指定filename,数据就是一直存储在内存中。所以,随着迭代次数的增加,存储在内存中的数据越来越多,就会导致内存暴涨。所以要么不要使用这个函数,要么就要记得添加filename参数。

以上这篇浅谈tensorflow之内存暴涨问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中stdout输出不缓存的设置方法
May 29 Python
Python scikit-learn 做线性回归的示例代码
Nov 01 Python
python 寻找list中最大元素对应的索引方法
Jun 28 Python
python将视频转换为全字符视频
Apr 26 Python
在django中,关于session的通用设置方法
Aug 06 Python
python数据分析工具之 matplotlib详解
Apr 09 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
Apr 29 Python
Python自动化操作实现图例绘制
Jul 09 Python
python--shutil移动文件到另一个路径的操作
Jul 13 Python
python实现每天自动签到领积分的示例代码
Aug 18 Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
Sep 03 Python
python 离散点图画法的实现
Apr 01 Python
对Tensorflow中Device实例的生成和管理详解
Feb 04 #Python
关于windows下Tensorflow和pytorch安装教程
Feb 04 #Python
django3.02模板中的超链接配置实例代码
Feb 04 #Python
tensorflow自定义激活函数实例
Feb 04 #Python
pytorch对梯度进行可视化进行梯度检查教程
Feb 04 #Python
pytorch梯度剪裁方式
Feb 04 #Python
基于梯度爆炸的解决方法:clip gradient
Feb 04 #Python
You might like
星际争霸秘籍
2020/03/04 星际争霸
php Hex RGB颜色值互换的使用
2013/05/10 PHP
PHP延迟静态绑定的深入讲解
2018/04/02 PHP
Jquery操作Select 简单方便 一个js插件搞定
2009/11/12 Javascript
Extjs学习笔记之三 extjs form更多的表单项
2010/01/07 Javascript
javascript 匿名函数的理解(透彻版)
2010/01/28 Javascript
自动刷新网页,自动刷新当前页面,JS调用
2013/06/24 Javascript
轻松创建nodejs服务器(5):事件处理程序
2014/12/18 NodeJs
全面了解addEventListener和on的区别
2016/07/14 Javascript
原生js获取元素样式的简单方法
2016/08/06 Javascript
JS中用childNodes获取子元素换行会产生一个子元素
2016/12/08 Javascript
vue开发调试神器vue-devtools使用详解
2017/07/13 Javascript
vue2.0 + element UI 中 el-table 数据导出Excel的方法
2018/03/02 Javascript
Nodejs调用Dll模块的方法
2018/09/17 NodeJs
浅析Angular 实现一个repeat指令的方法
2019/07/21 Javascript
js如何验证密码强度
2020/03/18 Javascript
python检测远程服务器tcp端口的方法
2015/03/14 Python
Python字符串处理函数简明总结
2015/04/13 Python
python提取字典key列表的方法
2015/07/11 Python
python使用Matplotlib绘制分段函数
2018/09/25 Python
python绘制地震散点图
2019/06/18 Python
美国室内和室外装饰花盆购物网站:ePlanters
2019/03/22 全球购物
什么是规则表达式
2012/05/03 面试题
学前教育专业毕业生自荐信
2013/10/03 职场文书
安全承诺书范文
2014/03/26 职场文书
毕业生简历自我评价范文
2014/04/09 职场文书
《果园机器人》教学反思
2014/04/13 职场文书
学位证书委托书
2014/09/30 职场文书
婚前协议书范本两则
2014/10/16 职场文书
布达拉宫导游词
2015/02/02 职场文书
升学宴祝酒词
2015/08/11 职场文书
家庭聚会祝酒词
2015/08/11 职场文书
Python OpenCV 图像平移的实现示例
2021/06/04 Python
详解Python函数print用法
2021/06/18 Python
详解Android中的TimePickerView(时间选择器)的用法
2022/04/30 Java/Android
利用Java连接Hadoop进行编程
2022/06/28 Java/Android