解决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入门学习之字符串与比较运算符
Oct 12 Python
详解python3百度指数抓取实例
Dec 12 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
Feb 19 Python
Python自定义函数计算给定日期是该年第几天的方法示例
May 30 Python
python实现五子棋游戏
Jun 18 Python
IronPython连接MySQL的方法步骤
Dec 27 Python
Python反爬虫伪装浏览器进行爬虫
Feb 28 Python
django教程如何自学
Jul 31 Python
python 星号(*)的多种用途
Sep 21 Python
python 动态渲染 mysql 配置文件的示例
Nov 20 Python
Python tkinter之Bind(绑定事件)的使用示例
Feb 05 Python
Python序列化与反序列化相关知识总结
Jun 08 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 中的str_replace 函数总结
2007/04/27 PHP
PHP UTF8编码内的繁简转换类
2009/07/20 PHP
php 连接mysql连接被重置的解决方法
2011/02/15 PHP
护卫神php套件 php版本升级方法(php5.5.24)
2015/05/10 PHP
php使用ftp远程上传文件类(完美解决主从文件同步问题的方法)
2016/09/23 PHP
php基于环形链表解决约瑟夫环问题示例
2017/11/07 PHP
使用JQUERY Tabs插件宿主IFRAMES
2010/01/01 Javascript
js动态删除div元素基本思路及实现代码
2014/05/08 Javascript
JQuery使用index方法获取Jquery对象数组下标的方法
2015/05/18 Javascript
javascript实现html页面之间参数传递的四种方法实例分析
2015/12/15 Javascript
如何利用JS通过身份证号获取当事人的生日、年龄、性别
2016/01/22 Javascript
基于JS实现导航条之调用网页助手小精灵的方法
2016/06/17 Javascript
jQuery3.0中的buildFragment私有函数详解
2016/08/16 Javascript
Vue.js之slot深度复制详解
2017/03/10 Javascript
详解Vue中使用v-for语句抛出错误的解决方案
2017/05/04 Javascript
详解http访问解析流程原理
2017/10/18 Javascript
基于vue框架手写一个notify插件实现通知功能的方法
2019/03/31 Javascript
vue实现淘宝购物车功能
2020/04/20 Javascript
解决antd Form 表单校验方法无响应的问题
2020/10/27 Javascript
[36:52]DOTA2真视界:基辅特锦赛总决赛
2017/05/21 DOTA
Python使用gensim计算文档相似性
2016/04/10 Python
tensorflow学习笔记之简单的神经网络训练和测试
2018/04/15 Python
使用Python实现文字转语音并生成wav文件的例子
2019/08/08 Python
Pandas读取csv时如何设置列名
2020/06/02 Python
python里的单引号和双引号的有什么作用
2020/06/17 Python
Django中日期时间型字段进行年月日时分秒分组统计
2020/11/27 Python
python正则表达式re.match()匹配多个字符方法的实现
2021/01/27 Python
html5 canvas 实现光线沿不规则路径运动
2020/04/20 HTML / CSS
美国高端医师级美容产品电商:BeautifiedYou.com
2017/04/17 全球购物
波兰香水和化妆品购物网站:Notino.pl
2017/11/07 全球购物
会计电算化专业毕业生推荐信
2013/12/24 职场文书
士力架广告词
2014/03/20 职场文书
青年教师听课心得体会
2016/01/15 职场文书
jquery插件实现搜索历史
2021/04/24 jQuery
变长双向rnn的正确使用姿势教学
2021/05/31 Python
Opencv中cv2.floodFill算法的使用
2021/06/18 Python