利用Tensorflow的队列多线程读取数据
在tensorflow中,有三种方式输入数据1.利用feed_dict送入numpy数组
2.利用队列从文件中直接读取数据
3.预加载数据
其中第一种方式很常用,在tensorflow的MNIST训练源码中可以看到,通过feed_dict={},可以将任意数据送入tensor中。
第二种方式相比于第一种,速度更快,可以利用多线程的优势把数据送入队列,再以batch的方式出队,并且在这个过程中可以很方便地对图像进行随机裁剪、翻转、改变对比度等预处理,同时可以选择是否对数据随机打乱,可以说是非常方便。该部分的源码在tensorflow官方的CIFAR-10训练源码中可以看到,但是对于刚学习tensorflow的人来说,比较难以理解:
1.使用tf.train.string_input_producer函数把我们需要的全部文件打包为一个tf内部的queue类型,之后tf开文件就从这个queue中取目录了,要注意一点的是这个函数的shuffle参数默认是True,也就是你传给他文件顺序是1234,但是到时候读就不一定了,我一开始每次跑训练第一次迭代的样本都不一样,还纳闷了好久,就是这个原因。
首先,把CIFAR-10的测试集文件读取出来,生成文件名列表。
path = 'E:\Dataset\cifar-10\cifar-10-batches-py'
filenames = [os.path.join(path, 'data_batch_%d' % i) for i in range(1, 6)]
"""
os.path.join()函数
语法: os.path.join(path1[,path2[,......]])
返回值:将多个路径组合后返回
注:第一个绝对路径之前的参数将被忽略
#合并目录
>>>
import
os
>>> os.path.join(
'/hello/'
,
'good/boy/'
,
'doiido'
)
'/hello/good/boy/doiido'
"""
有了列表以后,利用tf.train.string_input_producer函数生成一个读取队列