浅谈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 相关文章推荐
Windows下安装python2.7及科学计算套装
Mar 05 Python
python根据出生日期返回年龄的方法
Mar 26 Python
python中安装模块包版本冲突问题的解决
May 02 Python
详解Python实现多进程异步事件驱动引擎
Aug 25 Python
浅谈pandas中DataFrame关于显示值省略的解决方法
Apr 08 Python
基于pip install django失败时的解决方法
Jun 12 Python
windows下pycharm安装、创建文件、配置默认模板
Jul 31 Python
pyqt5的QComboBox 使用模板的具体方法
Sep 06 Python
python实现AES加密与解密
Mar 28 Python
python3.x+pyqt5实现主窗口状态栏里(嵌入)显示进度条功能
Jul 04 Python
Nginx+Uwsgi+Django 项目部署到服务器的思路详解
May 08 Python
使用Python下载抖音各大V视频的思路详解
Feb 06 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
地摊中国 - 珍藏老照片
2020/08/18 杂记
php购物车实现代码
2011/10/10 PHP
奉献出一个封装的curl函数 便于调用(抓数据专用)
2013/07/22 PHP
PHP迭代器的内部执行过程详解
2013/11/12 PHP
PHP框架Swoole定时器Timer特性分析
2014/08/19 PHP
php使用sql server验证连接数据库的方法
2014/12/25 PHP
javascript事件模型代码
2007/07/01 Javascript
js AspxButton的客户端操作
2009/06/26 Javascript
离开页面时检测表单元素是否被修改,提示保存的js代码
2010/08/25 Javascript
javascript时间函数基础介绍
2013/03/28 Javascript
js特殊字符过滤的示例代码
2014/03/05 Javascript
JavaScript导出Excel实例详解
2014/11/25 Javascript
jQuery中nextAll()方法用法实例
2015/01/07 Javascript
JavaScript实现将数组中所有元素连接成一个字符串的方法
2015/04/06 Javascript
浅析location.href跨窗口调用函数
2016/11/22 Javascript
Vue.js实现多条件筛选、搜索、排序及分页的表格功能
2020/11/24 Javascript
深入理解Javascript中的作用域链和闭包
2017/04/25 Javascript
详解如何在项目中使用jest测试react native组件
2018/02/09 Javascript
JavaScript常见JSON操作实例分析
2018/08/08 Javascript
详解如何在vue项目中使用lodop打印插件
2018/09/27 Javascript
javascript/jquery实现点击触发事件的方法分析
2019/11/11 jQuery
在vue中封装的弹窗组件使用队列模式实现方法
2020/07/23 Javascript
H5+css3+js搭建带验证码的登录页面
2020/10/11 Javascript
[01:02]2014 DOTA2国际邀请赛中国区预选赛 现场抢先看
2014/05/22 DOTA
[48:30]LGD vs infamous Supermajor小组赛D组 BO3 第一场 6.3
2018/06/04 DOTA
python中实现定制类的特殊方法总结
2014/09/28 Python
详解python 字符串和日期之间转换 StringAndDate
2017/05/04 Python
解决Python中pandas读取*.csv文件出现编码问题
2019/07/12 Python
PyCharm Anaconda配置PyQt5开发环境及创建项目的教程详解
2020/03/24 Python
python 装饰器的实际作用有哪些
2020/09/07 Python
Nili Lotan官网:Nili Lotan同名品牌
2018/01/07 全球购物
绿化先进工作者事迹材料
2014/01/30 职场文书
实习评语大全
2014/04/26 职场文书
社区活动策划方案
2014/08/21 职场文书
Go语言应该什么情况使用指针
2021/07/25 Golang
一篇文章看懂MySQL主从复制与读写分离
2021/11/07 MySQL