本部分是书中的第五章内容。
第五章 MNIST数字识别问题
1. TensorFlow提供了封装好的MNIST数据处理类,在这里将直接使用这个类,将数据从原始的数据包中解析成训练和测试神经网络所使用的格式。
每一张图片是一个28*28的大小,处理后的图片是一个长度是784的一维数组。数组中的数字大小在[0 1]之间。
2. 训练、验证和测试
使用神经网络进行训练数据集。
因为神经网络训练的时间本身比较长,所以若采用交叉验证集进行验证模型的效果,则会花费很长的时间。所以,在海量数据的时候一般采用验证数据集的方式来评测模型的效果。
调整神经网络的结构对于最终的正确率有很大的影响。由于本身数据集不是特别大,所以使用滑动平均模型、指数衰减的学习率和正则化所带来的正确率的提升不是很明显。
3. 变量管理
当神经网络的结构更加复杂、参数更多时,需要一种更好的方式来传递和管理神经网络的参数。TensorFlow提供了通过变量名称的方式来创建或获取一个变量的机制。通过这个机制,可以在不同的函数中直接通过变量的名字来使用变量,而不需要将变量通过参数的形式传递。这种机制是通过tf.get_variable和tf.variable_scope函数来实现的。
(1) tf.get_variable在用于创建变量时,是和tf.Variable等价的。区别在于指定变量名称的参数,在后者中变量名称是一个可选的参数,而在前者中是一个必选的参数。
(2)tf.variable_scope函数生成一个上下文管理器,来控制tf.get_variable获取一个已经创建的变量。
4. TensorFlow模型持久化
为了让训练的结果可以复用,需要将训练得到的神经网络模型持久化。
(1)TensorFlow提供一个API用于保存和还原一个神经网络。这个API是tf.train.Saver类。
TensorFlow模型一般会被保存在后缀是.ckpt的文件中。在这个文件目录之下有三个文件。第一个文件保存了计算图的结构。第二个文件保存了TensorFlow中每一个变量的取值。最后一个文件保存了一个目录之下的所有的模型文件列表。
(2)持久化是由上面说的三个文件来完成的。
5. 结合3和4介绍示例MNIST(结合3中的变量管理机制和4中的持久化机制)
本节将前向传播过程抽象成一个函数,因为在训练和测试中被用到,所以按照函数的方式使用起来更方便。
代码被拆分成为三个程序:程序1定义了前向传播过程和神经网络中的参数;
程序2定义了神经网络的训练过程(关注正则损失P127);
程序3定义了测试过程(不关注正则损失P130,所以设置参数是None。这里是在滑动平均模型上做测试)。将训练和测试的过程分来。