tensorflow中 tf.train.slice_input_producer 和 tf.train.batch 函数

2018年04月01日 12:05:13

阅读数:1156

tensorflow数据读取机制

tensorflow中为了充分利用GPU,减少GPU等待数据的空闲时间,使用了两个线程分别执行数据读入和数据计算。

具体来说就是使用一个线程源源不断的将硬盘中的图片数据读入到一个内存队列中,另一个线程负责计算任务,所需数据直接从内存队列中获取。

tf在内存队列之前,还设立了一个文件名队列,文件名队列存放的是参与训练的文件名,要训练 N个epoch,则文件名队列中就含有N个批次的所有文件名。 示例图如下:

图片来至于 https://zhuanlan.zhihu.com/p/27238630)

在N个epoch的文件名最后是一个结束标志,当tf读到这个结束标志的时候,会抛出一个 OutofRange 的异常,外部捕获到这个异常之后就可以结束程序了。而创建tf的文件名队列就需要使用到 tf.train.slice_input_producer 函数。

tf.train.slice_input_producer

tf.train.slice_input_producer是一个tensor生成器,作用是按照设定,每次从一个tensor列表中按顺序或者随机抽取出一个tensor放入文件名队列。

[python] view plaincopyprint?
  1. slice_input_producer(tensor_list, num_epochs=None, shuffle=True, seed=None,
  2. capacity=32, shared_name=None, name=None)
  1. slice_input_producer(tensor_list, num_epochs=None, shuffle=True, seed=None,
  2. capacity=32, shared_name=None, name=None)
  • 第一个参数 tensor_list:包含一系列tensor的列表,表中tensor的第一维度的值必须相等,即个数必须相等,有多少个图像,就应该有多少个对应的标签。
  • 第二个参数num_epochs: 可选参数,是一个整数值,代表迭代的次数,如果设置 num_epochs=None,生成器可以无限次遍历tensor列表,如果设置为 num_epochs=N,生成器只能遍历tensor列表N次。
  • 第三个参数shuffle: bool类型,设置是否打乱样本的顺序。一般情况下,如果shuffle=True,生成的样本顺序就被打乱了,在批处理的时候不需要再次打乱样本,使用 tf.train.batch函数就可以了;如果shuffle=False,就需要在批处理时候使用 tf.train.shuffle_batch函数打乱样本。
  • 第四个参数seed: 可选的整数,是生成随机数的种子,在第三个参数设置为shuffle=True的情况下才有用。
  • 第五个参数capacity:设置tensor列表的容量。
  • 第六个参数shared_name:可选参数,如果设置一个‘shared_name’,则在不同的上下文环境(Session)中可以通过这个名字共享生成的tensor。
  • 第七个参数name:可选,设置操作的名称。

tf.train.slice_input_producer定义了样本放入文件名队列的方式,包括迭代次数,是否乱序等,要真正将文件放入文件名队列,还需要调用tf.train.start_queue_runners 函数来启动执行文件名队列填充的线程,之后计算单元才可以把数据读出来,否则文件名队列为空的,计算单元就会处于一直等待状态,导致系统阻塞。

tf.train.slice_input_producer 和 tf.train.start_queue_runners 使用:

[python] view plaincopyprint?
  1. import tensorflow as tf
  2. images = ['img1', 'img2', 'img3', 'img4', 'img5']
  3. labels= [1,2,3,4,5]
  4. epoch_num=8
  5. f = tf.train.slice_input_producer([images, labels],num_epochs=None,shuffle=False)
  6. with tf.Session() as sess:
  7. sess.run(tf.global_variables_initializer())
  8. coord = tf.train.Coordinator()
  9. threads = tf.train.start_queue_runners(sess=sess, coord=coord)
  10. for i in range(epoch_num):
  11. k = sess.run(f)
  12. print '************************'
  13. print (i,k)
  14. coord.request_stop()
  15. coord.join(threads)
  1. import tensorflow as tf
  2. images = ['img1', 'img2', 'img3', 'img4', 'img5']
  3. labels= [1,2,3,4,5]
  4. epoch_num=8
  5. f = tf.train.slice_input_producer([images, labels],num_epochs=None,shuffle=False)
  6. with tf.Session() as sess:
  7. sess.run(tf.global_variables_initializer())
  8. coord = tf.train.Coordinator()
  9. threads = tf.train.start_queue_runners(sess=sess, coord=coord)
  10. for i in range(epoch_num):
  11. k = sess.run(f)
  12. print '************************'
  13. print (i,k)
  14. coord.request_stop()
  15. coord.join(threads)

