浅谈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函数中参数的使用及默认参数的陷阱
Mar 13 Python
python使用pymysql实现操作mysql
Sep 13 Python
Python正则表达式非贪婪、多行匹配功能示例
Aug 08 Python
Python机器学习算法之k均值聚类(k-means)
Feb 23 Python
8种用Python实现线性回归的方法对比详解
Jul 10 Python
python列表插入append(), extend(), insert()用法详解
Sep 14 Python
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
Sep 17 Python
Python使用Pandas读写Excel实例解析
Nov 19 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
Dec 02 Python
python数据分析工具之 matplotlib详解
Apr 09 Python
python rsa-oaep加密的示例代码
Sep 23 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
Sep 28 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
基于header的一些常用指令详解
2013/06/06 PHP
ThinkPHP调用百度翻译类实现在线翻译
2014/06/26 PHP
php中preg_replace正则替换用法分析【一次替换多个值】
2017/01/17 PHP
PHPstorm快捷键(分享)
2017/07/17 PHP
PHP压缩图片功能的介绍
2019/03/21 PHP
javascript 表单验证常见正则
2009/09/28 Javascript
jQuery实现可拖动的浮动层完整代码
2013/05/27 Javascript
jQuery实现点击该行即可删除HTML表格行
2014/10/17 Javascript
Javascript实现Web颜色值转换
2015/02/05 Javascript
基于JavaScript实现弹出框效果
2016/02/19 Javascript
javascript实现PC网页里的拖拽效果
2016/03/14 Javascript
利用JS提交表单的几种方法和验证(必看篇)
2016/09/17 Javascript
JS填写银行卡号每隔4位数字加一个空格
2016/12/19 Javascript
javascript设计模式之策略模式学习笔记
2017/02/15 Javascript
详解Vue2.0 事件派发与接收
2017/09/05 Javascript
静态页面实现 include 引入公用代码的示例
2017/09/25 Javascript
详解VueJs中的V-bind指令
2018/05/03 Javascript
JQuery+Bootstrap 自定义全屏Loading插件的示例demo
2019/07/03 jQuery
vue实例的选项总结
2020/06/09 Javascript
python实现探测socket和web服务示例
2014/03/28 Python
分析在Python中何种情况下需要使用断言
2015/04/01 Python
Python探索之爬取电商售卖信息代码示例
2017/10/27 Python
django如何连接已存在数据的数据库
2018/08/14 Python
python使用ddt过程中遇到的问题及解决方案【推荐】
2018/10/29 Python
python批量获取html内body内容的实例
2019/01/02 Python
一篇文章了解Python中常见的序列化操作
2019/06/20 Python
如何在windows下安装配置python工具Ulipad
2020/10/27 Python
Jo Malone美国官网:祖玛珑香水
2017/03/27 全球购物
Marlies Dekkers内衣荷兰官方网店:荷兰奢侈内衣品牌
2020/03/27 全球购物
怎么可以提高数据库查询数据的速度
2014/06/28 面试题
计算机专业大学生的自我评价
2013/11/14 职场文书
餐饮业员工工作决心书
2014/03/11 职场文书
2015年药店店长工作总结
2015/04/29 职场文书
今日说法观后感
2015/06/08 职场文书
正规欠条模板
2015/07/03 职场文书
nginx结合openssl实现https的方法
2021/07/25 Servers