解决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 相关文章推荐
phpsir 开发 一个检测百度关键字网站排名的python 程序
Sep 17 Python
python利用datetime模块计算时间差
Aug 04 Python
浅析Python中的多条件排序实现
Jun 07 Python
Python中index()和seek()的用法(详解)
Apr 27 Python
Pycharm学习教程(5) Python快捷键相关设置
May 03 Python
Python读取MRI并显示为灰度图像实例代码
Jan 03 Python
Python基于FTP模块实现ftp文件上传操作示例
Apr 23 Python
Python常见字典内建函数用法示例
May 14 Python
python 梯度法求解函数极值的实例
Jul 10 Python
如何在python中实现随机选择
Nov 02 Python
keras:model.compile损失函数的用法
Jul 01 Python
python生成xml时规定dtd实例方法
Sep 21 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
Zend studio for eclipse中使php可以调用mysql相关函数的设置方法
2008/10/13 PHP
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
javascript数字格式化通用类 accounting.js使用
2012/08/24 Javascript
了解了这些才能开始发挥jQuery的威力
2013/10/10 Javascript
JS实现仿Windows经典风格的选项卡Tab切换代码
2015/10/20 Javascript
js点击按钮实现带遮罩层的弹出视频效果
2015/12/19 Javascript
AngularJS实现Input格式化的方法
2016/11/07 Javascript
使用node.js中的Buffer类处理二进制数据的方法
2016/11/26 Javascript
使用jQuery.Pin垂直滚动时固定导航
2017/05/24 jQuery
jQuery实现table表格信息的展开和缩小功能示例
2018/07/21 jQuery
jquery中为什么能用$操作
2019/06/18 jQuery
Angular.JS读取数据库数据调用完整实例
2019/07/02 Javascript
vue+canvas实现移动端手写签名
2020/05/21 Javascript
微信小程序调用wx.getImageInfo遇到的坑解决
2020/05/31 Javascript
实现一个Vue自定义指令懒加载的方法示例
2020/06/04 Javascript
Python装饰器实现几类验证功能做法实例
2017/05/18 Python
Python实现接受任意个数参数的函数方法
2018/04/21 Python
解决python文件双击运行秒退的问题
2019/06/24 Python
pytorch模型预测结果与ndarray互转方式
2020/01/15 Python
pandas DataFrame 数据选取,修改,切片的实现
2020/04/24 Python
Mytheresa英国官网:拥有160多个奢侈品品牌
2016/10/09 全球购物
英国简约舒适女装品牌:Great Plains
2018/07/27 全球购物
Lacoste澳大利亚官网:服装、鞋类及配饰
2018/11/14 全球购物
女孩每月服装订阅盒:kidpik
2019/04/17 全球购物
Diamondback自行车:拥有你的冒险
2019/04/22 全球购物
Charles & Keith欧盟:新加坡时尚品牌
2019/08/01 全球购物
毕业生找工作的自我评价
2013/10/18 职场文书
大学生就业推荐信范文
2013/11/29 职场文书
红领巾心向党广播稿
2014/01/19 职场文书
40岁生日感言
2014/02/15 职场文书
大龄毕业生求职别忘职业规划
2014/03/11 职场文书
法定代表人证明书
2014/11/28 职场文书
2015年车间主任工作总结
2015/05/21 职场文书
Python机器学习之逻辑回归
2021/05/11 Python
世界十大动漫制作公司排行榜,迪士尼上榜,第二是美国代表性文化符
2022/03/18 欧美动漫
oracle数据库去除重复数据
2022/05/20 Oracle