浅谈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 计算文件的md5值实例
Jan 13 Python
python实现12306抢票及自动邮件发送提醒付款功能
Mar 08 Python
django 删除数据库表后重新同步的方法
May 27 Python
python按照多个条件排序的方法
Feb 08 Python
更新pip3与pyttsx3文字语音转换的实现方法
Aug 08 Python
Python matplotlib以日期为x轴作图代码实例
Nov 22 Python
Python处理PDF与CDF实例
Feb 26 Python
Python decorator拦截器代码实例解析
Apr 04 Python
django queryset 去重 .distinct()说明
May 19 Python
使用Python实现微信拍一拍功能的思路代码
Jul 09 Python
python 下划线的不同用法
Oct 24 Python
关于python pygame游戏进行声音添加的技巧
Oct 24 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
咖啡与牛奶
2021/03/03 冲泡冲煮
在PHP中使用与Perl兼容的正则表达式
2006/11/26 PHP
php利用fsockopen GET/POST提交表单及上传文件
2017/05/22 PHP
深入浅析PHP的session反序列化漏洞问题
2017/06/15 PHP
JS学习之一个简易的日历控件
2010/03/24 Javascript
jQuery 表单验证扩展代码(一)
2010/10/11 Javascript
juqery 学习之五 文档处理 包裹、替换、删除、复制
2011/02/11 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
2014/05/04 Javascript
JQuery CheckBox(复选框)操作方法汇总
2015/04/15 Javascript
AngularJS基础 ng-copy 指令实例代码
2016/08/01 Javascript
JavaScript中removeChild 方法开发示例代码
2016/08/15 Javascript
js浏览器html5表单验证
2016/10/17 Javascript
JavaScript实现图片轮播组件代码示例
2016/11/22 Javascript
微信小程序 动态的设置图片的高度和宽度详解及实例代码
2017/02/24 Javascript
Javascript中click与blur事件的顺序详析
2017/04/25 Javascript
jquery实现吸顶导航效果
2020/01/08 jQuery
Node.js API详解之 console模块用法详解
2020/05/12 Javascript
[44:39]2014 DOTA2国际邀请赛中国区预选赛 NE VS CNB
2014/05/21 DOTA
Python二分查找详解
2015/09/13 Python
详解将Django部署到Centos7全攻略
2018/09/26 Python
Django JWT Token RestfulAPI用户认证详解
2019/01/23 Python
浅析python内置模块collections
2019/11/15 Python
Python拼接字符串的7种方式详解
2020/03/19 Python
Python Handler处理器和自定义Opener原理详解
2020/03/05 Python
django 前端页面如何实现显示前N条数据
2020/03/16 Python
Python如何根据时间序列数据作图
2020/05/12 Python
python rsa-oaep加密的示例代码
2020/09/23 Python
Python爬虫之Selenium实现关闭浏览器
2020/12/04 Python
Python 爬虫批量爬取网页图片保存到本地的实现代码
2020/12/24 Python
日本最新流行服饰网购:Nissen
2016/07/24 全球购物
Orlebar Brown官网:设计师泳裤和泳装
2020/12/08 全球购物
女方回门宴答谢词
2014/01/14 职场文书
教师辞职报告范文
2014/01/20 职场文书
文明村创建实施方案
2014/03/27 职场文书
公司新员工欢迎词
2015/09/30 职场文书
大学生暑期社会实践的个人总结!
2019/07/17 职场文书