Tensorflow一共提供了3种读取数据的方法:
第一种方法个人感觉比较麻烦:在TensorFlow程序运行的每一步, 让Python代码来供给数据,比如说用PIL和numpy处理数据,然后输入给神经网络。
第二种方法:从文件读取数据,在TensorFlow图的起始, 让一个输入管线从文件中读取数据:string_input_producer()和slice_input_producer()。
他们两者区别可以简单理解为:string_input_producer每次取出一个文件名。slice_input_producer可以既可以同时放出文件名和它对应的label,也可以只放出一个文件名。而在实际应用代码的时候也只是读取文件的方式不一样,其他大致相同。
string_input_producer加载数据的方法:
reader = tf.FixedLengthReader(record_bytes=record_bytes)
key,value = reader.read(filename_queue),其中key是文件名,value是byte类型的文件流二进制,一般需要解码(decode)一下才能变成数组,然后进行reshape操作。
path_queue是文件队列,文件队列的生成的方法:
filenames = [os.path.join(data_dir, ‘data_32_QP%d.dat‘ % i) for i in range(1,4)] ##data_dir是数据的路径,data_32_QP%d.dat是数据文件
for f in filenames:
if not gfile.Exists(f): ## 判断目录或文件是否存在,filename可为目录路径或带文件名的路径,有该目录则返回True,否则False。
raise ValueError(‘Failed to find file:‘ + f )
filename_queue = tf.train.string_input_producer(filenames) ##输出一个带有字符串的队列
reader = tf.FixedLengthReader(record_bytes=record_bytes) ##record_bytes 是读取的字符长度,优点是每次读取后,下次读取是接着此处读取,不会重新从文件头开始读取
key,value = reader.read(filename_queue) ## 数据读取之后需要 处理一下:record_bytes = tf.decode_raw(value, tf.uint8)
record_bytes = tf.decode_raw(value, tf.uint8) ## 这个函数主要用于数据类型的转变,不会改变原始数据的值还有形状的
slice_input_producer加载图片的reader使用tf.read_file(filename)直接读取。记得图片需要解码和resize成数组,才可以放入内存队列file_queue中等待调用。
原文地址:https://www.cnblogs.com/Mydream6/p/11333952.html