单一数据读取方式:
第一种:slice_input_producer()
# 返回值可以直接通过 Session.run([images, labels])查看,且第一个参数必须放在列表中,如[...][images, labels] = tf.train.slice_input_producer([images, labels], num_epochs=None, shuffle=True)
第二种:string_input_producer()
# 需要定义文件读取器,然后通过读取器中的 read()方法来获取数据(返回值类型 key,value),再通过 Session.run(value)查看file_queue = tf.train.string_input_producer(filename, num_epochs=None, shuffle=True) reader = tf.WholeFileReader() # 定义文件读取器key, value = reader.read(file_queue) # key:文件名;value:文件中的内容
!!!num_epochs=None,不指定迭代次数,这样文件队列中元素个数也不限定(None*数据集大小)。
!!!如果它
不是None
,则此函数创建本地计数器 epochs
,需要使用local_variables_initializer()
初始化局部变量
!!!以上两种方法都可以生成文件名队列。
(随机)批量数据读取方式:
batchsize=2 # 每次读取的样本数量tf.train.batch(tensors, batch_size=batchsize)tf.train.shuffle_batch(tensors, batch_size=batchsize, capacity=batchsize*10, min_after_dequeue=batchsize*5) # capacity > min_after_dequeue
!!!以上所有读取数据的方法,在Session.run()之前必须开启文件队列线程 tf.train.start_queue_runners()
TFRecord文件的打包与读取
一、单一数据读取方式
第一种:slice_input_producer()
def slice_input_producer(tensor_list, num_epochs=None, shuffle=True, seed=None, capacity=32, shared_name=None, name=None)
案例1:
import tensorflow as tf images = ['image1.jpg', 'image2.jpg', 'image3.jpg', 'image4.jpg'] labels = [1, 2, 3, 4] # [images, labels] = tf.train.slice_input_producer([images, labels], num_epochs=None, shuffle=True) # 当num_epochs=2时,此时文件队列中只有 2*4=8个样本,所有在取第9个样本时会出错 # [images, labels] = tf.train.slice_input_producer([images, labels], num_epochs=2, shuffle=True) data = tf.train.slice_input_producer([images, labels], num_epochs=None, shuffle=True) print(type(data)) #with tf.Session() as sess: # sess.run(tf.local_variables_initializer()) sess.run(tf.local_variables_initializer()) coord = tf.train.Coordinator() # 线程的协调器 threads = tf.train.start_queue_runners(sess, coord) # 开始在图表中收集队列运行器 for i in range(10): print(sess.run(data)) coord.request_stop() coord.join(threads) """ 运行结果: [b'image2.jpg', 2] [b'image1.jpg', 1] [b'image3.jpg', 3] [b'image4.jpg', 4] [b'image2.jpg', 2] [b'image1.jpg', 1] [b'image3.jpg', 3] [b'image4.jpg', 4] [b'image2.jpg', 2] [b'image3.jpg', 3] """
!!!slice_input_producer() 中的第一个参数需要放在一个列表中,列表中的每个元素可以是 List 或 Tensor,如 [images,labels],
!!!num_epochs设置
第二种:string_input_producer()
def string_input_producer(string_tensor, num_epochs=None, shuffle=True, seed=None, capacity=32, shared_name=None, name=None, cancel_op=None)
文件读取器
不同类型的文件对应不同的文件读取器,我们称为 reader对象;
该对象的 read 方法自动读取文件,并创建数据队列,输出key/文件名,value/文件内容;
reader = tf.TextLineReader() ### 一行一行读取,适用于所有文本文件 reader = tf.TFRecordReader() ### A Reader that outputs the records from a TFRecords file reader = tf.WholeFileReader() ### 一次读取整个文件,适用图片
案例2:读取csv文
iimport tensorflow as tf 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(www.2275922.com) # 定义文件读取器(一次读取整个文件) # reader = tf.TextLineReader(www.gywhg.net) # 定义文件读取器(一行一行的读) key, value = reader.read(file_queue) # key:文件名;value:文件中的内容 print(type(file_queue)) init = [tf.global_variables_initializer(), tf.local_variables_initializer()] with tf.Session(www.iceason.net) as sess: sess.run(init) coord = tf.train.Coordinator()www.tengyao3zc.cn threads = tf.train.start_queue_runners(sess=sess, coord=coord) try: while not coord.should_stop(www.yixingylzc.cn): for i in range(6): print(sess.run([key, value])) break except tf.errors.OutOfRangeError: print('read done') finally: coord.request_stop(www.jintianxuesha.com) coord.join(threads) """ reader = tf.WholeFileReader(www.huiyinpp3zc.cn) # 定义文件读取器(一次读取整个文件) 运行结果: [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/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'] """ """ reader = tf.TextLineReader(www.jinfylzc.cn) # 定义文件读取器(一行一行的读) 运行结果: [b'data/B.csv:1', b'4.jpg,4'] [b'data/B.csv:2', b'5.jpg,5'] [b'data/B.csv:3', b'6.jpg,6'] [b'data/C.csv:1', b'7.jpg,7'] [b'data/C.csv:2', b'8.jpg,8'] [b'data/C.csv:3', b'9.jpg,9']
import tensorflow as tf filename = ['1.jpg', '2.jpg'] filename_queue = tf.train.string_input_producer(filename, shuffle=False, num_epochs=1) reader = tf.WholeFileReader() # 文件读取器 key, value = reader.read(filename_queue) # 读取文件 key:文件名;value:图片数据,bytes with tf.Session() as sess: tf.local_variables_initializer().run() coord = tf.train.Coordinator() # 线程的协调器 threads = tf.train.start_queue_runners(sess, coord) for i in range(filename.__len__()): image_data = sess.run(value) with open('img_%d.jpg' % i, 'wb') as f: f.write(image_data) coord.request_stop() coord.join(threads)
二、(随机)批量数据读取方式:
功能:shuffle_batch() 和 batch() 这两个API都是从文件队列中批量获取数据,使用方式类似;
案例4:slice_input_producer() 与 batch()
import tensorflow as tf import numpy as np images = np.arange(20).reshape([10, 2]) label = np.asarray(range(0, 10)) images = tf.cast(images, tf.float32) # 可以注释掉,不影响运行结果 label = tf.cast(label, tf.int32) # 可以注释掉,不影响运行结果 batchsize = 6 # 每次获取元素的数量 input_queue = tf.train.slice_input_producer([images, label], num_epochs=None, shuffle=False) image_batch, label_batch = tf.train.batch(input_queue, batch_size=batchsize) # 随机获取 batchsize个元素,其中,capacity:队列容量,这个参数一定要比 min_after_dequeue 大 # image_batch, label_batch = tf.train.shuffle_batch(input_queue, batch_size=batchsize, capacity=64, min_after_dequeue=10) with tf.Session() as sess: coord = tf.train.Coordinator() # 线程的协调器 threads = tf.train.start_queue_runners(sess, coord) # 开始在图表中收集队列运行器 for cnt in range(2): print("第{}次获取数据,每次batch={}...".format(cnt+1, batchsize)) image_batch_v, label_batch_v = sess.run([image_batch, label_batch]) print(image_batch_v, label_batch_v, label_batch_v.__len__()) coord.request_stop() coord.join(threads) """ 运行结果: 第1次获取数据,每次batch=6... [[ 0. 1.] [ 2. 3.] [ 4. 5.] [ 6. 7.] [ 8. 9.] [10. 11.]] [0 1 2 3 4 5] 6 第2次获取数据,每次batch=6... [[12. 13.] [14. 15.] [16. 17.] [18. 19.] [ 0. 1.] [ 2. 3.]] [6 7 8 9 0 1] 6 """
案例5:从本地批量的读取图片 --- string_input_producer() 与 batch()
从本地批量的读取图片案例
案列6:TFRecord文件打包与读取
TFRecord文件打包案列
TFReord文件的读取案列