TensorFlow中的单层神经网络

在前言中,我评论说深度学习的一个常见用途包括模式识别。考虑到这一点,就像初学者通过在屏幕上打印“Hello World”开始学习编程语言一样,在深度学习中,我们首先要识别手写数字。

在本章中,我将介绍如何在TensorFlow中逐步构建具有单个层的神经网络。这个神经网络将识别手写数字,它基于Tensor-Flow初学者教程中的一个不同的例子[27]

鉴于本书的介绍风格,我选择引导读者,同时通过示例的某些步骤简化了一些概念和理论上的理由。

如果读者在阅读本章后有兴趣了解更多关于这个例子的理论概念,我建议阅读  神经网络和深度学习  [28],可以在线阅读,提供这个例子,但深入研究理论概念。

MNIST数据集

MNIST数据集由一组包含手写数字的黑白图像组成,包含60,000多个用于训练模型的示例,以及10.000个用于测试它的示例。MNIST数据集可以在MNIST数据库中找到  [29]

这个数据集非常适合大多数开始在实例上进行模式识别的人,而不必花时间进行数据预处理或格式化,这是处理图像时的两个非常重要的步骤,但时间很长。

黑白图像(双层)已经标准化为20×20像素图像,保留了纵横比。对于这种情况,我们注意到图像包含灰度像素,这 是归一化算法中使用的抗锯齿  [30]的结果  (将所有图像的分辨率降低到最低级别之一)。之后,通过计算质心并将其移动到帧的中心,图像以28×28像素帧为中心。图像如下所示:

image034

此外,这个例子所需的学习类型是  监督学习 ; 图像用它们代表的数字标记。这是最常见的机器学习形式。

在这种情况下,我们首先收集数字图像的大数据集,每个数字都用其值标记。在训练期间,模型显示图像并以分数矢量的形式产生输出,每个类别一个分数。我们希望所需类别在所有类别中得分最高,但这在培训之前不太可能发生。

我们计算一个目标函数来衡量输出分数和所需分数模式之间的误差(正如我们在前面章节中所做的那样)。然后,模型修改其内部可调参数,称为权重,以减少此错误。在典型的深度学习系统中,可能存在数亿个这样的可调节重量,以及用于训练机器的数亿个标记示例。我们将考虑一个较小的例子,以帮助理解这种模型的工作原理。

要轻松下载数据,您可以使用从Google的网站[32]获取的脚本  input_data.py  [31],   但上传到本书的  github  以获取您的共性。只需将代码input_data.py下载到   使用TensorFlow编程神经网络的同一工作目录中。从您的应用程序中,您只需要以下列方式导入和使用:

<span style="color:#747474"><span style="color:#000088">import </span><span style="color:#000000">input_data
mnist </span><span style="color:#666600">= </span><span style="color:#000000">input_data </span><span style="color:#666600">。</span><span style="color:#000000">read_data_sets </span><span style="color:#666600">(</span><span style="color:#008800">“MNIST_data /” </span><span style="color:#666600">,</span><span style="color:#000000">one_hot </span><span style="color:#666600">= </span><span style="color:#000088">True </span><span style="color:#666600">)</span></span>

执行这两个指令后,你将有充分的训练数据集  mnist.train  和测试数据集  mnist.test。正如我之前所说,每个元素由一个标记为“ xs ” 的图像和相应的标签“ ys ”组成,以便更容易表达处理代码。请记住,所有数据集,培训和测试都包含“ xs ”和“ ys ”; 此外,训练图像在mnist.train.images中引用,   训练标签在mnist.train.labels中  引用

如前所述,图像由28×28像素形成,并且可以表示为数字matix。例如,1号图像之一可以表示为:

image036

其中每个位置指示0和1之间的每个像素的缺乏程度。该矩阵可以表示为28×28 = 784个数字的阵列。实际上,图像已经在784维度的矢量空间中的一堆点中被变换。只是提到当我们将结构减少到2维时,我们可能会丢失部分信息,对于某些计算机视觉算法,这可能会影响他们的结果,但对于本教程中使用的最简单的方法,这不会是一个问题。

