浅谈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解析XML的四种方式
Mar 30 Python
基于Python实现的ID3决策树功能示例
Jan 02 Python
python实现聚类算法原理
Feb 12 Python
python保存网页图片到本地的方法
Jul 24 Python
python求绝对值的三种方法小结
Dec 04 Python
python-xpath获取html文档的部分内容
Mar 06 Python
聊聊python中的异常嵌套
Sep 01 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
Sep 21 Python
Python使用socket_TCP实现小文件下载功能
Oct 09 Python
python更新数据库中某个字段的数据(方法详解)
Nov 18 Python
python将下载到本地m3u8视频合成MP4的代码详解
Nov 24 Python
Python并发编程实例教程之线程的玩法
Jun 20 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中使用crypt()实现用户身份验证的代码
2012/09/05 PHP
Destoon模板制作简明教程
2014/06/20 PHP
PHP中预定义的6种接口介绍
2015/05/12 PHP
PHP实现十进制、二进制、八进制和十六进制转换相关函数用法分析
2017/04/25 PHP
兼容ie、firefox的图片自动缩放的css跟js代码分享
2013/08/12 Javascript
使用javascript实现Iframe自适应高度
2014/12/24 Javascript
javascript事件委托的方式绑定详解
2015/06/10 Javascript
JavaScript制作淘宝星级评分效果的思路
2020/06/23 Javascript
学习jQuey中的return false
2015/12/18 Javascript
jQuery实现背景弹性滚动的导航效果
2016/06/01 Javascript
jQuery实现弹出窗口弹出div层的实例代码
2017/01/09 Javascript
超全面的vue.js使用总结
2017/02/12 Javascript
Vue2 Vue-cli中使用Typescript的配置详解
2017/07/24 Javascript
vue与TypeScript集成配置最简教程(推荐)
2017/10/17 Javascript
js实现上传并压缩图片效果
2018/01/10 Javascript
详解react-refetch的使用小例子
2019/02/15 Javascript
微信小程序设置全局请求URL及封装wx.request请求操作示例
2019/04/02 Javascript
[44:09]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第二局
2016/02/25 DOTA
用Python编写脚本使IE实现代理上网的教程
2015/04/23 Python
python通过opencv实现批量剪切图片
2017/11/13 Python
python得到qq句柄,并显示在前台的方法
2018/10/14 Python
Python 加密与解密小结
2018/12/06 Python
python实现栅栏加解密 支持密钥加密
2019/03/20 Python
Python搭建HTTP服务过程图解
2019/12/14 Python
如何用python写个模板引擎
2021/01/14 Python
Python制作运行进度条的实现效果(代码运行不无聊)
2021/02/24 Python
x-ua-compatible content=”IE=7, IE=9″意思理解
2013/07/22 HTML / CSS
美国求婚钻戒网站:Super Jeweler
2016/08/27 全球购物
美国和加拿大房车出售在线分类广告:RVT.com
2018/04/23 全球购物
电子商务专业个人的自我评价
2013/12/19 职场文书
《临死前的严监生》教学反思
2014/02/13 职场文书
毕业论文指导教师评语
2014/12/30 职场文书
2016天猫双十一广告语
2016/01/28 职场文书
详解Redis基本命令与使用场景
2021/06/01 Redis
Python函数中的不定长参数相关知识总结
2021/06/24 Python
详解Java线程池是如何重复利用空闲线程的
2021/06/26 Java/Android