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中的魔法方法深入理解
Jul 09 Python
python机器学习之决策树分类详解
Dec 20 Python
python生成圆形图片的方法
Mar 25 Python
基于python进行桶排序与基数排序的总结
May 29 Python
python之cv2与图像的载入、显示和保存实例
Dec 05 Python
Django为窗体加上防机器人的验证码功能过程解析
Aug 14 Python
python 单线程和异步协程工作方式解析
Sep 28 Python
Python实现遗传算法(二进制编码)求函数最优值方式
Feb 11 Python
python 成功引入包但无法正常调用的解决
Mar 09 Python
python接入支付宝的实例操作
Jul 20 Python
Pycharm新手使用教程(图文详解)
Sep 17 Python
使用pytorch实现线性回归
Apr 11 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
PHP:风雨欲来 路在何方?
2006/10/09 PHP
PHP 防注入函数(格式化数据)
2011/08/08 PHP
利用php递归实现无限分类 格式化数组的详解
2013/06/08 PHP
php出现内存位置访问无效错误问题解决方法
2014/08/16 PHP
php调用新浪短链接API的方法
2014/11/08 PHP
PHP实现在windows下配置sendmail并通过mail()函数发送邮件的方法
2017/06/20 PHP
基于Jquery的将DropDownlist的选中值赋给label的实现代码
2011/05/06 Javascript
如何使用Javascript正则表达式来格式化XML内容
2013/07/04 Javascript
使用node.js半年来总结的 10 条经验
2014/08/18 Javascript
js实现宇宙星空背景效果的方法
2015/03/03 Javascript
基于jQuery实现文本框只能输入数字(小数、整数)
2016/01/14 Javascript
WEB开发之注册页面验证码倒计时代码的实现
2016/12/15 Javascript
js判断iframe中元素是否存在的实现代码
2016/12/24 Javascript
详解webpack介绍&amp;安装&amp;常用命令
2017/06/29 Javascript
详解node.js中的npm和webpack配置方法
2018/01/21 Javascript
Vue实现双向绑定的原理以及响应式数据的方法
2018/07/02 Javascript
[04:51]TI10典藏宝瓶Ⅱ外观视频展示
2020/08/15 DOTA
[03:15]DOTA2-DPC中国联赛1月22日Recap集锦
2021/03/11 DOTA
Python实现网站文件的全备份和差异备份
2014/11/30 Python
python通过自定义isnumber函数判断字符串是否为数字的方法
2015/04/23 Python
Python实现高效求解素数代码实例
2015/06/30 Python
python numpy 部分排序 寻找最大的前几个数的方法
2018/06/27 Python
django进阶之cookie和session的使用示例
2018/08/17 Python
python pands实现execl转csv 并修改csv指定列的方法
2018/12/12 Python
Python基于百度云文字识别API
2018/12/13 Python
阿里云ECS服务器部署django的方法
2019/08/29 Python
python中time库的实例使用方法
2019/10/31 Python
pyftplib中文乱码问题解决方案
2020/01/11 Python
canvas 如何绘制线段的实现方法
2018/07/12 HTML / CSS
六年级数学教学反思
2014/02/03 职场文书
活动总结模板
2014/05/09 职场文书
让生命充满爱演讲稿
2014/05/10 职场文书
求职信名称怎么写
2014/05/26 职场文书
学校组织向国旗敬礼活动方案(中小学适用)
2014/09/27 职场文书
Python合并pdf文件的工具
2021/07/01 Python
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
2022/04/02 Servers