解决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基于twisted实现简单的web服务器
Sep 29 Python
简洁的十分钟Python入门教程
Apr 03 Python
高效测试用例组织算法pairwise之Python实现方法
Jul 19 Python
python XlsxWriter模块创建aexcel表格的实例讲解
May 03 Python
pandas 层次化索引的实现方法
Jul 06 Python
将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例
Jan 04 Python
基于Python生成个性二维码过程详解
Mar 05 Python
Python爬虫实现自动登录、签到功能的代码
Aug 20 Python
详解python命令提示符窗口下如何运行python脚本
Sep 11 Python
python 经纬度求两点距离、三点面积操作
Jun 03 Python
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
Jun 26 Python
Python 语言实现六大查找算法
Jun 30 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 自定义错误处理函数trigger_error()
2013/03/26 PHP
php常用hash加密函数
2014/11/22 PHP
Yii开启片段缓存的方法
2016/03/28 PHP
PHP缩略图生成和图片水印制作
2017/01/07 PHP
thinkphp框架使用JWTtoken的方法详解
2019/10/10 PHP
Centos7安装swoole扩展操作示例
2020/03/26 PHP
Javascript异步编程的4种方法让你写出更出色的程序
2013/01/17 Javascript
提交表单时执行func方法实现代码
2013/03/17 Javascript
浏览器页面区域大小的js获取方法
2013/09/21 Javascript
在jquery boxy中添加百度地图坐标拾取注意流程
2014/04/03 Javascript
javascript白色简洁计算器
2015/05/04 Javascript
简介JavaScript中的setTime()方法的使用
2015/06/11 Javascript
谈谈JavaScript异步函数发展历程
2015/09/29 Javascript
JavaScript中Date对象的常用方法示例
2015/10/24 Javascript
JavaScript中通过提示框跳转页面的方法
2016/02/14 Javascript
jQuery实现简单倒计时功能的方法
2016/07/04 Javascript
纯原生js实现table表格的增删
2017/01/05 Javascript
Angular.Js之Scope作用域的学习教程
2017/04/27 Javascript
JS实现图片上传多次上传同一张不生效的处理方法
2018/08/06 Javascript
Angular8引入百度Echarts进行图表分析的实现代码
2019/11/27 Javascript
Paypal支付不完全指北
2020/06/04 Javascript
[54:33]2018DOTA2亚洲邀请赛小组赛 A组加赛 Liquid vs Optic
2018/04/03 DOTA
python 不关闭控制台的实现方法
2011/10/23 Python
Python中的hypot()方法使用简介
2015/05/18 Python
python实现在pandas.DataFrame添加一行
2018/04/04 Python
python3个性签名设计实现代码
2018/06/19 Python
python通过tcp发送xml报文的方法
2018/12/28 Python
python numpy库linspace相同间隔采样的实现
2020/02/25 Python
解决pycharm中的run和debug失效无法点击运行
2020/06/09 Python
Python爬虫教程之利用正则表达式匹配网页内容
2020/12/08 Python
美国电子元器件分销商:Newark element14
2018/01/13 全球购物
c/c++某大公司的两道笔试题
2014/02/02 面试题
党员十八大心得体会
2014/09/12 职场文书
催款函范本大全
2015/06/24 职场文书
毕业生就业推荐表自我鉴定
2019/06/20 职场文书
nginx日志格式分析和修改
2022/04/28 Servers