最近在项目中需要使用tensorflow来对图片进行离线预处理,但是使用sess.run时代码越来越慢,最后几分钟才能处理一张图片,这可怎么能行,我的数据集有数万张图片......

原始代码

def process(img, .. , .. ,):.......return imgdef main():.......with tf.Session() as sess:for i in range(len(dataset)):img_op = process(...) #构图动作img = sess.run(img_op).......if __name__ == "__main__":main()

代码在执行的过程中越来越慢,并且占用的内存空间越来越大,这就说明代码本身是存在问题的。
我们知道,tensorflow在执行之前是要先构图,然后再向图中feed数据,正常来说,这两个过程应该是分开进行的,但是由于我们在编写代码时的不规范,就容易在feed数据的过程在向计算图中添加新的计算节点,你比如,我这里的img_op = process(.....)本身就是添加计算节点的动作,又叫做构图动作,这些动作是非常危险的,不仅会影响运行速度,还会扩大计算图的规模,占用过多的内存,有可能会导致程序崩溃。所以导致我代码运行缓慢的原因是找到了,那么该怎么解决呢?
有两种方案:1.将构图动作移动到循环外。2.再循环里不断变换当前的计算图。
我们来分析以下两种方法分别适合什么样的场景:
1.将构图动作移动到循环外。代码如下:

def process(, .. , .. ,):img = tf.placeholder(tf.int64, shape=[,,,], name='input').......return imgdef main():.......img_op = process(...) #构图动作with tf.Session() as sess:for i in range(len(dataset)):img_np = np.array(..)img = sess.run(img_op, feed_dict = {input:0: img_np}).......if __name__ == "__main__":main()

使用标准的构图方式建立一个计算图,使用feed_dict喂入数据,那么聪明的你可能已经发现了一个问题,就是,如果我的图片size大小不一怎么办,没办法使用tf.placeholder来占位。没错,这种办法由于是静态计算图的原因,只适用于固定输入尺寸的处理任务,想要解决刚刚的问题只能使用第二种办法。
2.再循环里不断变换当前的计算图。代码如下:

def process(img, .. , .. ,):.......return imgdef main():.......for i in range(len(dataset)):tf.reset_default_graph() #########重置计算图with tf.Session() as sess:img_op = process(...) #构图动作,创建计算图img = sess.run(img_op)tf.get_default_graph().finalize() #关闭当前计算图.......if __name__ == "__main__":main()

这种办法,我们发现,我们每次送入图中的数据都可以是尺寸不一的,因为在处理每一个数据时都会创建新的计算图,并且在处理结束后关闭当前计算图。通过这样的方式,我们就实现了代码维护一个动态的计算图,就避免了一开始计算图越来越大所导致的种种问题。

两种办法所使用的场景不相同,重点是大家可以理解二者的区别究竟在哪里,并理解tensorflow的图计算机制,来选择适合自己工程的方式

坑 之 tensorflow使用sess.run处理图片时越来越慢,占用内存越来越大的问题相关推荐

  1. tensorflow中sess.run()越来越慢的问题解决

    tensorflow中sess.run()越来越慢的问题解决 在我们运行tf.Session.run()的次数越多,会发现程序的输出越来越慢,这是因为直接用run去读取数据是很慢的,所以run越多,就 ...

  2. Android字体占有内存,android随意创建字体对象引发的应用程序运行时占用内存过大...

    android随意创建字体对象引发的应用程序运行时占用内存过大 在实际开发android项目过程中,由于是初次设置android系统没有的字体,所以用到了一个外部文件FounderFineRoundS ...

  3. 解决Windows10 系统中桌面窗口管理器运行时占用内存过大的问题

    问题复现 问题原因 产生这个问题的原因是因为在某次更新中 引发了内存泄漏问题所以会导致桌面窗口管理器运行时占用内存过大. 解决办法 链接: inter显卡驱动 选择安装驱动就行.

  4. tensorflow学习--sess.run()

    ---恢复内容开始--- 当我们编写tensorflow代码时, 总是定义好整个计算图,然后才调用sess.run()去执行整个定义好的计算图, 那么有两个问题:一是当执行sess.sun()的时候, ...

  5. tensorflow的sess.run的参数执行顺序

    sess.run的多个参数执行 是将整个计算图中所有需要计算的节点,计算完全后一次行输出, 两次print顺序不同,结果不同 import tensorflow as tf# 基础数据 state1 ...

  6. tensorflow中sess.run执行原理及常见问题

    1.执行原理: 首先:对于sess.sun(fetch), 只有fetch里的图元素, 才会被执行, 不在fetch中的图节点是不会执行的: 其次:sess.run()里面的执行顺序是按fetch列表 ...

  7. tensorflow中sess.run第一个参数衣服不能随便穿

    如图所示: 纬度从2维变成3维了 ,导致结果错误连续出现 本质是自己对sess.run第一个参数没有太注意,习惯性的加了个列表的外衣:导致维度增加:

  8. tensorflow中sess.run()

    Session()方法 tensorflow的内核使用更加高效的C++作为后台,以支撑它的密集计算.tensorflow把前台(即python程序)与后台程序之间的连接称为"会话(Sessi ...

  9. python加载模型包占用内存多大_如何保持Keras模型加载到内存中并在需要时使用它? - python...

    我正在阅读Keras blog讲解如何使用Flask创建简单的图像分类器Restful API.我想知道如何在不使用python的其他Web框架中实现加载模型的相同方法. 在下面的代码中,将在服务器启 ...

最新文章

  1. 优达学城《DeepLearning》项目1:预测每日自行车租赁客流量
  2. 安卓系列七(广播机制)
  3. HTML中通过CSS方式隐藏元素
  4. DB2数据库表追加字段
  5. windows7+tomcat7+nginx1.11.3 +memcached
  6. centos cron 自动执行脚本异常 命令不生效的解决办法
  7. 【Ajax技术】解决XHR与中文乱码问题
  8. 基于C#木门归方程序 下料机 锯片 CNC 拆单软件 全屋定制设计拆单软件橱柜衣柜拆单设计制造管理一体化软件 有屋软件
  9. tomcat日志切割和定期删除
  10. 【职场心灵鸡汤】以多年来拿最佳的心路历程来复盘【如何成为优秀的5%】
  11. 第八届ACM趣味编程循环赛重现赛(部分题目)
  12. 音乐网站制作之音乐播放
  13. 数据仓库系列4-维度表
  14. 关于销售订单挑库发放卡接口以及发运处理卡接口的处理方式
  15. FOne CodeSec代码泄露检测工具
  16. ERP/MIS开发 LLBL Gen多表操作
  17. linux与pe到移动硬盘,将PE放入移动硬盘的简单方法几点疑问-已解决(转自深
  18. 1.Adobenbsp;CS6nbsp;系列,安装…
  19. 十条服务器端优化Web性能的技巧
  20. TIA西门子博途软件中如何让程序段自动显示注释?

热门文章

  1. mysql数据库主从同步状态正常,无异常报错,数据不能同步
  2. 跨域请求获取Solr json检索结果并高亮显示
  3. 《OpenGL超级宝典》编程环境配置
  4. sphinx全文检索功能 | windows下测试 (二)
  5. Web.xml配置详解之context-param(转)
  6. 窗口之间值、控件的传递
  7. GridView滚动条
  8. 用Unity3D实现简单的牧师与魔鬼游戏
  9. 手机计算机快速切换功能,新功能!手势导航快速切换应用功能上线~
  10. [python爬虫] 招聘信息定时系统 (一).BeautifulSoup爬取信息并存储MySQL