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 相关文章推荐
Django1.3添加app提示模块不存在的解决方法
Aug 26 Python
将Python中的数据存储到系统本地的简单方法
Apr 11 Python
在Python中使用模块的教程
Apr 27 Python
Python selenium 父子、兄弟、相邻节点定位方式详解
Sep 15 Python
Python 基础知识之字符串处理
Jan 06 Python
Python基于多线程实现ping扫描功能示例
Jul 23 Python
在python tkinter中Canvas实现进度条显示的方法
Jun 14 Python
python针对mysql数据库的连接、查询、更新、删除操作示例
Sep 11 Python
python匿名函数lambda原理及实例解析
Feb 07 Python
python实现字符串和数字拼接
Mar 02 Python
基于python实现模拟数据结构模型
Jun 12 Python
查找适用于matplotlib的中文字体名称与实际文件名对应关系的方法
Jan 05 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
利用js调用后台php进行数据处理原码
2006/10/09 PHP
综合图片计数器
2006/10/09 PHP
php设计模式 Bridge (桥接模式)
2011/06/26 PHP
PHP函数篇之掌握ord()与chr()函数应用
2011/12/05 PHP
PHP对象Object的概念 介绍
2012/06/14 PHP
php面向对象与面向过程两种方法给图片添加文字水印
2015/08/26 PHP
PHP中如何判断exec函数执行成功?
2016/08/04 PHP
javascript写的日历类(基于pj)
2010/12/28 Javascript
在IE浏览器中resize事件执行多次的解决方法
2011/07/12 Javascript
浅谈JS中的bind方法与函数柯里化
2016/08/10 Javascript
JavaScript输出所选择起始与结束日期的方法
2017/07/12 Javascript
微信小程序对接七牛云存储的方法
2017/07/30 Javascript
基于Vue插入视频的2种方法小结
2019/04/02 Javascript
Vue+Koa2 打包后进行线上部署的教程详解
2019/07/31 Javascript
JavaScript生成随机验证码代码实例
2019/09/28 Javascript
详解Vue+elementUI build打包部署后字体图标丢失问题
2020/07/13 Javascript
jQuery列表动态增加和删除的实现方法
2020/11/05 jQuery
JavaScript使用setTimeout实现倒计时效果
2021/02/19 Javascript
[02:39]DOTA2英雄基础教程 天怒法师
2013/11/29 DOTA
[04:51]TI10典藏宝瓶Ⅱ外观视频展示
2020/08/15 DOTA
python实现根据月份和日期得到星座的方法
2015/03/27 Python
基于并发服务器几种实现方法(总结)
2017/12/29 Python
python hough变换检测直线的实现方法
2019/07/12 Python
Python常用库大全及简要说明
2020/01/17 Python
Python操作Elasticsearch处理timeout超时
2020/07/17 Python
python 使用cycle构造无限循环迭代器
2020/12/02 Python
借助HTML5 Canvas来绘制三角形和矩形等多边形的方法
2016/03/14 HTML / CSS
html5 Canvas画图教程(5)—canvas里画曲线之arc方法
2013/01/09 HTML / CSS
计算机本科生自荐信
2013/10/15 职场文书
外贸学院会计专业应届生求职信
2013/11/14 职场文书
学习党课思想汇报
2013/12/29 职场文书
大学生个人求职信例文
2014/07/07 职场文书
承诺书模板
2014/08/30 职场文书
交通安全教育心得体会
2016/01/15 职场文书
Django实现drf搜索过滤和排序过滤
2021/06/21 Python
MySQL派生表联表查询实战过程
2022/03/20 MySQL