首页
学习
活动
专区
工具
TVP
发布

深度学习系列教程(九)利用TensorFlow搭建手写数字识别系统(上)

"玩转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人才

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180109B0PVWA00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券