CIFAR-10是机器学习分类问题中的一个标尺问题。目标是将RGB 32*32的图像分成10类:飞机(airplane),汽车(automobile),鸟(bird),猫(cat),鹿(deer),狗(dog),青蛙(frog),马(horse),船(ship),卡车(truck)。
建立一个相对小的卷积神经网络分类图像。在这个过程中,
1. 强调了网络结构、训练和评估的规范组织方式。
2. 提供了构建更大和更精细的模型的模板。
选择CIFAR-10的原因:一是它足够复杂,可以训练TensorFlow的大规模模型的大部分能力;二是,它足够小,可以快速训练,这对于尝试新想法和实验新技术是理想的。
本教程为在TensorFlow中设计更大和更精细的模型了展示几个重要构想:
对输入数据预提取队列(queues),让模型从硬盘延迟和图像预处理中独立出来。
也提供了多GPU版本,暂时忽略。
模型是一个包含卷积和非线性的多层结构,后面连着全连接层和softmax分类器。模型遵循Alex Krizhevsky描述的结构。
共有1,068,298个学习参数,在单张影像上计算inference需要19.5M个乘-加操作。
在单GPU加速的电脑上训练了4个多小时,精度达到86%。本电脑GPU是NVIDIA GeForce GTX 650。
代码文件
cifar-10文件包含了网络的各个操作,完整的训练图包含765个操作。通过使用一下模块构建图,我们可以使代码更具复用性。
1. 模型输入(Model Inputs): inputs() 和distorted_inputs()分别为评估和训练阶段读取和预处理图像。
2. 模型预测(Model predictions):inference()进行推导(inference)操作。
3. 模型训练(Model training): loss()计算损失,train()计算梯度和更新参数。可视化summaries。
用inputs()和distorted_inputs()函数从CIFAR-10二进制文件中输入图像。因为文件包含字节固定长度的记录,所以使用tf.FixedLengthRecordReader。关于Reader如何工作,详见Reading Data。
图像处理方法:
- 图像被裁剪成24*24大小,评估时从中心裁剪,训练时随机裁剪。
- 近似白化图像,让模型对动态范围不敏感。
训练时,人工对图像增加一些列随机变形操作,以增大图像数据集:
- 随机从左到右翻转(flip)图像。
- 随机扭曲图像亮度(image brightness)。
- 随机扭曲图像对比度(iamge contrast)。
使用iamge_summary,可以在TensorBoard中可视化图像,验证输入图像是否正确。读取图像并扭曲图像很耗费时间,为防止减慢训练,在16个独立线程里处理。
用inference()计算预测值的逻辑斯(logits)。下图展示模型层次组成
N-way 分类一般用多项式逻辑回归,比如Softmax。损失函数的total loss包括交叉熵(cross-entropy),正则化的weight decay loss。
在tensorboard中可视化total loss
使用SGD和指数衰减的学习率
运行代码
python cifar10_train.py
输出
Filling queue with 20000 CIFAR images before starting to train. This will take a few minutes.
2015-11-04 11:45:45.927302: step 0, loss = 4.68 (2.0 examples/sec; 64.221 sec/batch)
2015-11-04 11:45:49.133065: step 10, loss = 4.66 (533.8 examples/sec; 0.240 sec/batch)
2015-11-04 11:45:51.397710: step 20, loss = 4.64 (597.4 examples/sec; 0.214 sec/batch)
2015-11-04 11:45:54.446850: step 30, loss = 4.62 (391.0 examples/sec; 0.327 sec/batch)
2015-11-04 11:45:57.152676: step 40, loss = 4.61 (430.2 examples/sec; 0.298 sec/batch)
2015-11-04 11:46:00.437717: step 50, loss = 4.59 (406.4 examples/sec; 0.315 sec/batch)
…
每10个step输出一次,有total loss,每秒处理样本数和运行一个batch需要的时间。
cifar-10周期性地在checkpoint files中保存模型参数。checkpoint files会在cifar10_eval.py中测试预测效果。
cifar10_train.py使用SummaryWriter周期性地保存中间数据,tensorboard可以实现可视化。
在CMD中输入
tensorboard –logdir=\tmp\cifar10_train
在谷歌浏览器(推荐)中进入http:\172.16.102.55:6006,即可打开tensorboard。
输入
python cifar10_eval.py
输出
2015-11-06 08:30:44.391206: precision @ 1 = 0.860
…
精度在86%左右。
参考:官方教程Convolutional Neural Networks