tensorflow使用range_input_producer多线程读取数据实例


Posted in Python onJanuary 20, 2020

先放关键代码:

i = tf.train.range_input_producer(NUM_EXPOCHES, num_epochs=1, shuffle=False).dequeue()
inputs = tf.slice(array, [i * BATCH_SIZE], [BATCH_SIZE])

原理解析:

第一行会产生一个队列,队列包含0到NUM_EXPOCHES-1的元素,如果num_epochs有指定,则每个元素只产生num_epochs次,否则循环产生。shuffle指定是否打乱顺序,这里shuffle=False表示队列的元素是按0到NUM_EXPOCHES-1的顺序存储。在Graph运行的时候,每个线程从队列取出元素,假设值为i,然后按照第二行代码切出array的一小段数据作为一个batch。例如NUM_EXPOCHES=3,如果num_epochs=2,则队列的内容是这样子;

0,1,2,0,1,2

队列只有6个元素,这样在训练的时候只能产生6个batch,迭代6次以后训练就结束。

如果num_epochs不指定,则队列内容是这样子:

0,1,2,0,1,2,0,1,2,0,1,2...

队列可以一直生成元素,训练的时候可以产生无限的batch,需要自己控制什么时候停止训练。

下面是完整的演示代码。

数据文件test.txt内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

main.py内容:

import tensorflow as tf
import codecs
 
BATCH_SIZE = 6
NUM_EXPOCHES = 5
 
 
def input_producer():
 array = codecs.open("test.txt").readlines()
	array = map(lambda line: line.strip(), array)
 i = tf.train.range_input_producer(NUM_EXPOCHES, num_epochs=1, shuffle=False).dequeue()
 inputs = tf.slice(array, [i * BATCH_SIZE], [BATCH_SIZE])
 return inputs
 
 
class Inputs(object):
 def __init__(self):
  self.inputs = input_producer()
 
 
def main(*args, **kwargs):
 inputs = Inputs()
 init = tf.group(tf.initialize_all_variables(),
     tf.initialize_local_variables())
 sess = tf.Session()
 coord = tf.train.Coordinator()
 threads = tf.train.start_queue_runners(sess=sess, coord=coord)
 sess.run(init)
 try:
  index = 0
  while not coord.should_stop() and index<10:
   datalines = sess.run(inputs.inputs)
   index += 1
   print("step: %d, batch data: %s" % (index, str(datalines)))
 except tf.errors.OutOfRangeError:
  print("Done traing:-------Epoch limit reached")
 except KeyboardInterrupt:
  print("keyboard interrput detected, stop training")
 finally:
  coord.request_stop()
 coord.join(threads)
 sess.close()
 del sess
	
if __name__ == "__main__":
 main()

输出:

step: 1, batch data: ['1' '2' '3' '4' '5' '6']
step: 2, batch data: ['7' '8' '9' '10' '11' '12']
step: 3, batch data: ['13' '14' '15' '16' '17' '18']
step: 4, batch data: ['19' '20' '21' '22' '23' '24']
step: 5, batch data: ['25' '26' '27' '28' '29' '30']
Done traing:-------Epoch limit reached

如果range_input_producer去掉参数num_epochs=1,则输出:

step: 1, batch data: ['1' '2' '3' '4' '5' '6']
step: 2, batch data: ['7' '8' '9' '10' '11' '12']
step: 3, batch data: ['13' '14' '15' '16' '17' '18']
step: 4, batch data: ['19' '20' '21' '22' '23' '24']
step: 5, batch data: ['25' '26' '27' '28' '29' '30']
step: 6, batch data: ['1' '2' '3' '4' '5' '6']
step: 7, batch data: ['7' '8' '9' '10' '11' '12']
step: 8, batch data: ['13' '14' '15' '16' '17' '18']
step: 9, batch data: ['19' '20' '21' '22' '23' '24']
step: 10, batch data: ['25' '26' '27' '28' '29' '30']

有一点需要注意,文件总共有35条数据,BATCH_SIZE = 6表示每个batch包含6条数据,NUM_EXPOCHES = 5表示产生5个batch,如果NUM_EXPOCHES =6,则总共需要36条数据,就会报如下错误:

