解决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程序实例(通讯录)
Nov 29 Python
Python基于smtplib实现异步发送邮件服务
May 28 Python
对Python的Django框架中的项目进行单元测试的方法
Apr 11 Python
python之pandas用法大全
Mar 13 Python
Django处理文件上传File Uploads的实例
May 28 Python
读取json格式为DataFrame(可转为.csv)的实例讲解
Jun 05 Python
python进阶之多线程对同一个全局变量的处理方法
Nov 09 Python
python进行TCP端口扫描的实现
Dec 21 Python
Python I/O与进程的详细讲解
Mar 08 Python
python 缺失值处理的方法(Imputation)
Jul 02 Python
使用python将excel数据导入数据库过程详解
Aug 27 Python
Python 多线程共享变量的实现示例
Apr 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
php强制下载类型的实现代码
2011/04/21 PHP
简单的PHP多图上传小程序代码
2011/07/17 PHP
PHP使用zlib扩展实现GZIP压缩输出的方法详解
2018/04/09 PHP
Yii2框架中一些折磨人的坑
2019/12/15 PHP
jquery对表单操作2
2011/04/06 Javascript
对象无length属性时IE6/IE7中无法将其转换成伪数组(ArrayLike)
2011/07/31 Javascript
解析Javascript中大括号“{}”的多义性
2013/12/02 Javascript
js简单实现交换Li的值
2014/05/22 Javascript
Javascript定义类(class)的三种方法详解
2015/03/13 Javascript
JS实现简易图片轮播效果的方法
2015/03/25 Javascript
javascript正则表达式定义(语法)总结
2016/01/08 Javascript
Vuejs第十一篇组件之slot内容分发实例详解
2016/09/09 Javascript
jQuery实现大图轮播
2017/02/13 Javascript
nodejs搭建本地http服务器教程
2017/03/13 NodeJs
详解Angular调试技巧之报错404(not found)
2018/01/31 Javascript
浅谈让你的代码更简短,更整洁,更易读的ES6小技巧
2018/10/25 Javascript
JavaScript实现星级评价效果
2019/05/17 Javascript
element-ui和vue表单(对话框)验证提示语(残留)清除操作
2020/09/11 Javascript
js获取图片的base64编码并压缩
2020/12/05 Javascript
python任务调度实例分析
2015/05/19 Python
Django使用Celery异步任务队列的使用
2018/03/13 Python
Python使用百度api做人脸对比的方法
2019/08/28 Python
Django项目使用ckeditor详解(不使用admin)
2019/12/17 Python
python中threading开启关闭线程操作
2020/05/02 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
2020/09/26 Python
什么是GWT的Entry Point
2013/08/16 面试题
婚礼主持结束词
2014/03/13 职场文书
银行竞聘演讲稿
2014/05/16 职场文书
党委书记个人检查对照材料思想汇报
2014/10/11 职场文书
2014年小班保育员工作总结
2014/12/23 职场文书
幼儿园教师师德师风承诺书
2015/04/28 职场文书
2015年服务员个人工作总结
2015/05/27 职场文书
农村婚庆主持词
2015/06/29 职场文书
超外差式晶体管收音机的组装与统调
2021/04/22 无线电
python实现进度条的多种实现
2021/04/29 Python
nginx lua 操作 mysql
2022/05/15 Servers