浅谈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中的round()方法
May 15 Python
python3设计模式之简单工厂模式
Oct 17 Python
Sanic框架Cookies操作示例
Jul 17 Python
基于python实现高速视频传输程序
May 05 Python
Python字符串处理的8招秘籍(小结)
Aug 13 Python
python3 selenium自动化 下拉框定位的例子
Aug 23 Python
python分布式编程实现过程解析
Nov 08 Python
在python3中实现更新界面
Feb 21 Python
详解Python IO口多路复用
Jun 17 Python
python matplotlib绘制三维图的示例
Sep 24 Python
python字符串拼接.join()和拆分.split()详解
Nov 23 Python
Django中celery的使用项目实例
Jul 07 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实现下载功能的代码
2012/09/29 PHP
PHP截断标题且兼容utf8和gb2312编码
2013/09/22 PHP
php全角字符转换为半角函数
2014/02/07 PHP
PHP实现统计在线人数功能示例
2016/10/15 PHP
解决FLASH需要点击激活的代码
2006/12/20 Javascript
JavaScript的漂亮的代码片段
2013/06/05 Javascript
jQuery学习笔记之 Ajax操作篇(二) - 数据传递
2014/06/23 Javascript
jquery自定义表格样式
2015/11/23 Javascript
移动端 一个简单易懂的弹出框
2016/07/06 Javascript
AngularJS ng-template寄宿方式用法分析
2016/11/07 Javascript
基于jQuery和Bootstrap框架实现仿知乎前端动态列表效果
2016/11/09 Javascript
javascript中的深复制详解及实例分析
2016/12/29 Javascript
jQuery中table数据的值拷贝和拆分
2017/03/19 Javascript
vue2.0之多页面的开发的示例
2018/01/30 Javascript
element-ui 表格数据时间格式化的方法
2018/08/24 Javascript
vue路由前进后退动画效果的实现代码
2018/12/10 Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
2019/12/21 Javascript
解决vue数据不实时更新的问题(数据更改了,但数据不实时更新)
2020/10/27 Javascript
如何在JavaScript中正确处理变量
2020/12/25 Javascript
[01:46]新英雄登场
2019/09/10 DOTA
Python中字典创建、遍历、添加等实用操作技巧合集
2015/06/02 Python
Python对象转JSON字符串的方法
2016/04/27 Python
Python常见加密模块用法分析【MD5,sha,crypt模块】
2017/05/24 Python
python学习之matplotlib绘制散点图实例
2017/12/09 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
2018/02/21 Python
Django 表单模型选择框如何使用分组
2019/05/16 Python
pytorch多GPU并行运算的实现
2019/09/27 Python
Python2.x与3​​.x版本有哪些区别
2020/07/09 Python
一款纯css3实现的圆形旋转分享按钮旋转角度可自己调整
2014/09/02 HTML / CSS
海淘零差价,宝贝全球购: 宝贝格子
2016/08/24 全球购物
电大物流学生的自我评价
2013/10/25 职场文书
竞选宣传委员演讲稿
2014/05/24 职场文书
个人求职自荐信范文
2014/06/20 职场文书
巾帼标兵事迹材料
2014/12/26 职场文书
欢送会主持词
2015/07/01 职场文书
Python中异常处理用法
2021/11/27 Python