解决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中的cookielib模拟登录网站
Apr 09 Python
Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法
Sep 08 Python
ubuntu安装mysql pycharm sublime
Feb 20 Python
pycharm中使用anaconda部署python环境的方法步骤
Dec 19 Python
Python Pexpect库的简单使用方法
Jan 29 Python
Python中按键来获取指定的值
Mar 02 Python
python单线程下实现多个socket并发过程详解
Jul 27 Python
Python3实现个位数字和十位数字对调, 其乘积不变
May 03 Python
Python打印不合法的文件名
Jul 31 Python
python3.5的包存放的具体路径
Aug 16 Python
如何设置PyCharm中的Python代码模版(推荐)
Nov 20 Python
Python json解析库jsonpath原理及使用示例
Nov 25 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
十天学会php(3)
2006/10/09 PHP
PHP中对数据库操作的封装
2006/10/09 PHP
PHP chmod 函数与批量修改文件目录权限
2010/05/10 PHP
深入解读php中关于抽象(abstract)类和抽象方法的问题分析
2014/01/03 PHP
从零开始学YII2框架(六)高级应用程序模板
2014/08/20 PHP
php  单例模式详细介绍及实现源码
2016/11/05 PHP
PHP工厂模式简单实现方法示例
2018/05/23 PHP
JavaScript中判断整字类型最简洁的实现方法
2014/11/08 Javascript
js动态切换图片的方法
2015/01/20 Javascript
JQuery跳出each循环的方法
2015/04/16 Javascript
jQuery实现单击弹出Div层窗口效果(可关闭可拖动)
2015/09/19 Javascript
vue.js指令v-model实现方法
2016/12/05 Javascript
详解前端路由实现与react-router使用姿势
2017/08/07 Javascript
vue最简单的前后端交互示例详解
2018/10/11 Javascript
微信小程序自定义带价格显示日历效果
2018/12/29 Javascript
了解前端理论:rscss和rsjs
2019/05/23 Javascript
Vue+Element实现表格编辑、删除、以及新增行的最优方法
2019/05/28 Javascript
Element 默认勾选表格 toggleRowSelection的实现
2019/09/04 Javascript
Windows下PyMongo下载及安装教程
2015/04/27 Python
python中map()函数的使用方法示例
2017/09/29 Python
浅析Python 读取图像文件的性能对比
2019/03/07 Python
使用Python的SymPy库解决数学运算问题的方法
2019/03/27 Python
Python3 mmap内存映射文件示例解析
2020/03/23 Python
Python如何实现自带HTTP文件传输服务
2020/07/08 Python
html5使用html2canvas实现浏览器截图的示例
2017/08/31 HTML / CSS
关于canvas.toDataURL 在iOS运行失败的问题解决
2020/09/16 HTML / CSS
Eastbay官网:美国最大的运动鞋网络零售商
2016/07/27 全球购物
StudentUniverse英国:学生航班、酒店和旅游
2019/08/25 全球购物
旅游管理实习自我鉴定
2013/09/29 职场文书
优乐美广告词
2014/03/14 职场文书
读书小明星事迹材料
2014/05/03 职场文书
化学工程专业求职信
2014/08/10 职场文书
流动人口婚育证明范本
2014/09/26 职场文书
大学毕业晚会开场白
2015/05/29 职场文书
10大幻兽系恶魔果实 蝙蝠果实上榜,第一自愈能力强
2022/03/18 日漫
CSS使用SVG实现动态分布的圆环发散路径动画
2022/12/24 HTML / CSS