解决tensorflow训练时内存持续增加并占满的问题


Posted in Python onJanuary 19, 2020

记录一次小白的tensorflow学习过程,也为有同样困扰的小白留下点经验。

先说我出错和解决的过程。在做风格迁移实验时,使用预加载权重的VGG19网络正向提取中间层结果,结果因为代码不当,在遍历图片提取时内存持续增长,导致提取几十个图片的特征内存就满了。

原因是在对每一张图片正向传播结束后,都会在留下中间信息。具体地说是在我将正向传播的代码与模型的代码分离了,在每次遍历图片时都会正向传播,在tensorflow中新增加了很多的计算节点(如tf.matmul等等),导致内存中遗留了大量的过期信息。

纠正的做法就是一个前提:避免在循环训练图片时额外使用tf计算资源。

使用placeholder作为输入数据的入口,在模型中定义需要使用的函数,包括正向传播。不要在遍历图片时额外使用tf计算。

遇到这种问题一定要回头检查代码,尤其是在别人写的代码基础上改时。 多学习公开的源码。

错误示例:

def build_model(model_path):
  model_input = tf.placeholder('float32', [1, IMAGE_HEIGHT, IMAGE_WIDTH, COLOR_CHANNELS])
  vec1 = ...
  ...... 
  return model_input,vec1
  
def get_style_represent(vec):
  # 一些tf计算操作
  return new_vec

with tf.Session() as sess:
  sess.run(tf.global_variables_initializer())
  img_input,vec1 = build_model(VGG19_MODEL)    # 加载模型
  for cur_img_path in imgs_path_list:   # 遍历图片
    cur_img = load_image(cur_img_path)
    vec1_out = sess.run(vec1, feed_dict = {img_input:cur_img})   # 正向传播输出模型中的vec1
    # 对vec1进行一些处理,此处在遍历图片时额外使用了tensorflow的计算节点,导致在内存中遗留信息
    new_vec = get_style_represent(vec1_out)

正确示例:

def build_model(model_path):
  model_input = tf.placeholder('float32', [1, IMAGE_HEIGHT, IMAGE_WIDTH, COLOR_CHANNELS])
  vec1 = ...
  ...... 
  new_vec = ...    # 将get_style_represent计算操作定义在模型中
  return model_input,vec1,new_vec

with tf.Session() as sess:
  sess.run(tf.global_variables_initializer())
  img_input,vec1,new_vec = build_model(VGG19_MODEL)
  for cur_img_path in imgs_path_list:
    cur_img = load_image(cur_img_path)
    # 一次正向传播将处理后的vec1也得到了,避免在每次图片正向传播时留下额外信息
    vec1_out,new_vec_out = sess.run([vec1,new_vec], feed_dict = {img_input:cur_img})

所以,如果你也遇到了同样的问题,不妨看一下你是不是在迭代过程中额外使用了新的tf计算节点吧。

以上这篇解决tensorflow训练时内存持续增加并占满的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python调用新浪微博API项目实践
Jul 28 Python
Python中请使用isinstance()判断变量类型
Aug 25 Python
python获取从命令行输入数字的方法
Apr 29 Python
python脚本监控docker容器
Apr 27 Python
python爬虫使用cookie登录详解
Dec 27 Python
Python解决N阶台阶走法问题的方法分析
Dec 28 Python
python dataframe向下向上填充,fillna和ffill的方法
Nov 28 Python
Python GUI编程完整示例
Apr 04 Python
python获取点击的坐标画图形的方法
Jul 09 Python
Python tkinter和exe打包的方法
Feb 05 Python
解决json中ensure_ascii=False的问题
Apr 03 Python
python 实现的截屏工具
May 08 Python
Tensorflow获取张量Tensor的具体维数实例
Jan 19 #Python
tensorflow 重置/清除计算图的实现
Jan 19 #Python
TensorFlow2.0:张量的合并与分割实例
Jan 19 #Python
tensorflow中tf.slice和tf.gather切片函数的使用
Jan 19 #Python
tensorflow实现对张量数据的切片操作方式
Jan 19 #Python
python系统指定文件的查找只输出目录下所有文件及文件夹
Jan 19 #Python
Python插入Elasticsearch操作方法解析
Jan 19 #Python
You might like
MayFish PHP的MVC架构的开发框架
2009/08/13 PHP
PHP设计模式之代理模式的深入解析
2013/06/13 PHP
PHP实现查询手机归属地的方法详解
2017/04/28 PHP
老生常谈php中传统验证与thinkphp框架(必看篇)
2017/06/10 PHP
PHP开发的微信现金红包功能示例
2017/06/29 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
laravel使用数据库测试注意事项
2020/04/10 PHP
BOOM vs RR BO3 第二场2.13
2021/03/10 DOTA
ASP Json Parser修正版
2009/12/06 Javascript
javascript中的toFixed固定小数位数 简单实例分享
2013/07/12 Javascript
js中arguments的用法(实例讲解)
2013/11/30 Javascript
JS window对象的top、parent、opener含义介绍
2013/12/03 Javascript
jquery禁止回车触发表单提交
2014/12/12 Javascript
实例解析ES6 Proxy使用场景介绍
2018/01/08 Javascript
微信小程序使用gitee进行版本管理
2018/09/20 Javascript
JQuery插件tablesorter表格排序实现过程解析
2020/05/28 jQuery
vue 接口请求地址前缀本地开发和线上开发设置方式
2020/08/13 Javascript
JavaScript实现商品评价五星好评
2020/11/30 Javascript
JavaScript实现滑块验证解锁
2021/01/07 Javascript
[01:20]DOTA2 2017国际邀请赛冠军之路无止竞
2017/06/19 DOTA
[36:45]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python基础教程之常用运算符
2014/08/29 Python
Python实现从脚本里运行scrapy的方法
2015/04/07 Python
python通过索引遍历列表的方法
2015/05/04 Python
简单介绍Python中的try和finally和with方法
2015/05/05 Python
python matplotlib画图库学习绘制常用的图
2019/03/19 Python
SpringBoot实现登录注册常见问题解决方案
2020/03/04 Python
简单了解Python字典copy与赋值的区别
2020/09/16 Python
美国领先的奢侈手表在线零售商:WatchMaxx
2017/12/17 全球购物
日本快乐生活方式购物网站:Shop Japan
2018/07/17 全球购物
您熟悉ORM(Object-Relation Mapping)吗?请谈谈您所理解的ORM
2016/02/08 面试题
广州御银科技股份有限公司试卷(C++)
2016/11/04 面试题
电子商务专业推荐信范文
2013/12/02 职场文书
企业形象策划方案
2014/05/29 职场文书
2014年施工员工作总结
2014/11/18 职场文书
七年级写作指导之游记作文
2019/10/07 职场文书