MNIST数据集简介
MNIST数据集是NIST数据集的一个子集,是一个手写体数字识别数据集
它包含60000张图片作为训练数据,10000张图片作为测试数据
在MNIST数据集中的每一张图片都代表了0~9中的一个数字,图片的大小都是28*28,且数字都出现在图片的正中间
如图所示,一张数字图片及和它对应的像素矩阵
为了验证模型训练的效果,一般还需要从训练数据中划分出一部分数据作为验证数据
TensorFlow中的封装(基本过时)
样例程序
|
|
解读
MNIST数据集被划分为train、validation和test三个数据集
处理后的每一张图片都是一个长度为784的一维数组,因为神经网络的输入是一个特征向量,所以在此把一张二维图像的像素矩阵放到一个一维数组中可以方便TensorFlow将图片的像素矩阵提供给神经网络的输入层
像素矩阵中元素的取值范围为[0,1],它代表了颜色的深浅
使用mnist.train.next_batch()可以从所有的训练数据中读取一小部分作为一个batch
回顾主要概念
直接给出代码
|
|
输出
|
|
超参数
如何设置超参数的取值
使用测试数据来选取超参数会导致神经网络模型过度拟合测试数据,从而导致失去对未知数据的预测能力
为了评估神经网络模型在不同超参数下的效果,一般会从训练数据中抽取一部分作为验证数据,使用验证数据来验证模型效果
交叉验证
在MNIST问题上,完全可以通过模型在验证数据上的表现来判断一个模型的优劣
一般来说选取的验证数据分布越接近测试数据分布,模型在验证数据上的表现越可以体现模型在测试数据上的表现
五种优化方法:
在超参数相同的情况下,使用不同优化方法,经过30000训练迭代后,得到的最终模型的正确率
由于MNIST问题本身相对简单,所以滑动平均、指数衰减和正则化带来的提升效果并不特别明显
正则化和不使用正则化的损失函数的变化趋势
简介
TensorFlow提供了通过变量名称来创建或者获得一个变量的机制
通过这个机制,在不同的函数中可以直接通过变量的名字来使用变量,而不需要将变量通过参数的形式到处传递
TensorFlow中通过变量名称获得变量的机制主要通过tf.get_variable()
和tf.variable_scope()
来实现
当tf.get_variable()
用来创建变量时,它和tf.Variable()的功能是基本等价的
|
|
对于tf.get_variable()
,变量名称是一个必填的参数
tf.get_variable()
会根据这个名字去创建或者获取变量tf.get_variable()
首先试图去创建一个名字为v的参数,如果创建失败,这个程序会报错,这是为了避免无意识的变量复用造成的问题如果需要通过tf.get_variable()
获得一个已经创建的变量,需要通过tf.variable_scope()
函数来生成一个上下文管理器,并明确指定在这个上下文管理器中,tf.get_variable()
将直接获得已经生成的变量
|
|
tf.variable_scope()
函数使用参数reuse=True生成上下文管理器时,这个上下文管理器内所有的tf.get_variable()
函数会直接获得已经创建的变量,如果变量不存在就会报错tf.variable_scope()
函数不使用参数reuse=True生成上下文管理器时,tf.get_variable()
会创建新的变量,如果同名的变量已经存在,则tf.get_variable()
函数会报错tf.variable_scope()
不仅生成上下文管理器,也会生成命名空间,在命名空间中创建的所有变量名称都会带上这个命名空间名的前缀
|
|
简介:TensorFlow提供了tf.train.Saver
类来保存和还原一个神经网络模型
保存TensorFlow计算图的代码样例
|
|
TensorFlow模型的文件组织
.ckpt
的文件中model.ckpt.meta
:保存TensorFlow计算图的结构model.ckpt
:保存TensorFlow程序中每一个变量的取值checkpoint
:保存了一个目录下所有的模型文件列表加载已经保存的TensorFlow模型的代码样例
|
|
直接加载已经持久化的图的代码样例(为了不重复定义图上的运算)
|
|
如何在保存和加载时对变量进行重命名
tf.train.Saver
类时可以提供一个列表来指定需要保存或者加载的变量,比如 saver = tf.train.Saver([v1])
|
|
使用Saver保存和加载滑动平均
将计算图中的变量及其取值通过常量的形式保存
Saver
会保存运行TensorFlow程序所需要的全部信息,但是有时并不需要某些信息。比如,在离线预测时,只需要知道如何从神经网络的输入层经过前向传播计算得到输出层即可,而不需要类似于变量初始化、模型保存等辅助节点的信息解决:TensorFlow提供了convert_variables_to_constants()
将计算图中的变量及其取值通过常量的方式保存
导出为常量
|
|
导入常量
|
|
当调用Saver.save()
时,会生成4个文件。TensorFlow持久化通过这四个文件实现
MetaGraphDef(model.ckpt.meta)
model.ckpt.data和model.ckpt.index
checkpoint