浅谈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正则表达式修复网站文章字体不统一的解决方法
Feb 21 Python
python装饰器使用方法实例
Nov 21 Python
python自动安装pip
Apr 24 Python
python求众数问题实例
Sep 26 Python
用Python代码来绘制彭罗斯点阵的教程
Apr 03 Python
Python简单生成随机姓名的方法示例
Dec 27 Python
Python基本socket通信控制操作示例
Jan 30 Python
对Django 转发和重定向的实例详解
Aug 06 Python
python 并发编程 多路复用IO模型详解
Aug 20 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
Dec 30 Python
python+selenium+Chrome options参数的使用
Mar 18 Python
Python爬虫进阶之爬取某视频并下载的实现
Dec 08 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递归实现无限分类生成下拉列表的函数
2010/08/08 PHP
在PHP中设置、使用、删除Cookie的解决方法
2013/05/06 PHP
PHP输出缓冲控制Output Control系列函数详解
2015/07/02 PHP
PHP文件上传问题汇总(文件大小检测、大文件上传处理)
2015/12/24 PHP
PHP获取远程http或ftp文件的md5值的方法
2019/04/15 PHP
一段利用WSH获取登录时间的jscript代码
2008/05/11 Javascript
用javascript做拖动布局的思路
2008/05/31 Javascript
jquery 新手学习常见问题解决方法
2010/04/18 Javascript
JavaScript 事件系统
2010/07/22 Javascript
判断客户端浏览器是否安装了Flash插件的多种方法
2010/08/11 Javascript
JS 表单验证大全
2011/11/23 Javascript
js实现图片轮换效果代码
2013/04/16 Javascript
jquery $.trim()方法使用介绍
2014/05/21 Javascript
我的Node.js学习之路(四)--单元测试
2014/07/06 Javascript
javaScript的函数对象的声明详解
2015/02/06 Javascript
Jquery实现鼠标移动放大图片功能实例
2015/03/25 Javascript
JQuery悬停控制图片轮播——代码简单
2015/08/05 Javascript
jQuery遍历节点树方法分析
2016/09/08 Javascript
Node.js开启Https的实践详解
2016/10/25 Javascript
React Native 搭建开发环境的方法步骤
2017/10/30 Javascript
gulp安装以及打包合并的方法教程
2017/11/19 Javascript
vue quill editor 使用富文本添加上传音频功能
2020/01/14 Javascript
关于angular 8.1使用过程中的一些记录
2020/11/25 Javascript
python编写爬虫小程序
2015/05/14 Python
使用python批量化音乐文件格式转换的实例
2019/01/09 Python
python opencv将图片转为灰度图的方法示例
2019/07/31 Python
Python文件操作函数用法实例详解
2019/12/24 Python
Python pandas对excel的操作实现示例
2020/07/21 Python
PyCharm 2020.2 安装详细教程
2020/09/25 Python
小区门卫岗位职责
2013/12/31 职场文书
大学校务公开实施方案
2014/03/31 职场文书
2014年法务工作总结
2014/12/11 职场文书
个人工作保证书
2015/02/28 职场文书
党员转正申请报告
2015/05/15 职场文书
大学升旗仪式主持词
2015/07/04 职场文书
Python四款GUI图形界面库介绍
2022/06/05 Python