tensorflow批量读取数据
Tensorflow 数据读取有三种方式:
Preloaded data: 预加载数据,在TensorFlow图中定义常量或变量来保存所有数据(仅适用于数据量比较小的情况)。
Feeding: Python产生数据,再把数据喂给后端。TensorFlow程序运行的每一步, 让Python代码来供给数据。
Reading from file: 从文件中直接读取,在TensorFlow图的起始, 让一个输入管线从文件中读取数据。
(https://www.cnblogs.com/jyxbk/p/7773319.html
https://blog.csdn.net/XUEER88888888888888/article/details/86666614
https://www.cnblogs.com/zyly/p/8982335.html
https://blog.csdn.net/chenghtao/article/details/82110434
https://www.cnblogs.com/jyxbk/p/7773319.html
https://www.sogou.com/link?url=DSOYnZeCC_rR_TP93bdO6NeXnRkLS7fcqFq8n02wCL9Pp37pjYjVUJBPmYRRn48s
https://blog.csdn.net/christianashannon/article/details/78966048
)
对于数据量较小而言,可能一般选择直接将数据加载进内存,然后再分batch输入网络进行训练(tip:使用这种方法时,结合yield 使用更为简洁,大家自己尝试一下吧,我就不赘述了)。但是,如果数据量较大,这样的方法就不适用了,因为太耗内存,所以这时最好使用tensorflow提供的队列queue,也就是第二种方法 从文件读取数据。对于一些特定的读取,比如csv文件格式,官网有相关的描述,在这儿我介绍一种比较通用,高效的读取方法(官网介绍的少),即使用tensorflow内定标准格式——TFRecords
TensorFlow提供了一个队列机制,通过多线程将读取数据与计算数据分开。因为在处理海量数据集的训练时,无法把数据集一次全部载入到内存中,需要一边从硬盘中读取,一边进行训练,为了加快训练速度,我们可以采用多个线程读取数据,一个线程消耗数据。(队列:https://www.jianshu.com/p/d063804fb272)
TensorFlow里与Queue有关的概念和用法。
其实概念只有三个:
Queue是TF队列和缓存机制的实现
QueueRunner是TF中对操作Queue的线程的封装
Coordinator是TF中用来协调线程运行的工具
- Queue
根据实现的方式不同,分成具体的几种类型,例如:
tf.FIFOQueue 按入列顺序出列的队列
tf.RandomShuffleQueue 随机顺序出列的队列
tf.PaddingFIFOQueue 以固定长度批量出列的队列
tf.PriorityQueue 带优先级出列的队列
... ...
这些类型的Queue除了自身的性质不太一样外,创建、使用的方法基本是相同的。
创建函数的参数:
tf.FIFOQueue(capacity, dtypes, shapes=None, names=None ...)
Queue主要包含入列(enqueue)和出列(dequeue)两个操作。enqueue操作返回计算图中的一个Operation节点,dequeue操作返回一个Tensor值。Tensor在创建时同样只是一个定义(或称为“声明”),需要放在Session中运行才能获得真正的数值。(详细请参考:https://blog.csdn.net/fegang2002/article/details/82949863)下面是一个单独使用Queue的例子:
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
tf.InteractiveSession()
q = tf.FIFOQueue(2, "float")
init = q.enqueue_many(([0,0],))
x = q.dequeue()
y = x+1
q_inc = q.enqueue([y])
init.run()
q_inc.run()
q_inc.run()
q_inc.run()
x.eval() # 返回1
x.eval() # 返回2
x.eval() # 卡住
如果一次性入列超过Queue Size的数据,enqueue操作会卡住,直到有数据(被其他线程)从队列取出。对一个已经取空的队列使用dequeue操作也会卡住,直到有新的数据(从其他线程)写入
- QueueRunner
Tensorflow的计算主要在使用CPU/GPU和内存,而数据读取涉及磁盘操作,速度远低于前者操作。因此通常会使用多个线程读取数据,然后使用一个线程消费数据。QueueRunner就是来管理这些读写队列的线程的。
QueueRunner需要与Queue一起使用(这名字已经注定了它和Queue脱不开干系),但并不一定必须使用Coordinator。看下面这个例子:
增加计数的进程会不停的后台运行,执行入队的进程会先执行10次(因为队列长度只有10),然后主线程开始消费数据,当一部分数据消费被后,入队的进程又会开始执行。最终主线程消费完20个数据后停止,但其他线程继续运行,程序不会结束。
最新文章
- ReactNative新手学习之路03真机调试
- AS3中 Event 类的target和currentTarget属性
- 动态修改attr里的多个属性
- 快速入门GreenDao框架并实现增删改查案例
- bat 自动编译运行
- Top Five Hacker Tools Every CISO Should Understand
- Android App集成支付宝
- UML类图关系-转
- javascript 通过面向对象编写圆形数字时钟
- kernel hexdump分析
- GRUB2配置详解:默认启动项,超时时间,隐藏引导菜单,配置文件详解,图形化配置
- android 适配器 BaseAdapter 的学习
- JVM(一) OpenJDK1.8源码在Ubuntu16.04下的编译
- WinForm加载外部类库项目的集成开发模式
- Linux下安装python的gmpy2库及遇到无法定位软件包的解决办法
- js中的this指向问题(小计)
- C++模板参数类型(转载)
- CTPN项目部分代码学习
- Java并发编程笔记之Timer源码分析
- ubuntu软件安装位置
热门文章
- 在非gnome系桌面环境下运行deepin-wine tim的错误解决
- .NET三层架构开发初步
- c++开发遇到的错误和引用配置
- Java集合详解7:一文搞清楚HashSet,TreeSet与LinkedHashSet的异同
- Solr7.x学习(8)-使用spring-data-solr
- .NET 微服务 2 架构设计理论(一)
- FPFA学习笔记的系列
- cad.net 2008使用WPF(摘录山人)
- SyntaxError: Non-ASCII character ‘\xe5’ in file 的解决办法
- Python【每日一问】31