浅谈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 相关文章推荐
linux环境下安装pyramid和新建项目的步骤
Nov 27 Python
在Python中使用matplotlib模块绘制数据图的示例
May 04 Python
Python实现Windows上气泡提醒效果的方法
Jun 03 Python
python中matplotlib实现最小二乘法拟合的过程详解
Jul 11 Python
浅谈Python traceback的优雅处理
Aug 31 Python
详解Python3除法之真除法、截断除法和下取整对比
May 23 Python
python使用minimax算法实现五子棋
Jul 29 Python
Python实现代码统计工具
Sep 19 Python
Django使用Profile扩展User模块方式
May 14 Python
学习Python爬虫的几点建议
Aug 05 Python
Python正则表达式中flags参数的实例详解
Apr 01 Python
Python matplotlib安装以及实现简单曲线的绘制
Apr 26 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
ThinkPHP3.1新特性之内容解析输出详解
2014/06/19 PHP
PHP中使用循环实现的金字塔图形
2014/11/08 PHP
php中mt_rand()随机数函数用法
2014/11/24 PHP
php计算两个日期相差天数的方法
2015/03/14 PHP
wamp服务器访问php非常缓慢的解决过程
2015/07/01 PHP
yii框架redis结合php实现秒杀效果(实例代码)
2017/10/26 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】
2019/05/08 PHP
JavaScript 应用类库代码
2008/06/02 Javascript
Mootools 1.2教程 类(一)
2009/09/15 Javascript
jQuery学习4 浏览器的事件模型
2010/02/07 Javascript
精通Javascript系列之数值计算
2011/06/07 Javascript
js URL参数的拼接方法比较
2012/02/15 Javascript
详解JavaScript中jQuery和Ajax以及JSONP的联合使用
2015/08/13 Javascript
JavaScript动态生成二维码图片
2016/04/20 Javascript
快速使用node.js进行web开发详解
2017/04/26 Javascript
ionic3+Angular4实现接口请求及本地json文件读取示例
2017/10/11 Javascript
angular2 NgModel模块的具体使用方法
2019/04/10 Javascript
jQuery操作元素的内容和样式完整实例分析
2020/01/10 jQuery
vue中watch的用法汇总
2020/12/28 Vue.js
Python操作MySQL数据库9个实用实例
2015/12/11 Python
浅谈python中的变量默认是什么类型
2016/09/11 Python
python 第三方库的安装及pip的使用详解
2017/05/11 Python
Python将多个excel文件合并为一个文件
2018/01/03 Python
Django 连接sql server数据库的方法
2018/06/30 Python
使用Flask集成bootstrap的方法
2018/07/24 Python
python3中property使用方法详解
2019/04/23 Python
python实现支付宝转账接口
2019/05/07 Python
Python生命游戏实现原理及过程解析(附源代码)
2019/08/01 Python
python文件绝对路径写法介绍(windows)
2019/12/25 Python
python离线安装外部依赖包的实现
2020/02/13 Python
Python字符串的15个基本操作(小结)
2021/02/03 Python
南京市纪委监察局整改方案
2014/09/16 职场文书
自荐信模板大全
2015/03/27 职场文书
李白经典诗之一:全文无一“月”字,却句句有月
2019/07/12 职场文书
导游词之宁夏贺兰山岩画
2019/11/08 职场文书