tf.train.slice_input_producer函数中shuffle=False,不对tensor列表乱序,输出:

[python] view plaincopyprint?
  1. ************************
  2. (0, ['img1', 1])
  3. ************************
  4. (1, ['img2', 2])
  5. ************************
  6. (2, ['img3', 3])
  7. ************************
  8. (3, ['img4', 4])
  9. ************************
  10. (4, ['img5', 5])
  11. ************************
  12. (5, ['img1', 1])
  13. ************************
  14. (6, ['img2', 2])
  15. ************************
  16. (7, ['img3', 3])
  1. ************************
  2. (0, ['img1', 1])
  3. ************************
  4. (1, ['img2', 2])
  5. ************************
  6. (2, ['img3', 3])
  7. ************************
  8. (3, ['img4', 4])
  9. ************************
  10. (4, ['img5', 5])
  11. ************************
  12. (5, ['img1', 1])
  13. ************************
  14. (6, ['img2', 2])
  15. ************************
  16. (7, ['img3', 3])

如果设置shuffle=True,输出乱序:

[python] view plaincopyprint?
  1. ************************
  2. (0, ['img5', 5])
  3. ************************
  4. (1, ['img4', 4])
  5. ************************
  6. (2, ['img1', 1])
  7. ************************
  8. (3, ['img3', 3])
  9. ************************
  10. (4, ['img2', 2])
  11. ************************
  12. (5, ['img3', 3])
  13. ************************
  14. (6, ['img2', 2])
  15. ************************
  16. (7, ['img1', 1])
  1. ************************
  2. (0, ['img5', 5])
  3. ************************
  4. (1, ['img4', 4])
  5. ************************
  6. (2, ['img1', 1])
  7. ************************
  8. (3, ['img3', 3])
  9. ************************
  10. (4, ['img2', 2])
  11. ************************
  12. (5, ['img3', 3])
  13. ************************
  14. (6, ['img2', 2])
  15. ************************
  16. (7, ['img1', 1])

tf.train.batch

tf.train.batch是一个tensor队列生成器,作用是按照给定的tensor顺序,把batch_size个tensor推送到文件队列,作为训练一个batch的数据,等待tensor出队执行计算。

[python] view plaincopyprint?
  1. batch(tensors, batch_size, num_threads=1, capacity=32,
  2. enqueue_many=False, shapes=None, dynamic_pad=False,
  3. allow_smaller_final_batch=False, shared_name=None, name=None)
  1. batch(tensors, batch_size, num_threads=1, capacity=32,
  2. enqueue_many=False, shapes=None, dynamic_pad=False,
  3. allow_smaller_final_batch=False, shared_name=None, name=None)
  • 第一个参数tensors:tensor序列或tensor字典,可以是含有单个样本的序列;
  • 第二个参数batch_size: 生成的batch的大小;
  • 第三个参数num_threads:执行tensor入队操作的线程数量,可以设置使用多个线程同时并行执行,提高运行效率,但也不是数量越多越好;
  • 第四个参数capacity: 定义生成的tensor序列的最大容量;
  • 第五个参数enqueue_many: 定义第一个传入参数tensors是多个tensor组成的序列,还是单个tensor;
  • 第六个参数shapes: 可选参数,默认是推测出的传入的tensor的形状;
  • 第七个参数dynamic_pad: 定义是否允许输入的tensors具有不同的形状,设置为True,会把输入的具有不同形状的tensor归一化到相同的形状;
  • 第八个参数allow_smaller_final_batch: 设置为True,表示在tensor队列中剩下的tensor数量不够一个batch_size的情况下,允许最后一个batch的数量少于batch_size, 设置为False,则不管什么情况下,生成的batch都拥有batch_size个样本;
  • 第九个参数shared_name: 可选参数,设置生成的tensor序列在不同的Session中的共享名称;
  • 第十个参数name: 操作的名称;

