解决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标准库之Sys模块使用详解
May 23 Python
python通过apply使用元祖和列表调用函数实例
May 26 Python
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
Oct 13 Python
python实现决策树、随机森林的简单原理
Mar 26 Python
Python操作mongodb数据库进行模糊查询操作示例
Jun 09 Python
Python多进程写入同一文件的方法
Jan 14 Python
Django网络框架之创建虚拟开发环境操作示例
Jun 06 Python
TensorBoard 计算图的可视化实现
Feb 15 Python
Java多线程实现四种方式原理详解
Jun 02 Python
Python包和模块的分发详细介绍
Jun 19 Python
Python根据指定文件生成XML的方法
Jun 29 Python
五种Python转义表示法
Nov 27 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面向对象全攻略 (七) 继承性
2009/09/30 PHP
分享一段php获取linux服务器状态的代码
2014/05/27 PHP
PHP中使用php5-ffmpeg撷取视频图片实例
2015/01/07 PHP
教你在PHPStorm中配置Xdebug
2015/07/27 PHP
php实现zip文件解压操作
2015/11/03 PHP
php微信开发之百度天气预报
2016/11/18 PHP
PHP正则匹配反斜杠'\'和美元'$'的方法
2017/02/08 PHP
PHP与以太坊交互详解
2018/08/24 PHP
js函数般调用正则
2008/04/08 Javascript
Js放到HTML文件中的哪个位置有什么区别
2013/08/21 Javascript
JS实现遮罩层效果的简单实例
2013/11/12 Javascript
AngularJS ng-blur 指令详解及简单实例
2016/07/30 Javascript
js带闹铃功能的倒计时代码
2016/09/29 Javascript
详解react如何在组件中获取路由参数
2017/06/15 Javascript
jquery单击文字或图片内容放大并居中显示
2017/06/23 jQuery
Vue.js学习笔记之常用模板语法详解
2017/07/25 Javascript
详解React native全局变量的使用(跨组件的通信)
2017/09/07 Javascript
浅谈 vue 中的 watcher
2017/12/04 Javascript
Angular4学习教程之DOM属性绑定详解
2018/01/04 Javascript
解析Angular 2+ 样式绑定方式
2018/01/15 Javascript
Vue 将后台传过来的带html字段的字符串转换为 HTML
2018/03/29 Javascript
js 将线性数据转为树形的示例代码
2019/05/28 Javascript
使用VueCli3+TypeScript+Vuex一步步构建todoList的方法
2019/07/25 Javascript
javascript实现贪吃蛇小练习
2020/07/05 Javascript
[38:51]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-CDEC
2014/05/22 DOTA
python 通过手机号识别出对应的微信性别(实例代码)
2019/12/22 Python
python装饰器的特性原理详解
2019/12/25 Python
python pptx复制指定页的ppt教程
2020/02/14 Python
python中如何进行连乘计算
2020/05/28 Python
Python运算符+与+=的方法实例
2021/02/18 Python
教师党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
python实现批量移动文件
2021/04/05 Python
聊聊pytorch测试的时候为何要加上model.eval()
2021/05/23 Python
Java基础之线程锁相关知识总结
2021/06/30 Java/Android
Java9新特性之Module模块化编程示例演绎
2022/03/16 Java/Android
TaiShan 200服务器安装Ubuntu 18.04的图文教程
2022/06/28 Servers