浅谈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 相关文章推荐
在IIS服务器上以CGI方式运行Python脚本的教程
Apr 25 Python
详解Python中的__new__、__init__、__call__三个特殊方法
Jun 02 Python
python re模块findall()函数实例解析
Jan 19 Python
python使用tensorflow保存、加载和使用模型的方法
Jan 31 Python
Python装饰器原理与简单用法实例分析
Apr 29 Python
用pycharm开发django项目示例代码
Oct 24 Python
Python的UTC时间转换讲解
Feb 26 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
Nov 29 Python
TensorFlow 显存使用机制详解
Feb 03 Python
python使用pandas抽样训练数据中某个类别实例
Feb 28 Python
Python实现树莓派摄像头持续录像并传送到主机的步骤
Nov 30 Python
python实现简单猜单词游戏
Dec 24 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
第十三节--对象串行化
2006/11/16 PHP
php抓取页面与代码解析 推荐
2010/07/23 PHP
Laravel多域名下字段验证的方法
2019/04/04 PHP
PHP实现微信提现(企业付款到零钱)
2019/08/01 PHP
深入理解JavaScript系列(12) 变量对象(Variable Object)
2012/01/16 Javascript
jQuery 移动端artEditor富文本编辑器
2016/01/11 Javascript
JS实现的跨浏览器解析XML文件实例
2016/06/21 Javascript
JS简单去除数组中重复项的方法
2016/09/13 Javascript
JS中BOM相关知识点总结(必看篇)
2016/11/22 Javascript
react-native之ART绘图方法详解
2017/08/08 Javascript
JavaScript函数中的this四种绑定形式
2017/08/15 Javascript
vue移动端实现红包雨效果
2020/06/23 Javascript
JavaScript回调函数callback用法解析
2020/01/14 Javascript
jQuery zTree如何改变指定节点文本样式
2020/10/16 jQuery
Python抽象和自定义类定义与用法示例
2018/08/23 Python
对Python 窗体(tkinter)文本编辑器(Text)详解
2018/10/11 Python
python and or用法详解
2019/06/26 Python
python文字转语音实现过程解析
2019/11/12 Python
Python操作多维数组输出和矩阵运算示例
2019/11/28 Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
2020/05/15 Python
Python如何操作docker redis过程解析
2020/08/10 Python
欧舒丹俄罗斯官方网站:L’OCCITANE俄罗斯
2019/11/22 全球购物
毕业生个人的自我评价优秀范文
2013/10/03 职场文书
优秀学生干部推荐材料
2014/02/03 职场文书
党支部综合考察材料
2014/05/19 职场文书
团队精神口号
2014/06/06 职场文书
反对形式主义、官僚主义、享乐主义和奢靡之风整改措施
2014/09/17 职场文书
2014党员干部四风问题对照检查材料思想汇报
2014/09/24 职场文书
户籍证明模板
2014/09/28 职场文书
2014年人民警察入党思想汇报
2014/10/12 职场文书
劳模事迹材料范文
2014/12/24 职场文书
幼儿教师师德师风自我评价
2015/03/05 职场文书
4S店客服专员岗位职责
2015/04/07 职场文书
公司借款担保书
2015/09/22 职场文书
2016年企业先进员工事迹材料
2016/02/25 职场文书
Python使用pyecharts控件绘制图表
2022/06/05 Python