大家好,在这一篇文章中,我们将做以下的三件事:
1:介绍mnist数据集的使用
2:创建模型,并且保存模型
3:在测试集中使用保存的模型进行检测
一:介绍mnist数据集的使用
对于mnist数据集,具体的一些介绍我这里就不搬运过来了,这里我直接说我们如何在TensorFlow上使用mnist数据集.
在我们将mnist数据集准备喂入神经网络时,我们需要提前对数据集进行处理,因为数据集的大小是28*28像素,我们就将每张图片处理成长度784的一维数组,将这个数组作为神经网络的训练特征喂入神经网络.
举个例子:
一张数字手写体图片变成长度为 784 的一维数组[0.0.0.0.0.231 0.235 0.459 ……0.219 0.0.0.0.]输入神经网络。该图片对应的标签为[0.0.0.0.0.0.1.0. 0.0],标签中索引号为 6 的元素为 1,表示是数字 6 出现的概率为 100%,则该图片对应的识别结果是6。
而在TensorFlow中,我们加载数据集的时候,是使用input_data的read_data_sets().
具体指令如下:
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets(’./data/’,one_hot=True)
接着说说上边的指令:
在 read_data_sets()函数中有两个参数,第一个参数表示数据集存放路径,第二个参数表示数据集的存取形式。当第二个参数为 Ture 时,表示以独热码形式 存取数据集。read_data_sets()函数运行时,会检查指定路径内是否已经有数据 集,若指定路径中没有数据集,则自动下载,并将 mnist 数据集分为训练集 train、 验证集 validation 和测试集 test 存放。如图下所示:
二:创建模型,并且保存模型
在这个例子中,我们也是有三个过程,一个是前向传播,另外一个是反向传播,在反向传播中我们要用到正则化,指数衰减学习,滑动平均方法的设置,最后一个就是测试模块.
①:前向传播
关于前向传播的理论知识,有兴趣的小伙伴可以翻翻我之前的文章,那里有详细的介绍,这里只讲述在TensorFlow中,我们是如何使用前向传播过程完成神经网络的搭建.
大家在搭建前向传播时,其实可以遵照一些固定的结构:
在前向传播过程中,需要定义神经网络中的参数 w 和偏置 b,定义由输入到输出的 网络结构。通过定义函数 get_weight()实现对参数 w 的设置,包括参数 w 的形 状和是否正则化的标志。同样,通过定义函数 get_bias()实现对偏置 b的设置。
现在让我们创建一个:mnist_forward的py文件:
在这个代码里,我们完成了基本的网络搭建,是一个两层的神经网络,一层隐藏层,一层输出层.如果有兴趣的同学也可以自己调解下layer_node的个数或者是多加几层来看看效果怎么样.
②:反向传播
在使用反向传播时,我们也是有固定的结构:
反向传播过程中,用 tf.placeholder(dtype, shape)函数实现训练样本 x 和样 本标签 y_占位,函数参数 dtype 表示数据的类型,shape 表示数据的形状;y 表示定义的前向传播函数 forward;loss 表示定义的损失函数,一般为预测值与样 本标签的交叉熵(或均方误差)与正则化损失之和;train_step 表示利用优化算 法对模型参数进行优化
常 用 优 化 算 法 GradientDescentOptimizer 、 AdamOptimizer、MomentumOptimizer 算法,在上述代码中使用的 GradientDescentOptimizer 优化算法。
接着实例化 saver 对象,其中利用 tf.initialize _all_variables().run()函数实例化所有参数模型,利用 sess.run( )函数实现模型的训练优化过程,并每间隔一定轮数保存一次模型。
现在我们创建mnist_backward的py文件:
参照上述的代码文件,我们来说说如何在TensorFlow中使用正则化,指数衰减率和滑动平均.
①:正则化
在上文中提到过,我们在forward.py中设置了正则化,这表明在反向传播中我们\优化模型参数是,需要在损失函数中加入正则化:
结构如下:
首先在forward.py中提前声明:
if regularizer != None:
tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(regularizer)(w))
其次再在backward.py中声明:
ce = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y, labels=tf.argmax(y_, 1))
cem = tf.reduce_mean(ce)
loss = cem + tf.add_n(tf.get_collection('losses'))
这样我们就在反向传播中引入了正则化.
②:指数衰减学习率
在训练模型时,使用指数衰减学习率可以使模型在训练的前期快速收敛接近较优 解,又可以保证模型在训练后期不会有太大波动.
如果在TensorFlow中使用指数衰减学习率.我们要在backward.py中加入:
learning_rate = tf.train.exponential_decay(
LEARNING_RATE_BASE,
global_step,
LEARNING_RATE_STEP,
LEARNING_RATE_DECAY,
staircase=True)
③:滑动平均
在模型训练时引入滑动平均可以使模型在测试数据上表现的更加健壮。
在TensorFlow引入滑动平均需要加入:
ema = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY, global_step)
ema_op = ema.apply(tf.trainable_variables())
with tf.control_dependencies([train_step, ema_op]):
train_op = tf.no_op(name='train')
经过上述的完善,我们的反向传播模型也已经基本搭建完成.
在我们运行backward.py之后,我们的模型会保存在当前目录里,接下来我们可以在测试集中调用我们所训练的模型:
三:在测试集中使用保存的模型进行检测
①:创建mnist_test.py
当神经网络模型训练完成后,便可用于测试数据集,验证神经网络的性能。结构如下:
通过对测试数据的预测得到准确率,从而判断出训练出的神经网络模型的性能好坏。当准确率低时,可能原因有模型需要改进,或者是训练数据量太少导致过拟合。
代码如下:
另外大家在使用pycharm运行这个文件时,会发生:
这样其实是没有运行到该文件的主函数,解决方法是:
将mnist_test添加至运行环境下:
这样即可运行.
四:运行结果:
1;运行backward.py:
误差总体是减小的,这里有些问题是因为我的训练次数太少.
2:运行test.py
在使用9000步的模型时,测试集达到的准确率是97.66%.
因此来看,模型具有一定的泛化能力.