机器学习很有趣!第3章:深度学习和卷积神经网络

2020-03-03 14:42:57 浏览数 (1)

很多的文章会介绍有关深度学习的一些新闻报道,但我们却并不真正了解其背后的原理!那么今天我们这篇文章便会带大家一览其中的奥秘!

Google 现在可以让你在你自己的图片库里面

根据你的描述搜索图片,

即使这些图片根本没有被标注任何标签!这是怎么做到的??

今天,我们这篇文章将会学习如何利用深度学习算法来通过编写程序实现图像识别。相信通过今天的学习,你能够清楚的理解Google相册分类以及搜索照片的工作原理。

让我们现在开始吧!

就像第1章第2章一样,本系列的文章适合对机器学习感到好奇但不知道从哪里开始的小伙伴。关注我们公众号,制定加星标,相信很快你就能走进机器学习的乐园!(如果您尚未阅读第1章第2章,请立即阅读!)

通过深度学习识别对象

xkcd#1425(在这里查看原图)

您可能以前曾经看过这本著名的xkcd漫画。

愚蠢的想法是,任何3岁的孩子都能认出一张鸟的照片,但是50多年来,弄清楚如何使计算机识别物体的方法使最优秀的计算机科学家感到困惑。

在过去的几年中,我们终于找到了一种使用深度卷积神经网络进行物体识别的好方法。这听起来像是威廉·吉布森(William Gibson)科幻小说中的一堆虚构词,但如果将它们一一分解,这些想法是完全可以理解的。

因此,让我们做吧-让我们编写一个可以识别鸟类的程序!

从简单开始

在学习如何识别鸟类图片之前,让我们学习如何识别更简单的内容-手写数字“ 8”。

在第2部分中,我们了解了神经网络如何通过将许多简单的神经元链接在一起来解决复杂的问题。我们创建了一个小型神经网络,根据房屋的数量,房屋的大小以及房屋的所在区域来估算房屋的价格:

就和这个漫画一样,也许一个3岁的小孩可以很快识别出鸟类的照片,而最顶尖的计算机科学家们却已经花了50年的时间来研究如何让电脑识别出不同的物体。所以,在电脑科学领域,有时候很难解释简单跟几乎办不到的差别。

由浅入深

现在我们终于可以通过深度卷积神经网络(Deep convolutional neural networks)来实现鸟类的识别,在我们开始学习编写识别鸟类的程序之前,让我们由浅入深,开始一个更加简单的任务——识别手写的数字【8】。

在第二章中,我们已经了解了神经网络如何通过将许多简单的神经元链接在一起来解决复杂的问题。在那个章节中我们创建了一个小型的神经网络,根据房屋的数量,房屋的大小以及房屋的所在区域来估算房屋的价格:

我们也知道:机器学习算法的思想是通过将相同的通用算法(泛型算法)来反复使用,以处理不同的数据,从而可以解决不同的问题。因此,今天,我们将会通过修改类似的神经网络以识别手写文本。但是为了使工作真正简单,我们今天将只尝试识别一个数字“8”。

机器学习仅在我们拥有数据(最好是大数据)的时候才起作用。因此,我们需要大量手写的“8”来开始我们的训练。幸运的是,正好有研究人员为此创建了MNIST手写数字数据库:

