浅谈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处理PHP数组文本文件实例
Sep 18 Python
python对数组进行反转的方法
May 20 Python
浅谈Python浅拷贝、深拷贝及引用机制
Dec 15 Python
Python学习入门之区块链详解
Jul 25 Python
Python竟能画这么漂亮的花,帅呆了(代码分享)
Nov 15 Python
Python设计模式之原型模式实例详解
Jan 18 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
Jun 21 Python
python线程信号量semaphore使用解析
Nov 30 Python
Python3创建Django项目的几种方法(3种)
Jun 03 Python
python实现将中文日期转换为数字日期
Jul 14 Python
python-jwt用户认证食用教学的实现方法
Jan 19 Python
Python import模块的缓存问题解决方案
Jun 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
PHP中CURL的CURLOPT_POSTFIELDS参数使用细节
2014/03/17 PHP
PHP socket 模拟POST 请求实例代码
2016/07/18 PHP
学习YUI.Ext 第四天--对话框Dialog的使用
2007/03/10 Javascript
javascript Onunload与Onbeforeunload使用小结
2009/12/31 Javascript
js选择并转移导航菜单示例代码
2014/08/19 Javascript
jQuery插件开发的五种形态小结
2015/03/04 Javascript
JavaScript中实现map功能代码分享
2015/06/11 Javascript
对JavaScript客户端应用编程的一些建议
2015/06/24 Javascript
JavaScript提高性能知识点汇总
2016/01/15 Javascript
js实现无缝循环滚动
2020/06/23 Javascript
微信小程序 window_x64环境搭建
2016/09/30 Javascript
功能强大的jquery.validate表单验证插件
2016/11/07 Javascript
浅谈js在html中的加载执行顺序,多个jquery ready执行顺序
2016/11/26 Javascript
JavaScript版经典游戏之扫雷游戏完整示例【附demo源码下载】
2016/12/12 Javascript
AngularJS报错$apply already in progress的解决方法分析
2017/01/30 Javascript
JS实现的五级联动菜单效果完整实例
2017/02/23 Javascript
javascript简单链式调用案例分析
2017/05/10 Javascript
EasyUI框架 使用Ajax提交注册信息的实现代码
2017/09/27 Javascript
基于three.js编写的一个项目类示例代码
2018/01/05 Javascript
小程序如何使用分包加载的实现方法
2019/05/22 Javascript
vue实现计步器功能
2019/11/01 Javascript
Vue中点击active并第一个默认选中功能的实现
2020/02/24 Javascript
Vue-cli打包后如何本地查看的操作
2020/09/02 Javascript
js获取url页面id,也就是最后的数字文件名
2020/09/25 Javascript
go和python变量赋值遇到的一个问题
2017/08/31 Python
基于python实现简单日历
2018/07/28 Python
Python弹出输入框并获取输入值的实例
2019/06/18 Python
python的scipy实现插值的示例代码
2019/11/12 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
2019/12/30 Python
详解Python中list[::-1]的几种用法
2020/11/16 Python
Django使用django-simple-captcha做验证码的实现示例
2021/01/07 Python
2014班子成员自我剖析材料思想汇报
2014/10/01 职场文书
2014年幼儿园园长工作总结
2014/12/17 职场文书
离婚被告代理词
2015/05/23 职场文书
预备党员介绍人意见
2015/06/01 职场文书
解决mysql的int型主键自增问题
2021/07/15 MySQL