解决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判断文件和字符串编码类型的实例
Dec 21 Python
tensorflow获取变量维度信息
Mar 10 Python
python斐波那契数列的计算方法
Sep 27 Python
对numpy中的where方法嵌套使用详解
Oct 31 Python
python监测当前联网状态并连接的实例
Dec 18 Python
用xpath获取指定标签下的所有text的实例
Jan 02 Python
python实现对服务器脚本敏感信息的加密解密功能
Aug 13 Python
pandas实现DataFrame显示最大行列,不省略显示实例
Dec 26 Python
使用PyTorch实现MNIST手写体识别代码
Jan 18 Python
python 已知平行四边形三个点,求第四个点的案例
Apr 12 Python
Python列表删除重复元素与图像相似度判断及删除实例代码
May 07 Python
Python读写yaml文件
Mar 20 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
《猛禽小队》:DC宇宙的又一超级大烂片
2020/04/09 欧美动漫
php.ini中date.timezone设置分析
2011/07/29 PHP
php版本的cron定时任务执行器使用实例
2014/08/19 PHP
php静态文件生成类实例分析
2015/01/03 PHP
使用PHPWord生成word文档的方法详解
2019/06/06 PHP
php实现大文件断点续传下载实例代码
2019/10/01 PHP
PHP+Mysql分布式事务与解决方案深入理解
2021/02/27 PHP
初学js插入节点appendChild insertBefore使用方法
2011/07/04 Javascript
JavaScript高级程序设计(第3版)学习笔记10 再访js对象
2012/10/11 Javascript
jquery基础教程之数组使用详解
2014/03/10 Javascript
jquery实现预览提交的表单代码分享
2014/05/21 Javascript
javascript正则表达式基础知识入门
2015/04/20 Javascript
jquery对复选框(checkbox)的操作汇总
2016/01/13 Javascript
Bootstrap每天必学之滚动监听
2016/03/16 Javascript
jQuery实现将div中滚动条滚动到指定位置的方法
2016/08/10 Javascript
轻松实现jQuery添加删除按钮Click事件
2017/03/13 Javascript
浅谈Vue.js 1.x 和 2.x 实例的生命周期
2017/07/25 Javascript
小程序转发探索示例
2019/02/19 Javascript
php结合js实现多条件组合查询
2019/05/28 Javascript
JS中的算法与数据结构之栈(Stack)实例详解
2019/08/20 Javascript
vue 源码解析之虚拟Dom-render
2019/08/26 Javascript
Javascript幻灯片播放功能实现过程解析
2020/05/07 Javascript
仿照Element-ui实现一个简易的$message方法
2020/09/14 Javascript
[04:09]2014DOTA2国际邀请赛Ti西雅图 历届冠军相继出局 BBC综述今日比赛
2014/07/20 DOTA
python中lambda()的用法
2017/11/16 Python
python RabbitMQ 使用详细介绍(小结)
2018/11/08 Python
python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法
2020/02/26 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
2020/03/23 Python
python3.9实现pyinstaller打包python文件成exe
2020/12/13 Python
英国网上购买门:Direct Doors
2018/06/07 全球购物
飞利浦美国官网:Philips美国
2020/02/28 全球购物
汉语言文学毕业求职信
2014/07/17 职场文书
看雷锋电影观后感
2015/06/10 职场文书
vue backtop组件的实现完整代码
2021/04/07 Vue.js
剑指Offer之Java算法习题精讲二叉树的构造和遍历
2022/03/21 Java/Android
了解MySQL查询语句执行过程(5大组件)
2022/08/14 MySQL