"玩转TensorFlow与深度学习模型”系列文字教程,本周带来TensorFlow 中的正则化方法!
大家在学习和实操过程中,有任何疑问都可以通过学院微信交流群进行提问,有导师和助教、大牛为您解惑答疑哦。(入群方式在文末)
第八篇的教程主要教大家使用TensorFlow搭建神经网络,利用MNIST数据集对网络训练,进行手写数字识别。本次教程包括以下几个模块:
简单介绍MNIST数据集
创建一个softmax 回归模型用于识别MNIST中的数字
使用TensorFlow利用数千张图片训练模型
使用测试数据集对模型的准确度进行测试
增加非线性函数,构成DNN
准备工作
建立模型之前,首先下载MNIST数据集、建立一个TensorFlow session。
MNIST 简要介绍
MNIST(Modified National Institute of Standards and Technology database) 是机器学习和深度学习中常用的数据集,内容是手写数字灰度图片,每张图片的大小为 28 * 28,其中训练集的大小为60000张图片,测试集为10000张图片,数据集可以从这个网站(http://yann.lecun.com/exdb/mnist/)下载。
每个图片可以看作是一个28 * 28 的矩阵,取值是0-255之间的整数,0表示黑色,255表示白色。在将数据输入模型之前通常我们需要对图片中的数据进行归一化,其中最常见的方法就是对于每个值除以255,将原数据对应到0-1之间的一个浮点数再进一步处理。
载入MNIST数据
教程中我们使用TensorFlow自带的函数来下载和处理MNIST数据集。
输出:
开始一个TensorFlow InteractiveSession
一般在IPython等有交互使用的情境下,会使用tf.InteractiveSession,它与普通的session唯一的区别就是构造的时候会将自己设置为默认的session,而不需要,在进行运算时不需要显示地指明session。
建立一个Softmax回归模型
这一节我们将建立一个只有一个线性层的softmax回归模型,下一节中,我们将对模型进行扩展,建立一个多层的CNN网络。
Placeholder
我们从为输入的图像和输出的分类创建节点开始创建计算图。
在此处x,y_ 都不是实际的值,当我们要求TensorFlow进行计算的时候我们会对对应的值进行输入。此处x是一个浮点类型的2d tensor,我们定义时分配的shape 为[None, 784],其中784是将28*28的MNIST图片变成一个向量,None表示第一维可以为任何大小,对应batch size。y_是每张图片对应的数字,也是一个2d tensor,其中第一维仍然可以任意大小,与batch size相等即可,每一行是一个one-hot 十维向量,每行只有一个值为1,图片中的数字的标签,其余9个位置都是0.
Variable
现在定义权重W和偏置b,Variable存在于TensorFlow的计算图中,在计算执行的时候使用或者改变。
此处我们将W,b全部初始化为0, W是一个784*10的矩阵,因为输入为784维的特征向量,输出为10维的结果,b是一个10维向量,因为输出结果是10维的。
在Variable在session中使用之前,我们必须在对应的session中对Variable进行初始化。这部分包括指定变量的初始值(上步已经做过了)和将值赋值给对应变量。
预测结果和损失函数
现在我们可以实现我们的回归模型了。
我们可以轻松地指明一种损失函数,损失函数表明了我们模型在对一个例子进行预测时的表现,我们需要尝试减少模型对于全部数据预测时的损失,此处我们使用的是cross-entropy作为损失函数。
训练模型
现在我们已经定义了模型和训练时的损失函数,我们可以直接利用Tensor Flow对模型进行训练了。由于已经定义好了计算图,TensorFlow可以对变量进行自动微分,TensorFlow中内置了多种优化算法,这里我们使用梯度下降,学习率定义为0.5,目标函数为cross entropy。
通过以上的代码TensorFlow在计算图中增加了新的计算操作,包括计算梯度,计算参数更新数值,以及更新对应的参数。当执行返回的操作trainstep时,将会计算梯度并且更新参数,因此可以通过重复执行trainstep对模型进行训练。
每次训练的时候我们载入100个训练数据,当运行trainstep的时候我们使用feed_dict用实际数据来替代定义的placeholder(x,y_)。利用session.run运行trainstep,计算cross entropy。
评价模型
首先我们需要知道模型在什么时候的预测是正确的,可以使用tf.argmax函数,tf.argmax根据输入的tensor和axis返回最大值的下标,比如tf.argmax(y, 1)就是y中每一行的最大值,即模型认为输入对应的最可能的预测结果,然后我们可以使用tf.equal来检查我们的预测结果是否正确。
这将会返回bool类型的链表,为了计算正确比例,我们需要将bool类型转化为float并且平均。
构建深度神经网络
下面我们加入包含非线性激活函数的全连接层,构建一个深度神经网络。
通过上述的操作,我们定义了三个包含非线性激活函数的隐层,依次连接,一层的输出是另一层的输入,选择了ReLU作为激活函数的种类,对权重和偏置进行了初始化。
隐层的输出经过线性变换以后得到一个矩阵,其中每一行为一个10维向量,经过softmax以后得到的结果为模型的预测输出,仍然使用交叉熵作为损失函数。
初始化变量
训练模型
仍然使用梯度下降对模型进行训练
评价模型
定义一个函数用来评估模型准确率,输入是没有经过softmax层的模型输出和正确的label
下周一同一时间"深度学习模型系列教程(十):利用TensorFlow搭建手写数字识别系统(下),我们继续!
TensorFlow与深度学习模型系列教程
加入社群
天学网人工智能学院
培养符合企业需求的实战型AI人才
领取专属 10元无门槛券
私享最新 技术干货