练习: inference()
中的模型跟多项式逻辑回归,又被叫做softmax 回归。Softmax 回归在网络的输出层上附加了一个1-hot encoding的权重衰减损失。模型的目标函数是求交叉熵损失和所有权重衰减项的和,loss()
函数的返回值就是这个值。
在TensorBoard中使用Training中看看其他方法),其学习率随时间以指数形式衰减。
train()
函数会添加一些操作使得目标函数最小化,这些操作包括计算梯度、更新学习变量(详细信息请查看GradientDescentOptimizer
)。train()
函数最终会返回一个用以对一批图像执行所有计算的操作步骤,以便训练并更新模型。
开始执行并训练模型
我们已经把模型建立好了,现在通过执行脚本cifar10_train.py
来启动训练过程。
python cifar10_train.py
注意: 当第一次在CIFAR-10教程上启动任何任务时,会自动下载CIFAR-10数据集,该数据集大约有160M大小,因此第一次运行时泡杯咖啡小栖一会吧。
你应该可以看到如下类似的输出:
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步训练过程后打印出总损失值,以及最后一批数据的处理速度。下面是几点注释:
练习: 当实验时,第一阶段的训练时间有时会非常的长,长到足以让人生厌。可以尝试减少初始化时初始填充到队列中图片数量来改变这种情况。在cifar10.py
中搜索NUM_EXAMPLES_PER_EPOCH_FOR_TRAIN
并修改之。
cifar10_train.py
会周期性的在保存模型中的所有参数,但是不会对模型进行评估。cifar10_eval.py
会使用该检查点文件来测试预测性能(详见下面的描述:评估模型)。
如果按照上面的步骤做下来,你应该已经开始训练一个CIFAR-10模型了。TensorBoard提供了该功能,可以通过cifar10_train.py
中的ExponentialMovingAverage
了解如何实现。
评估模型
现在可以在另一部分数据集上来评估训练模型的性能。脚本文件cifar10_eval.py
对模型进行了评估,利用 inference()
函数重构模型,并使用了在评估数据集所有10,000张CIFAR-10图片进行测试。最终计算出的精度为1:N,N=预测值中置信度最高的一项与图片真实label匹配的频次。(It calculates the precision at 1: how often the top prediction matches the true label of the image)。
为了监控模型在训练过程中的改进情况,评估用的脚本文件会周期性的在最新的检查点文件上运行,这些检查点文件是由cifar10_train.py
产生。
python cifar10_eval.py
注意:不要在同一块GPU上同时运行训练程序和评估程序,因为可能会导致内存耗尽。尽可能的在其它单独的GPU上运行评估程序,或者在同一块GPU上运行评估程序时先挂起训练程序。
你可能会看到如下所示输出:
2015-11-06 08:30:44.391206: precision @ 1 = 0.860
...
评估脚本只是周期性的返回precision@1 (The script merely returns the precision @ 1 periodically)--在该例中返回的准确率是86%。cifar10_eval.py
同时也返回其它一些可以在TensorBoard中进行可视化的简要信息。可以通过这些简要信息在评估过程中进一步的了解模型。
训练脚本会为所有学习变量计算其tf.name_scope()
通过添加一个范围前缀来提供该唯一名称。比如,第一个tower中的所有操作都会附带一个前缀tower_0
,示例:tower_0/conv1/Conv2D
;