TensorFlow学习笔记--CIFAR-10 图像识别

tensorflow 数据读取原理

深度学习数据增强原理

一、CIFAR-10数据集简介

是用于普通物体识别的小型数据集,一共包含 10个类别RGB彩色图片(包含:(飞机、汽车、鸟类、猫、鹿、狗、蛙、马、船、卡车)。图片大小均为 3232像素*,数据集中一共有 50000 张训练图片和 1000 张测试图片。部分代码来自于tensorflow官方,以下表格列出了所需的官方代码。

文件 用途
cifar10.py   建立CIFAR-1O预测模型  
cifar10_input.py   在tensorflow中读入CIFAR-10训练图片  
cifar10_input_test.py   cifar10_input 的测试用例文件  
cifar10_train.py   使用单个GPU或CPU训练模型  
cifar10_train_multi_gpu.py   使用多个gpu训练模型  
cifar10_eval.py   在测试集上测试模型的性能  
二、下载CIFAR-10数据

在工程根目录创建 cifar10_download.py ,输入如下代码创建下载数据的程序:

# 引入当前目录中已经编写好的cifar10模块 import cifar10 # 引入tensorflow import tensorflow as tf # 定义全局变量存储器,可用于命令行参数的处理 # tf.app.flags.FLAGS 是tensorflow 内部的一个全局变量存储器 FLAGS = tf.app.flags.FLAGS # 在cifar10 模块中预先定义了cifar-10的数据存储路径,修改数据存储路径 FLAGS.data_dir = \'cifar10_data/\' # 如果数据不存在,则下载 cifar10.maybe_download_and_extract()

执行完这段代码后,CIFAR-10数据集会下载到目录 cifar10_data 目录下。默认的存储路径书 tmp/cifar10_data,定义在代码文件cifar10.py中,位置大约在53行附近。
修改完数据存储路径后,通过 cifar10.maybe_download_and_extract()来下载数据,下载期间如果数据存在于数据文件夹中则跳过下载数据,反之下载数据。下载成功后会提示 Successfully downloaded cifar-10-binary.tar.gz 170052171 bytes.
下载完成后,cifar10_data/cifar-10-batches-bin 中将出现8个文件,名称和用途如下表:

文件名 用途
batches.meta.txt   存储每个类别的英文名  
data_batch_1.bin、…、data_batch_5.bin   CIFAR-10的五个训练集,每个训练集用二进制格式存储了10000张32*32的彩色图像和图相对应的标签,没个样本由3073个字节组成,第一个字节未标签,剩下的字节未图像数据  
test_batch.bin   存储1000张用于测试的图像和对应的标签  
readme.html   数据集介绍文件  
三、TensorFlow 读取数据的机制

普通方式
将硬盘上的数据读入内存中,然后提供给CPU或者GPU处理

内存队列方式
普通方式读取数据会出现GPU或CPU在一段时间内存在空闲,导致运算效率降低。利用内存队列,将数据读取和计算放在两个线程中,读取线程只需向内存队列中读入文件,而计算线程只用从内存队列中读取计算需要的数据,这样就解决了GPU或者CPU的空闲问题。

文件名队列+内存队列
TensorFlow采用 文件名队列+内存队列,这种方式可以很好的管理epoch(注1)和避免计算单元的空闲问题。举个例子,假设有三个数据文件要执行一次epoch,那么就在文件名队列中放入这三个数据文件各一次,并且在最后放入的数据文件后面标注队列结束。内存队列依次从文件名队列的顶部读取数据文件,读到结束标记后就会自动抛出异常,捕获这个异常后程序就可以结束。如果是执行N次epoch,那么就把每个数据文件放入文件名队列N次。

注1:
对于数据集来说,运行一次epoch就是将数据集里的所有数据完整的计算一遍,以此类推运行N次epoch就是将数据集里的所有数据完整的计算N遍

四、创建文件名队列和内存队列

创建文件名队列
利用tensorflow的 tf.train.string_input_producer()(注2) 函数。给函数传入一个文件名列表,系统将会转换未文件名队列。tf.train.string_input_producer() 函数有两个重要的参数,分别是 num_epochsshuffle ,num_epochs表示epochs数,shuffle表示是否打乱文件名队列内文件的顺序,如果是True表示不按照文件名列表添加的顺序进入文件名队列,如果是Flase表示按照文件名列表添加的顺序进入文件名队列。

创建内存队列
在tensorflow中不手动创建内存队列,只需使用 reader对象从文件名队列中读取数据就可以了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgzswd.html