浅谈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遍历类中所有成员的方法
Mar 18 Python
Python判断文本中消息重复次数的方法
Apr 27 Python
python实现神经网络感知器算法
Dec 20 Python
python使用matplotlib库生成随机漫步图
Aug 27 Python
对Python的zip函数妙用,旋转矩阵详解
Dec 13 Python
Python计算库numpy进行方差/标准方差/样本标准方差/协方差的计算
Dec 28 Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
Feb 22 Python
Python日期时间Time模块实例详解
Apr 15 Python
windows系统中Python多版本与jupyter notebook使用虚拟环境的过程
May 15 Python
python基于K-means聚类算法的图像分割
Oct 30 Python
pytorch 图像中的数据预处理和批标准化实例
Jan 15 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
Mar 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
全国FM电台频率大全 - 14 江西省
2020/03/11 无线电
Zend的Registry机制的使用说明
2013/05/02 PHP
Codeigniter操作数据库表的优化写法总结
2014/06/12 PHP
Laravel框架中实现使用阿里云ACE缓存服务
2015/02/10 PHP
php使用number_format函数截取小数的方法分析
2016/05/27 PHP
详解EventDispatcher事件分发组件
2016/12/25 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
2020/03/23 PHP
tp5.1 框架路由操作-URL生成实例分析
2020/05/26 PHP
PHP 8新特性简介
2020/08/18 PHP
fckeditor 获取文本框值的实现代码
2009/02/09 Javascript
JS 图片缩放效果代码
2010/06/09 Javascript
jQuery中的.bind()、.live()和.delegate()之间区别分析
2011/06/08 Javascript
iframe异步加载实现点击左边菜单加载右边内容实例讲解
2013/03/04 Javascript
JQuery调用绑定click事件的3种写法
2015/03/28 Javascript
JavaScrip常见的一些算法总结
2015/12/28 Javascript
Kindeditor单独调用多图上传实例
2017/07/31 Javascript
JavaScript实现动态添加Form表单元素的方法示例
2017/08/14 Javascript
浅谈React和Redux的连接react-redux
2017/12/04 Javascript
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
在vue中实现禁止屏幕滚动,禁止屏幕滑动
2020/07/22 Javascript
Vue单文件组件开发实现过程详解
2020/07/30 Javascript
Antd-vue Table组件添加Click事件,实现点击某行数据教程
2020/11/17 Javascript
python实现简单的TCP代理服务器
2014/10/08 Python
python多进程中的内存复制(实例讲解)
2018/01/05 Python
深入理解Python爬虫代理池服务
2018/02/28 Python
详解通过API管理或定制开发ECS实例
2018/09/30 Python
在numpy矩阵中令小于0的元素改为0的实例
2019/01/26 Python
基于python的BP神经网络及异或实现过程解析
2019/09/30 Python
python上下文管理器异常问题解决方法
2021/02/07 Python
澳大利亚手袋、珠宝和在线时尚精品店:The Way
2019/12/21 全球购物
如何撰写岗位职责
2014/02/01 职场文书
中学教师师德师风承诺书
2015/04/28 职场文书
结婚堵门保证书
2015/05/08 职场文书
大学副班长竞选稿
2015/11/21 职场文书
班级班风口号大全
2015/12/25 职场文书
公务员的复习计划书,请收下!
2019/07/15 职场文书