这次的实验仍旧是图像识别,使用的数据集是CIFAR-10,其中包含10个类别的RGB彩色图片:飞机、汽车、鸟类、猫、鹿、狗、蛙类、马、船和卡车,其中训练图片共50000张,测试图片共10000张。实验来自于《21个项目玩转深度学习:基于TensorFlow的实践详解》一书中的实验,在这里做一篇学习笔记,笔者不才,欢迎斧正!
项目文件如下: 。其中,
一、下载CIFAR-10数据
运行cifar10_download.py代码,成功将数据集下载到目录中。
可以看到数据集中数据文件名及用途:
二、Tensorflow的数据读取机制
读取数据集必须考虑的一个问题:GPU/CPU因为I/O而空闲的问题
简单地将图片数据集从内存中读进CPU或GPU中进行计算,读取的时间便意味在降低内存的效率。为了解决这个问题,方法即将读入数据和计算分别放在两个线程中,先将数据读入内存队列中。读取线程负责读入数据到内存队列,另一个线程则负责计算,计算需要数据时直接从内存队列中取即可。
Tensorflow使用“文件名队列+内存队列”双队列的形式读入文件,更好的管理epoch。
对于一个数据集来讲,运行一个epoch就是将这个数据集中的图片全部计算一遍。运行一个epoch,就在文件名队列中把A、B、C各放入一次,并在之后标注队列结束。
程序运行后,内存先读取A,再依次读取B、C。
由于系统检测到“结束”,则自动抛出异常,外部捕捉到这个异常后就可以结束程序了。这就是Tensorflow中读取数据的基本机制。如果要运行两个epoch,那么只要在文件名队列中将A、B、C依次放入两次再标记结束就可以了。
在Tensorflow中创建文件名队列和内存队列
使用tf.train.st