cifar10图像分类总结

文章目录

  • 一、 cifar10数据处理方面
  • 二、cifar10网络结构
  • 三、运行代码
  • 四、tensorflow可视化之tensorboard
  • 五、代码解释

作为第一个认真跑过的tensorflow程序,需要总结一下
github代码链接

一、 cifar10数据处理方面

tensorflow有两种数据输入方法,
第一种是使用feed_dict,这种方法在画graph的时候使用placeholder来站位,在真正run的时候通过feed字典把真实的输入传进去。比较简单不再介绍。
第二种直接从文件中读取数据,包括建立tf. train.string_ input_producer ,读文件,启动文件队列tf. train. start_ queue_ runners。
介绍第二种
1.选择要读取的文件的名字,用 tf.train.string_input_producer 函数来生成文件名队列,这个函数可以设置shuffle = Ture,来打乱队列,可以设置epoch = 5,过5遍训练数据。
2.选择的文件读取器,读取文件名队列并解码,输入 tf.train.shuffle_batch 函数中,生成 batch 队列,传递给下一层。
1)假如你要读取的文件是像 CSV 那样的文本文件,用的文件读取器和解码器就是 TextLineReader 和 decode_csv 。

2)假如你要读取的数据是像 cifar10 那样的 .bin 格式的二进制文件,就用 tf.FixedLengthRecordReader 和 tf.decode_raw 读取固定长度的文件读取器和解码器。
3)如果你要读取的数据是图片,或者是其他类型的格式,那么可以先把数据转换成 TensorFlow 的标准支持格式 tfrecords ,它其实是一种二进制文件,通过修改 tf.train.Example 的Features,将 protocol buffer 序列化为一个字符串,再通过 tf.python_io.TFRecordWriter 将序列化的字符串写入 tfrecords,然后再用跟上面一样的方式读取tfrecords,只是读取器变成了tf.TFRecordReader,之后通过一个解析器tf.parse_single_example ,然后用解码器 tf.decode_raw 解码。

本文采用第二种数据读入方法。
cifar10 32323的尺寸,长32,宽32,共3通道
5个训练集50000张,1个测试集10000张,都是二进制数据,每一张总3073个字节,是由【标签,3072】组成。

数据集下载

python cifar10_download.py 

数据量太小需要进行数据增强操作,以下几个操作

  • ·平移 :将图像在一定尺度范围内平移。
  • ·旋转·将图像在一定角度范围内旋转。
  • ·翻转 :水平翻转或上下翻转图像。
  • ·裁剪:在原有图像上裁剪出一块。
  • ·缩放 :将图像在一定尺度内放大或缩小。
  • 颜色变隐:对图像的 RGB 颜色空间进行一些变换。
  • ·噪声扰动:给国像加入一些人工生成的躁声。

二、cifar10网络结构

图像数据-卷积层1-池化层1-局部卷积归一化层1(LRN层)-卷积层2-局部卷积归一化层2(LRN层)-池化层2-全连接层1-全连接层2-softmax层

三、运行代码

模型输入: 包括 inputs()、distorted_inputs() 等一些操作,分别用于读取 CIFAR-10 的图像并进行预处理,做为后续评估和训练的输入;
模型训练: 包括 loss() and train() 等一些操作,用于计算损失、计算梯度、进行变量更新以及呈现最终结果

python cifar10_train.py --train_dir cifar10_train/ --data_dir cifar10_data/

模型预测: 包括 inference() 等一些操作,用于进行统计计算,比如在提供的图像进行分类;

python cifar10_eval.py --data_dir cifar10_data/ --eval_dir cifar10_eval/ --checkpoint_dir cifar10_train/

四、tensorflow可视化之tensorboard

进入当前目录,输入以下代码,查看返回ip,输入浏览器中,可以查看训练时候的tensorboard。

tensorboard --logdir cifar10_train/

运行以下代码 查看测试的时候的tensorboard

tensorboard --logdir cifar10_eval/ --port 6007

五、代码解释

1.如果路径不存在就创建一个

 if not os.path.exists(dest_directory):
    os.makedirs(dest_directory)

2.存储名字,os.path.join(a,b)将a,b连接起来

filepath = os.path.join(dest_directory, filename)

3.对于多个编号的数据处理,若不存在就报错

 filenames = [os.path.join(data_dir, 'data_batch_%d.bin' % i)
               for i in xrange(1, 6)]
  for f in filenames:
    if not tf.gfile.Exists(f):
      raise ValueError('Failed to find file: ' + f)

4.需要启动文件队列

filename_queue = tf.train.string_input_producer(filenames)

5.每个样本【1,32323】个字节,用 tf.FixedLengthRecordReader读取固定长度字节数信息比较合适,下次调用时会接着上次读取的位置继续读取文件,而不会从头开始读取,一次读一个样本(3073个字节)
流程:
1).将要读取的文件加入队列
2).用tf.FixedLengthRecordReader产生一个读取固定字节的阅读器
3).用阅读器key, value = reader.read(filename_queue) 返回key,和value

reader = tf.FixedLengthRecordReader(record_bytes=1+32*32*3)

6.产生batch_size的函数,返回四维的图像的Tensor是4-D形状[batch_size, height, width, channels],

 _generate_image_and_label_batch(image, label, min_queue_examples, batch_size, shuffle)

capacity是队列的长度
min_after_dequeue是出队后,队列至少剩下min_after_dequeue个数据
假设现在有个test.tfrecord文件,里面按从小到大顺序存放整数0~100
tf.train.batch是按顺序读取数据,队列中的数据始终是一个有序的队列,
比如队列的capacity=20,开始队列内容为0,1,…,19=>读取10条记录后,队列剩下10,11,…,19,然后又补充10条变成=>10,11,…,29,
队头一直按顺序补充,队尾一直按顺序出队,到了第100条记录后,又重头开始补充0,1,2…
tf.train.shuffle_batch(shuffle=TRUE)是将队列中数据打乱后,再读取出来,因此队列中剩下的数据也是乱序的,

7.随机处理图像,扩大图像数据

distorted_image = tf.random_crop(reshaped_image, [height, width, 3])随机裁剪从 32 32 裁剪到 24 24

随机翻转图片

 distorted_image = tf.image.random_flip_left_right(distorted_image)

随机改变亮度和对比度

  distorted_image = tf.image.random_brightness(distorted_image,max_delta=63)
  distorted_image = tf.image.random_contrast(distorted_image, lower=0.2, upper=1.8)

你可能感兴趣的:(深度学习)