浅谈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实现连接mongodb的方法
May 08 Python
Python开发的HTTP库requests详解
Aug 29 Python
python中 logging的使用详解
Oct 25 Python
Python实现读取Properties配置文件的方法
Mar 29 Python
使用Python的Dataframe取两列时间值相差一年的所有行方法
Jul 10 Python
python 将json数据提取转化为txt的方法
Oct 26 Python
对Python subprocess.Popen子进程管道阻塞详解
Oct 29 Python
详解python的四种内置数据结构
Mar 19 Python
使用Python做定时任务及时了解互联网动态
May 15 Python
利用Pandas和Numpy按时间戳将数据以Groupby方式分组
Jul 22 Python
Python+Tensorflow+CNN实现车牌识别的示例代码
Oct 11 Python
numpy实现神经网络反向传播算法的步骤
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
解析htaccess伪静态的规则
2013/06/18 PHP
destoon常用的安全设置概述
2014/06/21 PHP
thinkphp模板输出技巧汇总
2014/11/24 PHP
php实现通用的从数据库表读取数据到数组的函数实例
2015/03/21 PHP
php示例详解Constructor Prototype Pattern 原型模式
2015/10/15 PHP
PHP socket 模拟POST 请求实例代码
2016/07/18 PHP
Yii2 如何在modules中添加验证码的方法
2017/06/19 PHP
Laravel 连接(Join)示例
2019/10/16 PHP
PHP执行普通shell命令流程解析
2020/08/24 PHP
用 Javascript 验证表单(form)中的单选(radio)值
2009/09/08 Javascript
基于jquery的横向滚动条(滑动条)
2011/02/24 Javascript
JS判断当前日期是否大于某个日期的实现代码
2012/09/02 Javascript
js 火狐下取本地路径实现思路
2013/04/02 Javascript
A标签触发onclick事件而不跳转的多种解决方法
2013/06/27 Javascript
javascript的解析执行顺序在各个浏览器中的不同
2014/03/17 Javascript
AngularJS内置指令
2015/02/04 Javascript
利用CDN加速react webpack打包后的文件详解
2018/02/22 Javascript
小程序实现展开/收起的效果示例
2018/09/22 Javascript
qrcode生成二维码微信长按无法识别问题的解决
2019/04/04 Javascript
Node.js学习教程之Module模块
2019/09/03 Javascript
vue实现的多页面项目如何优化打包的步骤详解
2020/07/19 Javascript
Python下的twisted框架入门指引
2015/04/15 Python
对Python的Django框架中的项目进行单元测试的方法
2016/04/11 Python
python去除文件中空格、Tab及回车的方法
2016/04/12 Python
Python遍历pandas数据方法总结
2018/02/09 Python
使用Selenium破解新浪微博的四宫格验证码
2018/10/19 Python
python中 * 的用法详解
2019/07/10 Python
Python getattr()函数使用方法代码实例
2020/08/10 Python
使用Python将xmind脑图转成excel用例的实现代码(一)
2020/10/12 Python
澳大利亚领先的内衣店:Bendon Lingerie澳大利亚
2020/05/15 全球购物
用Python匹配HTML tag的时候,<.*>和<.*?>有什么区别
2012/11/04 面试题
生日主持词
2014/03/20 职场文书
安全保卫工作竞聘材料
2014/08/25 职场文书
2016年春季运动会广播稿
2015/08/19 职场文书
公文写作:教你写“建议书”
2019/05/07 职场文书
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
2022/02/12 MySQL