移动端AI与ML应用开发:基于iOS和Android
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.1 为视觉使用神经元

在第1章编写的示例中,你看到了当给出线性方程中直线上的点的一些示例时,神经网络如何将自身“拟合”到线性方程所需的参数中。从视觉上看,我们的神经网络可能如图2-1所示。

图2-1:使用神经网络将X拟合到Y

这是最简单的神经网络,只有一层,而这一层只有一个神经元。

事实上,我在创建这个例子时有点作弊,因为密集层中的神经元在学习权重和偏差时本质上是线性的,所以对一个线性方程来说,一个神经元就足够了!

但是,当我们对此进行编码时,请记住我们创建了一个Sequential,并且该Sequential包含一个Dense,如下所示:

如果我们想要更多层,则可以使用相同的代码模式。例如,如果我们想表示一个如图2-2所示的神经网络,就很容易做到。

图2-2:稍微高级一点的神经网络

首先,让我们考虑图2-2中的元素。神经元的每个垂直排列都应被视为一层。图2-3向我们展示了这个模型中的层。

要对这些进行编码,我们只需在Sequential定义中列出它们,将我们的代码更新为如下所示的代码:

我们简单地将层定义为逗号分隔的定义列表,并将其放在Sequential中,因此你可以在这里看到,有两个单元的Dense,紧接着有一个单元的Dense,我们得到的架构如图2-3所示。

图2-3:神经网络中的层

但在每种情况下,我们的输出层都只是一个值。输出端有一个神经元,并且给定的这个神经元只能学习权重和偏差,对于理解图像的内容不是很有用,因为即使是最简单的图像也有太多的内容无法仅由一个值表示。

那么如果我们在输出上有多个神经元呢?考虑图2-4中的模型。

图2-4:具有多个输出的神经网络

现在我们有多个输入和多个输出。为了设计一些东西来识别和解析图像中的内容(你记得,这就是我们定义计算机视觉的方式),如果我们将输出神经元分配给想要识别的类会怎样?

我们的意思是什么?就像学习一门语言一样,你是一个字一个字地学习它,所以在学习如何解析图像时,我们必须限制计算机可以理解的事物数量。因此,举例来说,如果从简单开始,让计算机识别猫和狗之间的区别,我们可以创建两种图像类型(猫或狗)的“词汇表”,并为每个图像分配一个输出神经元。这里通常使用术语“类”,不要与面向对象编程中的类混淆。

因为你有固定数量的“类”,你希望自己的模型能够识别这些“类”,所以使用的术语通常是分类或图像分类,你的模型也可以称为分类器。

因此,为了识别猫或狗,我们可以将图2-4更新为图2-5。

图2-5:更新为猫或狗

所以我们将一张图片输入神经网络,最后它有两个神经元。这些神经元每输出一个数字,我们都希望该数字代表网络是否认为它“看到”了一只狗或一只猫。可以把这种方法扩展到其他类别,因此如果你想识别不同的动物,只需要额外的输出神经元来表示它们的类别。但为保持简单,我们暂时只用两个。

所以,现在我们的问题变成了如何表示我们的数据,以便计算机开始将我们的输入图像与我们想要的输出神经元进行匹配?

一种方法是使用独热编码(one-hot encoding)。乍一看,这似乎有点烦琐和浪费,但是当你了解基本概念以及它如何与神经网络结构匹配时,它就开始变得有意义了。这种类型的编码背后的想法是有一个值数组,它的大小是我们的类数量。该数组中的每个元素都为零,除了代表你想要的类的元素。在这种情况下,你将其设置为1。

例如,如果你查看图2-5,则会看到两个输出神经元——一个用于猫,一个用于狗。因此,如果想表示一只猫的样子,我们可以将其表示为[1,0],类似地,如果想表示一只狗的样子,我们可以将其编码为[0,1]。在这一点上,你可能会想,当你识别更多类(比如1000)时,这看起来是多么浪费,其中数据上的每个标签将有999个0和一个1。

这绝对效率不高,但你只有在训练模型时才为图像存储这样的数据,完成后便可以将其丢弃。由于你的模型的输出层具有与此编码匹配的神经元,因此当你阅读它们时,知道哪些代表哪类。

所以,如果用猫和狗的这些编码来更新图2-5中的内容,那么若输入一张猫的图像,则我们希望这个输出看起来像那些编码,如图2-6所示。

图2-6:使用独热编码来标记猫

现在神经网络按照我们希望的方式运行。我们输入猫的图像,输出神经元以编码[1,0]响应,表明它“看到”了一只猫。这为我们提供了可用于训练网络的数据表示的基础。因此,例如,如果我们有一堆猫和狗的图像,并且我们相应地标记这些图像,那么神经网络可能会“拟合”这些输入内容和这些标签,使得将来的图像会给出相同的输出。

事实上,将要发生的是,输出神经元不会给出1或0,而是给出一个介于0和1之间的值。这也恰好是一个概率值。因此,如果使用独热编码标签在图像上训练神经网络,并为每个类输出一个神经元,那么你最终将拥有一个模型来解析图像并返回它可以看到的概率列表,如图2-7所示。

图2-7:解析图像的内容

在这里,你可以看到模型确定它正在看香蕉的可能性为98.82%,而它看的是Granny Smith苹果或无花果的可能性较小。虽然很明显这是香蕉,但当这个应用程序查看图像时,它从图像中提取特征,其中一些特征可能存在于苹果中——例如皮肤纹理或者颜色。

可以想象,如果你想训练一个模型,你需要大量的图像示例,这些示例需要根据它们的类别进行标记。值得庆幸的是,有一些基本数据集限制了范围以使其易于学习,接下来我们将考虑从头开始构建分类器。