总而言之,我们 在2D中有一个  张量 mnist.train.images,其中调用函数  get_shape()  表示其形状:

TensorShape([Dimension(60000),Dimension(784)])

第一维度索引每个图像中的每个图像和第二个每个像素。张量的每个元素是0到1之间的每个像素的强度。

此外,我们有0到9之间数字形式的标签,表示每个图像代表哪个数字。在这个例子中,我们将标签表示为10个位置的向量,其中所表示数字的对应位置包含1而其余为0.因此  mnist.train.labels es是  张量  形状为  TensorShape([Dimension(60000)) ,Dimension10)])。

人造中子

虽然本书并未关注神经网络的理论概念,但简要而直观地介绍了神经元如何学习训练数据将有助于读者了解正在发生的事情。那些已经了解该理论并且只是寻求如何使用TensorFlow的读者可以跳过本节。
让我们看一个神经元如何学习的简单但说明性的例子。假设一组标记为“方形”和“圆形”的点。给定一个新的“X”点,我们想知道哪个标签对应于它:

屏幕截图2016-02-16 at 09.30.14

通常的近似可能是绘制一条划分两组的直线并将其用作分类器:

屏幕截图2016-02-16 09.30.09

在这种情况下,输入数据由形状为(x,y)的向量表示,表示此二维空间中的坐标,并且我们的函数返回“0”或“1”(线上方或下方)以了解如何将其归类为“方形”或“圆形”。在数学上,正如我们在线性回归章节中所学到的,“线”(分类器)可以表示为  y = W * x + b

推广时,神经元必须学习权重  W  (与输入数据X具有相同的维度)和偏移  b  ( 在神经网络中称为  偏差)以学习如何对这些值进行分类。利用它们,神经元将使用权重W计算X中输入的加权和,并添加偏移量  b ; 最后神经元将应用“激活”非线性函数来产生“0”或“1”的结果。
神经元的功能可以更正式地表达为:

image043

在为我们的神经元定义了这个函数后,我们想知道神经元如何 从我们的例子中带有“正方形”和“圆形”的标记数据中学习那些参数  W  和  b,以便稍后标记新的点“X”。

第一种方法可以类似于我们对线性回归所做的,即用已知的标记数据喂养神经元,并将获得的结果与真实的结果进行比较。然后,在迭代时, 调整W  和  b中的权重  以使误差最小化,如第2章中针对线性回归线所示。

一旦我们得到  W  和  b  参数,我们就可以计算加权和,现在我们需要函数将存储在z中的结果   转换为'0'或'1'。有几个激活函数可用,对于这个例子,我们可以使用一个名为sigmoid  [33]的流行函数  ,返回0到1之间的实数值

image046

看看公式,我们看到它将倾向于返回接近0或1的值。如果输入  z  足够大且为正,则“e”供电于负z为零,然后  y  为1.如果输入  z  足够大否定,“e”驱动到一个大的正数也变成一个大的正数,因此分母变大,最终的  y  变为0.如果我们绘制函数,它将如下所示:

image045

从这里我们已经介绍了如何定义神经元,但神经网络实际上是以不同方式连接在它们之间并使用不同激活函数的神经元组合。鉴于本书的范围,我不会进入神经网络宇宙的所有扩展,但我向你保证它真的令人兴奋。

只是提到神经网络的一个特定情况(其中第5章基于),神经元以层的形式组织,其中下层(输入层)接收输入,顶层(输出) layer)生成响应值。神经网络可以有几个中间层,称为隐藏层。一种表示这种情况的直观方式是:

image049

在这些网络中,层的神经元与前一层的神经元通信以接收信息,然后将其结果传递给下一层的神经元。

如前所述,除了Sigmoid之外还有更多的激活函数,每个激活函数  具有不同的属性。例如,当我们想要在输出层将数据分类为两个以上的类时,我们可以使用  Softmax [34]  激活函数,即sigmoid  函数的推广  。 Softmax  允许获得每个类的概率,因此它们的和为1,最可能的结果是具有更高概率的结果。

一个简单的例子:Softmax

