解决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操作日期和时间的方法
Mar 11 Python
mysql 之通过配置文件链接数据库
Aug 12 Python
Python多线程中阻塞(join)与锁(Lock)使用误区解析
Apr 27 Python
Python全局变量与局部变量区别及用法分析
Sep 03 Python
5分钟 Pipenv 上手指南
Dec 20 Python
对python中if语句的真假判断实例详解
Feb 18 Python
python儿童学游戏编程知识点总结
Jun 03 Python
python经典趣味24点游戏程序设计
Jul 26 Python
Python3实现zip分卷压缩过程解析
Oct 09 Python
Flask框架 CSRF 保护实现方法详解
Oct 30 Python
使用python实现回文数的四种方法小结
Nov 24 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
Apr 15 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
用mysql内存表来代替php session的类
2009/02/01 PHP
几道坑人的PHP面试题 试试看看你会不会也中招
2014/08/19 PHP
PHP清除数组中所有字符串两端空格的方法
2014/10/20 PHP
thinkPHP5.0框架自动加载机制分析
2017/03/18 PHP
JS事件Event元素(兼容IE,Firefox,Chorme)
2012/11/01 Javascript
jQuery中:first-child选择器用法实例
2014/12/31 Javascript
JS实现中国公民身份证号码有效性验证
2017/02/20 Javascript
JavaScript通过改变文字透明度实现的文字闪烁效果实例
2017/04/27 Javascript
webpack4.x打包过程详解
2018/07/18 Javascript
vue 对象添加或删除成员时无法实时更新的解决方法
2019/05/01 Javascript
解决Layui 表格自适应高度的问题
2019/11/15 Javascript
Vuex实现数据共享的方法
2019/12/20 Javascript
JavaScript 引用类型实例详解【数组、对象、严格模式等】
2020/05/13 Javascript
js实现弹幕墙效果
2020/12/10 Javascript
python代码检查工具pylint 让你的python更规范
2012/09/05 Python
python中requests模块的使用方法
2015/04/08 Python
python中判断文件编码的chardet(实例讲解)
2017/12/21 Python
python中ImageTk.PhotoImage()不显示图片却不报错问题解决
2018/12/06 Python
python引用(import)某个模块提示没找到对应模块的解决方法
2019/01/19 Python
python常用库之NumPy和sklearn入门
2019/07/11 Python
python计算导数并绘图的实例
2020/02/29 Python
CSS3教程:background-clip和background-origin
2008/10/17 HTML / CSS
HTML5新增的表单元素和属性实例解析
2014/07/07 HTML / CSS
戴尔美国官方折扣店:Dell Outlet
2018/02/13 全球购物
英国最大的正宗复古足球衫制造商和零售商:TOFFS
2018/06/21 全球购物
以思科路由器为例你写下单臂路由的配置命令
2013/08/03 面试题
酒店总经理欢迎词
2014/01/15 职场文书
客户服务经理岗位职责
2014/01/29 职场文书
幼儿园社区活动总结
2014/07/07 职场文书
2014年业务员工作总结范文
2014/11/17 职场文书
毕业论文致谢部分怎么写
2015/05/14 职场文书
2015年医院后勤工作总结
2015/05/20 职场文书
社区服务活动感想
2015/08/11 职场文书
《怀念母亲》教学反思
2016/02/19 职场文书
Keras在mnist上的CNN实践,并且自定义loss函数曲线图操作
2021/05/25 Python
swagger如何返回map字段注释
2021/07/03 Java/Android