InvalidArgumentError (see above for traceback): Expected size[0] in [0, 5], but got 6
 [[Node: Slice = Slice[Index=DT_INT32, T=DT_STRING, _device="/job:localhost/replica:0/task:0/cpu:0"](Slice/input, Slice/begin/_5, Slice/size)]]

错误信息的意思是35/BATCH_SIZE=5,即NUM_EXPOCHES 的取值能只能在0到5之间。

以上这篇tensorflow使用range_input_producer多线程读取数据实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
低版本中Python除法运算小技巧
Apr 05 Python
Python isinstance函数介绍
Apr 14 Python
python安装mysql-python简明笔记(ubuntu环境)
Jun 25 Python
python实现多线程抓取知乎用户
Dec 12 Python
Python操作mongodb数据库进行模糊查询操作示例
Jun 09 Python
python 通过 socket 发送文件的实例代码
Aug 14 Python
python3 flask实现文件上传功能
Mar 20 Python
pandas分别写入excel的不同sheet方法
Dec 11 Python
Python OrderedDict的使用案例解析
Oct 25 Python
python实现移动木板小游戏
Oct 09 Python
浅谈Selenium 控制浏览器的常用方法
Dec 04 Python
基于Python编写一个监控CPU的应用系统
Jun 25 Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
Jan 20 #Python
使用tensorflow DataSet实现高效加载变长文本输入
Jan 20 #Python
python机器学习库xgboost的使用
Jan 20 #Python
python 爬取马蜂窝景点翻页文字评论的实现
Jan 20 #Python
tensorflow-gpu安装的常见问题及解决方案
Jan 20 #Python
win10安装tensorflow-gpu1.8.0详细完整步骤
Jan 20 #Python
tensorflow -gpu安装方法(不用自己装cuda,cdnn)
Jan 20 #Python
You might like
超外差式晶体管收音机的组装与统调
2021/03/01 无线电
探讨php中防止SQL注入最好的方法是什么
2013/06/10 PHP
javascript高亮效果的二种实现方法
2008/09/14 Javascript
jQuery1.6 类型判断实现代码
2011/09/01 Javascript
使用jquery动态加载javascript以减少服务器压力
2012/10/29 Javascript
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
2013/02/26 Javascript
探讨在JQuery和Js中,如何让ajax执行完后再继续往下执行
2013/07/09 Javascript
JavaScript限定复选框的选择个数示例代码
2013/08/25 Javascript
Ajax提交与传统表单提交的区别说明
2014/02/07 Javascript
7个JS基础知识总结
2014/03/05 Javascript
jquery的each方法使用示例分享
2014/03/25 Javascript
jQuery实现瀑布流布局
2014/12/12 Javascript
JavaScript插件化开发教程(六)
2015/02/01 Javascript
js实现密码强度检测【附示例】
2016/03/30 Javascript
Vue.js开发环境搭建
2016/11/10 Javascript
微信小程序使用form表单获取输入框数据的实例代码
2018/05/17 Javascript
Vue实现开心消消乐游戏算法
2019/10/22 Javascript
js+css实现扇形导航效果
2020/08/18 Javascript
[00:48]DOTA2国际邀请赛公开赛报名开始 扫码开启逐梦之旅
2018/06/06 DOTA
Python使用新浪微博API发送微博的例子
2014/04/10 Python
Python整型运算之布尔型、标准整型、长整型操作示例
2017/07/21 Python
Python矩阵常见运算操作实例总结
2017/09/29 Python
PyCharm的设置方法和第一个Python程序的建立
2019/01/16 Python
Python实现点阵字体读取与转换的方法
2019/01/29 Python
解决django model修改添加字段报错的问题
2019/11/18 Python
高档奢华时装在线目的地:FORWARD by elyse walker
2017/10/16 全球购物
Java里面有没有全局变量?为什么?
2015/02/06 面试题
营业员演讲稿
2013/12/30 职场文书
广告设计专业毕业生自我鉴定
2014/09/27 职场文书
律师授权委托书范本
2014/10/07 职场文书
党员个人整改措施
2014/10/24 职场文书
2014年财务工作总结范文
2014/11/11 职场文书
辩论赛开场白大全(主持人+辩手)
2015/05/29 职场文书
处罚决定书范文
2015/06/24 职场文书
Python基于百度AI实现抓取表情包
2021/06/27 Python
python识别围棋定位棋盘位置
2021/07/26 Python