解决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 urlopen 使用小示例
Sep 06 Python
python实现百度关键词排名查询
Mar 30 Python
详解Python中映射类型的内建函数和工厂函数
Aug 19 Python
Python判断文件或文件夹是否存在的三种方法
Jul 27 Python
Tensorflow 自带可视化Tensorboard使用方法(附项目代码)
Feb 10 Python
Atom的python插件和常用插件说明
Jul 08 Python
详解Python的hasattr() getattr() setattr() 函数使用方法
Jul 09 Python
详解django中url路由配置及渲染方式
Feb 25 Python
python定间隔取点(np.linspace)的实现
Nov 27 Python
python程序需要编译吗
Jun 19 Python
python中添加模块导入路径的方法
Feb 03 Python
pygame面向对象的飞行小鸟实现(Flappy bird)
Apr 01 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
浅析ThinkPHP中execute和query方法的区别
2014/06/13 PHP
PHP JSON出错:Cannot use object of type stdClass as array解决方法
2014/08/16 PHP
经典PHP加密解密函数Authcode()修复版代码
2015/04/05 PHP
PHP析构函数destruct与垃圾回收机制的讲解
2019/03/22 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
JavaScript中null与undefined分析
2009/07/25 Javascript
用js实现层随着内容大小动态渐变改变 推荐
2009/12/19 Javascript
SOSO地图API使用(一)在地图上画圆实现思路与代码
2013/01/15 Javascript
js 控制页面跳转的5种方法
2013/09/09 Javascript
IE下window.onresize 多次调用与死循环bug处理方法介绍
2013/11/12 Javascript
微信小程序  modal弹框组件详解
2016/10/27 Javascript
Angular实现一个简单的多选复选框的弹出框指令实例
2017/04/25 Javascript
解决vue-cli + webpack 新建项目出错的问题
2018/03/20 Javascript
js html实现计算器功能
2018/11/13 Javascript
实例讲解JavaScript预编译流程
2019/01/24 Javascript
使用PreloadJS加载图片资源的基础方法详解
2020/02/03 Javascript
[02:42]决战东方!DOTA2亚洲邀请赛重启荣耀之争
2017/03/17 DOTA
python实现图片批量剪切示例
2014/03/25 Python
Python图像灰度变换及图像数组操作
2016/01/27 Python
Python常用算法学习基础教程
2017/04/13 Python
Python 多线程Threading初学教程
2017/08/22 Python
flask-restful使用总结
2018/12/04 Python
Python中时间datetime的处理与转换用法总结
2019/02/18 Python
Win10下Python3.7.3安装教程图解
2019/07/08 Python
python opencv根据颜色进行目标检测的方法示例
2020/01/15 Python
tensorflow 固定部分参数训练,只训练部分参数的实例
2020/01/20 Python
python 利用panda 实现列联表(交叉表)
2021/02/06 Python
加拿大快时尚零售商:Ardene
2018/02/14 全球购物
澳洲CFL商城:CHEMIST FOR LESS(中文)
2021/02/28 全球购物
SQL里面IN比较快还是EXISTS比较快
2012/07/19 面试题
.NET是怎么支持多种语言的
2015/02/24 面试题
大学生作弊检讨书
2014/02/19 职场文书
党风廉政建设责任书
2014/04/14 职场文书
安全生产管理责任书
2014/04/16 职场文书
实习单位鉴定意见
2015/06/04 职场文书
java获取一个文本文件的编码(格式)信息
2022/09/23 Java/Android