如果tf.train.batch的第一个参数 tensors 传入的是tenor列表或者字典,返回的是tensor列表或字典,如果传入的是只含有一个元素的列表,返回的是单个的tensor,而不是一个列表。

以下举例: 一共有5个样本,设置迭代次数是2次,每个batch中含有3个样本,不打乱样本顺序:

[python] view plaincopyprint?
  1. # -*- coding:utf-8 -*-
  2. import tensorflow as tf
  3. import numpy as np
  4. # 样本个数
  5. sample_num=5
  6. # 设置迭代次数
  7. epoch_num = 2
  8. # 设置一个批次中包含样本个数
  9. batch_size = 3
  10. # 计算每一轮epoch中含有的batch个数
  11. batch_total = int(sample_num/batch_size)+1
  12. # 生成4个数据和标签
  13. def generate_data(sample_num=sample_num):
  14. labels = np.asarray(range(0, sample_num))
  15. images = np.random.random([sample_num, 224, 224, 3])
  16. print('image size {},label size :{}'.format(images.shape, labels.shape))
  17. return images,labels
  18. def get_batch_data(batch_size=batch_size):
  19. images, label = generate_data()
  20. # 数据类型转换为tf.float32
  21. images = tf.cast(images, tf.float32)
  22. label = tf.cast(label, tf.int32)
  23. #从tensor列表中按顺序或随机抽取一个tensor
  24. input_queue = tf.train.slice_input_producer([images, label], shuffle=False)
  25. image_batch, label_batch = tf.train.batch(input_queue, batch_size=batch_size, num_threads=1, capacity=64)
  26. return image_batch, label_batch
  27. image_batch, label_batch = get_batch_data(batch_size=batch_size)
  28. with tf.Session() as sess:
  29. coord = tf.train.Coordinator()
  30. threads = tf.train.start_queue_runners(sess, coord)
  31. try:
  32. for i in range(epoch_num):  # 每一轮迭代
  33. print '************'
  34. for j in range(batch_total): #每一个batch
  35. print '--------'
  36. # 获取每一个batch中batch_size个样本和标签
  37. image_batch_v, label_batch_v = sess.run([image_batch, label_batch])
  38. # for k in
  39. print(image_batch_v.shape, label_batch_v)
  40. except tf.errors.OutOfRangeError:
  41. print("done")
  42. finally:
  43. coord.request_stop()
  44. coord.join(threads)
  1. # -*- coding:utf-8 -*-
  2. import tensorflow as tf
  3. import numpy as np
  4. # 样本个数
  5. sample_num=5
  6. # 设置迭代次数
  7. epoch_num = 2
  8. # 设置一个批次中包含样本个数
  9. batch_size = 3
  10. # 计算每一轮epoch中含有的batch个数
  11. batch_total = int(sample_num/batch_size)+1
  12. # 生成4个数据和标签
  13. def generate_data(sample_num=sample_num):
  14. labels = np.asarray(range(0, sample_num))
  15. images = np.random.random([sample_num, 224, 224, 3])
  16. print('image size {},label size :{}'.format(images.shape, labels.shape))
  17. return images,labels
  18. def get_batch_data(batch_size=batch_size):
  19. images, label = generate_data()
  20. # 数据类型转换为tf.float32
  21. images = tf.cast(images, tf.float32)
  22. label = tf.cast(label, tf.int32)
  23. #从tensor列表中按顺序或随机抽取一个tensor
  24. input_queue = tf.train.slice_input_producer([images, label], shuffle=False)
  25. image_batch, label_batch = tf.train.batch(input_queue, batch_size=batch_size, num_threads=1, capacity=64)
  26. return image_batch, label_batch
  27. image_batch, label_batch = get_batch_data(batch_size=batch_size)
  28. with tf.Session() as sess:
  29. coord = tf.train.Coordinator()
  30. threads = tf.train.start_queue_runners(sess, coord)
  31. try:
  32. for i in range(epoch_num): # 每一轮迭代
  33. print '************'
  34. for j in range(batch_total): #每一个batch
  35. print '--------'
  36. # 获取每一个batch中batch_size个样本和标签
  37. image_batch_v, label_batch_v = sess.run([image_batch, label_batch])
  38. # for k in
  39. print(image_batch_v.shape, label_batch_v)
  40. except tf.errors.OutOfRangeError:
  41. print("done")
  42. finally:
  43. coord.request_stop()
  44. coord.join(threads)