(http://yann.lecun.com/exdb/mnist/)。MNIST提供60,000张手写数字图像,每个图像为18x18分辨率的图像。图中是数据集中的一些数字“ 8”:

MNIST数据库中的数字【8】

我们在第2部分中构建的神经网络,只能接受三个数字来作为输入(“ 3”个卧室,“ 2000”平方英尺等)。但是现在我们想用我们的神经网络处理图像。那么我们应该如何将图像而不是数字,输入到神经网络里面呢?

答案非常简单。神经网络会将数字作为输入。对于计算机来说,图像实际上就是一连串的数字网格,每个数字代表着每个像素的值。

如果我们要将上面这样的图像输入到我们的神经网络里面,我们其实只需将18x18像素的图像描述为包含324个数字的数组即可,如下图所示:

那么为了更好的处理我们这324个数字的输入,我们需要将神经网络的输入节点进行扩大以适应324个输入节点:

请注意,我们的神经网络现在也有两个输出(而不是第二章中案例的只有一个输出)。第一个输出将会预测图像为“ 8”的可能性,第二个输出将会预测图像不是“ 8”的可能性。通过为要识别的对象提供不同的输出,我们便可以通过神经网络来将对象进行分类。

我们的神经网络比上一次大得多(324个输入,而不是3个!)。但是,以任何现代计算机的算力都可以轻松处理具有数百个节点的神经网络。甚至现在也可以在您的手机上来实现。

接下来我们要做的就是:用“ 8”和一些非“ 8”的图像来训练我们神经网络,以便让他来学会区分它们。例如当我们输入“ 8”时,我们将告诉它此时“ 8”的概率是100%,而不是“ 8”的概率是0%,反之亦然。

这是我们的一些训练数据:

加油训练吧!

我们可以在一台现代笔记本电脑上在几分钟内训练这种神经网络。完成后,我们将拥有一个神经网络,可以非常准确地识别“ 8”的图片。欢迎来到(1980年代时期)图像识别的世界!

30年过去了,现在还是这样么?

也许你会说:真正简单,只要地将像素输入到神经网络,就可以进行图像识别!然而事实是这样么?

呵呵,当然不是那么简单。

首先,比较好的是如果我们的数字“8”是在图片的正中间的时候,我们的识别器的识别准确度会高出很多:

但是:

当数字不在图像正中时,我们的“ 8”识别器就完全无法工作。

这是因为我们的网络仅学习了完美居中的数字“ 8”模式。完全不知道偏心的“ 8”是什么。它仅仅知道中间是【8】的图片规律。

然而现实世界中的问题从来都不是那么简单的。因此,我们需要弄清楚在“ 8”不完全居中的情况下如何使神经网络工作。

暴力方法#1:滑动搜索窗口

我们已经创建了一个非常好的程序,可以很好地识别以“8”为图像中心的图片。如果我们直接将整个图片分成一个个小部分,并且每个部分都去识别一遍,直到我们找到“8”,这个方案可行么?

这种方法称为sliding window。这是暴力算法的一种。在某些有限的情况下,它可以很好地工作,但是效率很低。您必须一遍又一遍地检查同一张图片,识别不同大小的对象。还有更好的办法么?

暴力方法2:更多数据和深度神经网络

当我们训练我们的网络时,我们只显示出完美居中的“ 8”字。如果我们用更多数据训练图像,包括图像周围所有不同位置和大小的“ 8”,结果会不会好一些?

我们甚至不需要收集新的培训数据。我们只需要编写一个脚本来生成新的图像,图像中所有不同位置的位置都带有“ 8”,例如:

我们通过创建已有图像的不同版本来创建Synthetic Training Data。这是非常有用的技术!

使用此技术,我们可以轻松创建无休止的培训数据。

数据越多,神经网络就越难解决问题,但是我们可以通过扩大网络规模并因此学习更复杂的模式来弥补这一问题。

为了扩大网络,我们只要逐层堆叠节点:

我们称其为“深度神经网络”,因为它比传统的神经网络具有更多的层次。

这个想法自1960年代后期开始出现。但是直到最近,训练如此庞大的神经网络还是太慢而无用。但是如今,我们可以通过使用3D显卡代替普通的计算机处理器,来处理这些庞大的神经网络,从而使得大型神经网络的工作便突然变得可行。实际上,您用来玩《守望先锋》的NVIDIA GeForce GTX 1080显卡就可以用来快速地训练神经网络。

但是,即使我们可以使神经网络真正变大并使用3d显卡对其进行快速训练,但这仍然无法将我们带到一个完整的解决方案中。我们需要更聪明地将图像处理到神经网络中。

想一想。训练网络来识别图片顶部的“ 8”与训练网络来识别图片底部的“ 8”当成两个不同的情况对象来处理似乎总不是那么聪明,就好像它们是两个完全不同的对象一样。

应该有某种方法可以使神经网络足够智能,以至于无需任何额外的训练就可以知道图片中任何地方的“ 8”都是同一个“8”。有这样的解决方案么?


0 人点赞