浅谈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实现爬虫统计学校BBS男女比例(一)
Dec 31 Python
基于Python和Scikit-Learn的机器学习探索
Oct 16 Python
Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】
Dec 15 Python
基于Django用户认证系统详解
Feb 21 Python
python线程池threadpool使用篇
Apr 27 Python
详解10个可以快速用Python进行数据分析的小技巧
Jun 24 Python
python读取tif图片时保留其16bit的编码格式实例
Jan 13 Python
浅谈keras.callbacks设置模型保存策略
Jun 18 Python
python设置表格边框的具体方法
Jul 17 Python
Python模块zipfile原理及使用方法详解
Aug 04 Python
python自动化测试三部曲之request+django实现接口测试
Oct 07 Python
Python 数据可视化之Seaborn详解
Nov 02 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
在windows服务器开启php的gd库phpinfo中未发现
2013/01/13 PHP
php生成html文件方法总结
2014/12/01 PHP
PHP实现的登录,注册及密码修改功能分析
2016/11/25 PHP
thinkPHP5.0框架模块设计详解
2017/03/18 PHP
PHP给前端返回一个JSON对象的实例讲解
2018/05/31 PHP
javascript代码运行不出来执行错误的可能情况整理
2013/10/18 Javascript
JS实现一个列表中包含上移下移删除等功能
2014/09/24 Javascript
js精美的幻灯片画集特效代码分享
2015/08/29 Javascript
深入分析jQuery的ready函数是如何工作的(工作原理)
2015/12/17 Javascript
jQuery实现布局高宽自适应的简单实例
2016/05/28 Javascript
微信小程序 animation API详解及实例代码
2016/10/08 Javascript
JavaScript在form表单中使用button按钮实现submit提交方法
2017/01/23 Javascript
iview给radio按钮组件加点击事件的实例
2017/09/30 Javascript
ES6 javascript中Class类继承用法实例详解
2017/10/30 Javascript
bootstrap fileinput插件实现预览上传照片功能
2018/01/23 Javascript
在vue中使用css modules替代scroped的方法
2018/03/10 Javascript
jQuery实现鼠标滑过商品小图片上显示对应大图片功能【测试可用】
2018/04/27 jQuery
vue中使用elementUI组件手动上传图片功能
2019/12/13 Javascript
微信小程序云函数添加数据到数据库的方法
2020/03/04 Javascript
vue form表单post请求结合Servlet实现文件上传功能
2021/01/22 Vue.js
Python+Pandas 获取数据库并加入DataFrame的实例
2018/07/25 Python
python语音识别实践之百度语音API
2018/08/30 Python
python help函数实例用法
2020/12/06 Python
python-jwt用户认证食用教学的实现方法
2021/01/19 Python
如何用Python和JS实现的Web SSH工具
2021/02/23 Python
北美三大旅游网站之一:Travelocity加拿大
2016/08/20 全球购物
Gap中国官网:美式休闲风服饰
2017/02/05 全球购物
空指针到底是什么
2012/08/07 面试题
大学校园活动策划书
2014/02/04 职场文书
差生评语大全
2014/05/04 职场文书
城管执法人员纪律作风整顿思想汇报
2014/09/13 职场文书
研究生简历自我评价范文
2014/09/13 职场文书
八荣八耻演讲稿
2014/09/15 职场文书
客户答谢会致辞
2015/07/30 职场文书
Python爬虫之自动爬取某车之家各车销售数据
2021/06/02 Python
Pycharm连接远程服务器并远程调试的全过程
2021/06/24 Python