输出:

[python] view plaincopyprint?
  1. ************
  2. --------
  3. ((3, 224, 224, 3), array([0, 1, 2], dtype=int32))
  4. --------
  5. ((3, 224, 224, 3), array([3, 4, 0], dtype=int32))
  6. ************
  7. --------
  8. ((3, 224, 224, 3), array([1, 2, 3], dtype=int32))
  9. --------
  10. ((3, 224, 224, 3), array([4, 0, 1], dtype=int32))
  1. ************
  2. --------
  3. ((3, 224, 224, 3), array([0, 1, 2], dtype=int32))
  4. --------
  5. ((3, 224, 224, 3), array([3, 4, 0], dtype=int32))
  6. ************
  7. --------
  8. ((3, 224, 224, 3), array([1, 2, 3], dtype=int32))
  9. --------
  10. ((3, 224, 224, 3), array([4, 0, 1], dtype=int32))

每次生成的batch中含有3个样本,不打乱次序,所以生成的tensor序列是按照‘0,1,2,3,4,0,1,2,3……’排列的。

如果设置每个batch中含有2个样本,打乱次序,即设置 batch_size = 2, tf.train.slice_input_producer函数中 shuffle=True,输出为:

[python] view plaincopyprint?
  1. ************
  2. --------
  3. ((2, 224, 224, 3), array([3, 0], dtype=int32))
  4. --------
  5. ((2, 224, 224, 3), array([4, 1], dtype=int32))
  6. --------
  7. ((2, 224, 224, 3), array([2, 3], dtype=int32))
  8. ************
  9. --------
  10. ((2, 224, 224, 3), array([1, 0], dtype=int32))
  11. --------
  12. ((2, 224, 224, 3), array([2, 4], dtype=int32))
  13. --------
  14. ((2, 224, 224, 3), array([1, 4], dtype=int32))
  1. ************
  2. --------
  3. ((2, 224, 224, 3), array([3, 0], dtype=int32))
  4. --------
  5. ((2, 224, 224, 3), array([4, 1], dtype=int32))
  6. --------
  7. ((2, 224, 224, 3), array([2, 3], dtype=int32))
  8. ************
  9. --------
  10. ((2, 224, 224, 3), array([1, 0], dtype=int32))
  11. --------
  12. ((2, 224, 224, 3), array([2, 4], dtype=int32))
  13. --------
  14. ((2, 224, 224, 3), array([1, 4], dtype=int32))

与tf.train.batch函数相对的还有一个tf.train.shuffle_batch函数,两个函数作用一样,都是生成一定数量的tensor,组成训练一个batch需要的数据集,区别是tf.train.shuffle_batch会打乱样本顺序。

