陈伟@航天科技智慧城市研究院 [email protected]
tf.train.slice_input_producer是一个tensor生成器,作用是按照设定,每次从一个tensor列表中按顺序或者随机抽取出一个tensor放入队列。
slice_input_producer(tensor_list, num_epochs=None, shuffle=True, seed=None, capacity=32, shared_name=None, name=None)
import tensorflow as tf
# 定义4个图片路径列表
images = ['image1.jpg', 'image2.jpg', 'image3.jpg', 'image4.jpg']
# 定义4个Label的列表
labels = [1, 2, 3, 4]
# 产生图像和标签对应的tensor
[images, labels] = tf.train.slice_input_producer([images, labels],
num_epochs=2,
shuffle=True)
with tf.Session() as sess:
# 对全局的变量进行初始化
sess.run(tf.local_variables_initializer())
# 放入线程后,才会产生张量
tf.train.start_queue_runners(sess=sess) # 启动队列填充的线程
for i in range(8): # 从文件队列中获取数据, 总共4条 * 2epoch,所以最多取8条
print(sess.run([images, labels]))
输出如下
[b'image1.jpg', 1]
[b'image4.jpg', 4]
[b'image3.jpg', 3]
[b'image2.jpg', 2]
[b'image2.jpg', 2]
[b'image1.jpg', 1]
[b'image4.jpg', 4]
[b'image3.jpg', 3]
代码已经上传到Github
这个函数跟tf.train.slice_input_producer()类似,不过是针对文件的生成器,传入文件路径列表,每次吐出一个文件。演示代码如下:
"""
读取文件数据
"""
import tensorflow as tf
# 我们放了3个文件在相应的位置
filename = ['data/A.csv', 'data/B.csv', 'data/C.csv']
# 将文件的路径作为参数传入函数
# 输出是文件队列,无法直接获取文件的值
file_queue = tf.train.string_input_producer(filename,
shuffle=True,
num_epochs=2)
# 文件读取器
reader = tf.WholeFileReader()
# key:文件名 value:文件值
key, value = reader.read(file_queue)
with tf.Session() as sess:
# 对局部变量进行赋值
sess.run(tf.local_variables_initializer())
tf.train.start_queue_runners(sess=sess) # 定义文件队列填充的线程
for i in range(6): # 文件数量3 * 2epochs
print(sess.run([key, value]))
输出如下结果:
[b'data/A.csv', b'1.jpg,1\n2.jpg,2\n3.jpg,3\n']
[b'data/B.csv', b'4.jpg,4\n5.jpg,5\n6.jpg,6\n']
[b'data/C.csv', b'7.jpg,7\n8.jpg,8\n9.jpg,9\n']
[b'data/B.csv', b'4.jpg,4\n5.jpg,5\n6.jpg,6\n']
[b'data/A.csv', b'1.jpg,1\n2.jpg,2\n3.jpg,3\n']
[b'data/C.csv', b'7.jpg,7\n8.jpg,8\n9.jpg,9\n']
这部分代码也放到了我的Github上,大家可以参考。