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的Django框架中的模版继承
Jul 16 Python
Python导出DBF文件到Excel的方法
Jul 25 Python
Python使用defaultdict读取文件各列的方法
May 11 Python
Python基础语言学习笔记总结(精华)
Nov 14 Python
Python实现的计算马氏距离算法示例
Apr 03 Python
python-str,list,set间的转换实例
Jun 27 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
Aug 30 Python
Python Json数据文件操作原理解析
May 09 Python
keras中的卷积层&amp;池化层的用法
May 22 Python
Python如何读写字节数据
Aug 05 Python
python matplotlib库的基本使用
Sep 23 Python
python绘制分布折线图的示例
Sep 24 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
yii 2.0中表单小部件的使用方法示例
2017/05/23 PHP
php如何计算两坐标点之间的距离
2018/12/29 PHP
PHP常见字符串操作函数与用法总结
2019/03/04 PHP
javascript中的new使用
2010/03/20 Javascript
jquery异步调用页面后台方法&amp;#8207;(asp.net)
2011/03/01 Javascript
Javascript 加载和执行-性能提高篇
2012/12/28 Javascript
JS下拉缓冲菜单示例代码
2013/08/30 Javascript
jQuery ajax dataType值为text json探索分享
2013/09/23 Javascript
文本框回车提交与禁止提交示例
2013/09/27 Javascript
深入理解JS中的变量及作用域、undefined与null
2014/03/04 Javascript
用html+css+js实现的一个简单的图片切换特效
2014/05/28 Javascript
JS+CSS实现精美的二级导航效果代码
2015/09/17 Javascript
解决Angular.Js与Django标签冲突的方案
2016/12/20 Javascript
BootStrap组件之进度条的基本用法
2017/01/19 Javascript
jQuery validate 验证radio实例
2017/03/01 Javascript
JavaScript 通过Ajax 动态加载CheckBox复选框
2017/08/31 Javascript
jquery实现倒计时小应用
2017/09/19 jQuery
Vue+ElementUI实现表单动态渲染、可视化配置的方法
2018/03/07 Javascript
Vue.js的动态组件模板的实现
2018/11/26 Javascript
vue使用swiper实现中间大两边小的轮播图效果
2019/11/24 Javascript
解决vant框架做H5时踩过的坑(下拉刷新、上拉加载等)
2020/11/11 Javascript
[01:38]2018DOTA2亚洲邀请赛主赛事第二日现场采访 神秘商人痛陈生计不易
2018/04/05 DOTA
python海龟绘图实例教程
2014/07/24 Python
Python数据类型详解(三)元祖:tuple
2016/05/08 Python
Python实现将HTML转换成doc格式文件的方法示例
2017/11/20 Python
python看某个模块的版本方法
2018/10/16 Python
Python提取特定时间段内数据的方法实例
2019/04/01 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
2019/06/19 Python
Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解
2020/02/10 Python
劳动纠纷调解协议书格式
2014/11/30 职场文书
学雷锋日活动总结
2015/02/06 职场文书
三潭印月的导游词
2015/02/12 职场文书
保送生自荐信
2015/03/06 职场文书
贫困证明怎么写
2015/06/16 职场文书
《文化苦旅》读后感:阅读,让人诗意地栖居在大地上
2019/12/24 职场文书
如何设计高效合理的MySQL查询语句
2021/05/26 MySQL