解决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获取DLL和EXE文件版本号的方法
Mar 10 Python
Python 含参构造函数实例详解
May 25 Python
python实现神经网络感知器算法
Dec 20 Python
python实现二叉查找树实例代码
Feb 08 Python
pandas数据预处理之dataframe的groupby操作方法
Apr 13 Python
Python使用crontab模块设置和清除定时任务操作详解
Apr 09 Python
对Python中class和instance以及self的用法详解
Jun 26 Python
Python画图高斯分布的示例
Jul 10 Python
python实现多进程通信实例分析
Sep 01 Python
python3图片文件批量重命名处理
Oct 31 Python
基于Python中的yield表达式介绍
Nov 19 Python
Matlab中plot基本用法的具体使用
Jul 17 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
短波的认识
2021/03/01 无线电
php并发对MYSQL造成压力的解决方法
2013/02/21 PHP
php图像处理函数大全(推荐收藏)
2013/07/11 PHP
一个PHP的远程图片抓取函数分享
2013/09/25 PHP
php检测文本的编码
2015/07/26 PHP
JavaScript高级程序设计 阅读笔记(十四) js继承机制的实现
2012/08/14 Javascript
Javascript基础教程之JavaScript语法
2015/01/18 Javascript
jscript读写二进制文件的方法
2015/04/22 Javascript
jQuery中serializeArray()与serialize()的区别实例分析
2015/12/09 Javascript
Javascript HTML5 Canvas实现的一个画板
2020/04/12 Javascript
JS实现的自定义显示加载等待图片插件(loading.gif)
2016/06/17 Javascript
微信小程序 条件渲染详解
2016/10/09 Javascript
微信小程序 详解Page中data数据操作和函数调用
2017/01/12 Javascript
Angular中响应式表单的三种更新值方法详析
2017/08/22 Javascript
React + webpack 环境配置的方法步骤
2017/09/07 Javascript
js判断传入时间和当前时间大小实例(超简单)
2018/01/11 Javascript
mint-ui在vue中的使用示例
2018/04/05 Javascript
浅谈如何通过node.js对数据进行MD5加密
2018/05/16 Javascript
在小程序中集成redux/immutable/thunk第三方库的方法
2018/08/12 Javascript
详解VUE项目中安装和使用vant组件
2019/04/28 Javascript
vuex的使用步骤
2021/01/06 Vue.js
python字符串排序方法
2014/08/29 Python
Python File readlines() 使用方法
2018/03/19 Python
Python在centos7.6上安装python3.9的详细教程(默认python版本为2.7.5)
2020/10/15 Python
HTML5之SVG 2D入门8—文档结构及相关元素总结
2013/01/30 HTML / CSS
美国在线面料商店:Online Fabric Store
2018/07/26 全球购物
Tessabit美国:集世界奢侈品和设计师品牌的意大利精品买手店
2020/06/29 全球购物
OnePlus加拿大官网:中国国际化手机品牌
2020/10/13 全球购物
桥梁与隧道工程专业本科生求职信
2013/10/08 职场文书
2014年高三毕业生自我评价
2014/01/11 职场文书
三个儿子教学反思
2014/02/03 职场文书
环保倡议书400字
2014/05/15 职场文书
感恩教师节演讲稿
2014/09/03 职场文书
一篇文章带你深入了解Mysql触发器
2021/08/02 MySQL
vue项目支付功能代码详解
2022/02/18 Vue.js
Python 操作pdf pdfplumber读取PDF写入Exce
2022/08/14 Python