tf.train.slice_input_producer(转)相关推荐

  1. TensorFlow数据读取机制:文件队列 tf.train.slice_input_producer和 tf.data.Dataset机制

    TensorFlow数据读取机制:文件队列 tf.train.slice_input_producer和tf.data.Dataset机制 之前写了一篇博客,关于<Tensorflow生成自己的 ...

  2. tf.train.Coordinator和tf.train.start_queue_runners

    TensorFlow提供了两个类来实现对Session中多线程的管理:tf.Coordinator和 tf.QueueRunner,这两个类往往一起使用. Coordinator类用来管理在Sessi ...

  3. tensorflow中协调器 tf.train.Coordinator 和入队线程启动器 tf.train.start_queue_runners

    TensorFlow的Session对象是支持多线程的,可以在同一个会话(Session)中创建多个线程,并行执行.在Session中的所有线程都必须能被同步终止,异常必须能被正确捕获并报告,会话终止 ...

  4. tf.train.Coordinator

    tensorflow中协调器 tf.train.Coordinator 和入队线程启动器 tf.train.start_queue_runners ensorFlow的Session对象是支持多线程的 ...

  5. TFRecord tf.train.Feature

    一.定义 事先将数据编码为二进制的TFRecord文件,配合TF自带的多线程API,读取效率最高,且跨平台,适合规范化存储复杂的数据.上图为TFRecord的pb格式定义,可发现每个TFRecord由 ...

  6. tf.train.Saver函数的用法之保存全部变量和模型

    用于保存模型,以后再用就可以直接导入模型进行计算,方便. 例如: [python] view plaincopy import tensorflow as tf; import numpy as np ...

  7. tf.train.MomentumOptimizer()优化器

    tf.train.MomentumOptimizer(learning_rate,momentum,use_locking=False,use_nesterov=False,name='Momentu ...

  8. tf.train.examle函数

    在自定义数据集中: example = tf.train.Example(features=tf.train.Features(feature={'img_raw': tf.train.Feature ...

  9. tensorflow tf.train.Saver.restore() (用于下次训练时恢复模型)

    # 保存当前的Session到文件目录tf.train.Saver().save(sess, 'net/my_net.ckpt') # 然后在下次训练时恢复模型: tf.train.Saver().r ...

最新文章

  1. R语言ggplot2可视化:ggplot2可视化两个水平条形图(horizontal)、并设置两个条形图使用共享的X轴、使用类似population pyramid可视化的方式绘制共享X轴的水平条形图
  2. 【杂谈】为什么邀请大家加入硬核知识星球有三AI
  3. 雅虎与软银构和:拟出售雅虎日本35%股份
  4. 前端兼容性问题:快速去掉mac safari浏览器input右边的小图标/小按钮
  5. r语言将百分数化为小数_C语言入门学习(一)
  6. 软件安装(JDK+MySQL+TOMCAT)
  7. C++面试宝典 基本语言(三)
  8. oracle中的视图详解
  9. WPF:从WPF Diagram Designer Part 1学习控件模板、移动、改变大小和旋转
  10. SpringCloud Ribbon
  11. 股票余额理财会影响打新吗?
  12. 办公室海王小姐姐悄悄问我如何在PC端登录多个微信小号?
  13. Ubuntu 配置VNC时,出现“perl: warning: Falling back to the standard locale (C).”等提示错误解决方法...
  14. 在阿里云上试用 Knative 1
  15. python小测验答案_2020中国大学《计算机应用基础(Python)》结课测验答案高校邦《教你动手做H5小游戏》章测试答案...
  16. 牛顿迭代法的matlab程序,牛顿迭代法matlab程序
  17. 计算机应用技术和cad,计算机图形技术与CAD
  18. 根据屏幕分辨率设置 layer.open 的大小
  19. stm32-W5500-官网教程
  20. FPGA协同验证方法-资料整理

热门文章

  1. vb代码转换为java_有人可以解释如何使用JACOB将VB代码转换为Java吗?
  2. sybase 设置默认值_[转]SYBASE 数据库操作笔记
  3. boost linux 测试程序,Linux平台下安装 boost 库
  4. php框架原理 php初识,初识PHP
  5. CDays–5 习题二(利用Python科学计算特性,使用常用计算符)及相关内容解析。...
  6. xcode4.1自带SVN配置
  7. mysql-------视图
  8. NLP知识包--语义分析-语义角色标注
  9. Sainkho Namtchylak-Old Melody那浓郁的忧伤
  10. ParallelActivity