请记住,要解决的问题是,给定输入图像,我们得到它属于某个数字的概率。例如,我们的模型可以预测80%确定性的图像中的“9”,但是有5%的机会成为“8”(由于可疑的较低的迹线),并且还给出一定的低概率任何其他号码。识别手写数字存在一些不确定性,我们无法以100%的置信度识别数字。在这种情况下,概率分布使我们更好地了解我们对预测的信心程度。

因此,我们有一个输出向量,其中包含不同输出标签的概率分布,这是多余的。这是一个具有10个概率值的向量,每个概率值对应于0到9的每个数字,并且所有概率总和为1。

如前所述,我们通过使用具有softmax  激活功能的输出层来实现这一点  。具有softmax  函数的神经元  的输出取决于其层的其他神经元的输出,因为它们的所有输出必须总和为1。

该  SOFTMAX  函数有两个主要步骤:首先,“证据”为属于特定标签的图像被计算,以及后来的证据被转换成概率为每个可能的标签。

归属证据

测量某个图像属于特定类别/标签的证据,通常的近似是计算像素强度的加权和。当具有高强度的像素恰好不在给定类中时,该权重为负,如果该像素在该类中频繁,则该权重为正。

让我们看一个图形示例:假设一个数学“0”的学习模型(我们将看到以后如何学习)。此时,我们将模型定义为“某事物”,其中包含了解数字是否属于特定类的信息。在这种情况下,我们选择了如下所示的模型,其中红色(或b / n版本的亮灰色)代表负面示例(这是,减少对“0”中存在的那些像素的支持),而蓝色(b / n版的深灰色)代表了积极的例子。看它:

image050

想象一下28×28像素的白纸,并画上“0”。通常我们的零点将被绘制在蓝色区域中(请记住,我们在20×20绘图区域周围留下了一些空间,稍后将其居中)。

很明显,在我们的绘图穿过红色区域的情况下,很可能我们没有绘制零。因此,使用基于奖励那些像素的度量标准,踩到蓝色区域并惩罚那些踩红色区域似乎是合理的。

现在想到一个“3”:很明显,我们的模型“0”的红色区域将惩罚它为“0”的概率。但是如果参考模型是下面的那个,通常形成“3”的像素将跟随蓝色区域; “0”的绘制也会进入红色区域。

image052

我希望看到这两个例子的读者理解解释的近似如何允许我们估计哪个数字代表那些图纸。
下图显示了从MNIST数据集中学习的十个不同标签/类的示例(从Tensorflow [35]的示例中提取)。请记住,红色(亮灰色)表示负重量,蓝色(深灰色)表示正值。

image054

在一个更正式的方式,我们可以说,一类证据    给出输入  X  ,表示为:

image056

其中  i  表示类(在我们的情况下,在0和9之间),  j  是一个索引,用于对输入图像的索引求和。最后,  Wi  表示上述权重。

请记住,一般来说,模型还包括一个表示偏差的额外参数,增加了一些基本不确定性。在我们的情况下,公式将如下结束:

image058

对于每个  i  (在0和9之间),我们具有 784个元素(28×28)的矩阵W i,其中每个元素  j  乘以 输入图像的对应分量  j,具有784个分量,然后添加  b i。矩阵演算和索引的图形视图是这样的:

image061

归属概率

我们评论说,第二步是计算概率。具体来说,我们使用  softmax  函数将证据总和转换为预测概率,表示为  y

image062

请记住,输出向量必须是sum等于1的概率函数。为了标准化每个组件,softmax函数使用每个输入的指数值,然后按如下方式对它们进行标准化:

image064

使用指数时获得的效果是权重的乘法效应。此外,当一个类的证据很小时,这个类支持减少了之前权重的一小部分。此外,  softmax  对权重进行归一化,使它们相加1,从而产生概率分布。

这种函数的一个有趣的事实是,一个好的预测将有一个输出值接近1,而所有其他输出将接近零; 在一个    预测中,一些标签可能会显示出类似的支持。

猜你喜欢

转载自blog.csdn.net/taotaobaobei/article/details/83313435