参考:
https://github.com/spmallick/learnopencv
神经网络:30,000英尺的初学者视图
在这篇文章中,我将提供一个30,000 feet 的神经网络视图。 这篇文章是为那些试图在机器学习和深度学习中学习脚趾的初学者而写的。
我们会保持这个简短,sweet ,无数学的。
神经网络作为黑盒子
我们将把神经网络视为一个神奇的黑匣子。 你不知道黑匣子里面是什么。 你只知道它有一个输入和三个输出。 输入是任何大小,颜色,种类等的图像。三个输出是0和1之间的数字。输出标记为“猫”,“狗”和“其他”。 这三个数字总是加起来1。
了解神经网络输出
它执行的魔法非常简单。 如果你输入图像到黑匣子,它会输出三个数字。 一个完美的神经网络可以为一只猫输出(1,0,0),一只狗输出(0,1,0),(0,0,1)输出任何不是猫或狗的东西。 但实际上,即使是训练有素的神经网络也不会给出如此清晰的结果。 例如,如果您输入猫的图像,标签“猫”下的数字可以表示0.97,“狗”下的数字可以表示0.01,标签“其他”下的数字可以表示0.02。 输出可以被解释为概率。 这个特定的输出意味着黑匣子“认为”输入图像有97%的可能性是一只猫的一个机会,一个小的机会是一只狗或者它不认识的东西。 请注意,输出数字合计为1。
这个特殊的问题叫做图像分类。 给定一个图像,你可以使用最高概率的标签给它一个类(Cat,Dog,Other)。
理解神经网络输入
现在,你是一个程序员,你认为你可以使用floats 和doubles 来表示神经网络的输出。
你如何输入图像?
图像只是一个数字的数组。 具有三个通道的256×256图像只是一个256×256×3 = 196,608个数字的数组。 大部分用于读取图像的库将读取256×256彩色图像,并将其转换为内存中的196,608个数字的连续块。
有了这个新的知识,我们知道输入稍微复杂一些。 实际上是196,608个数字。 让我们更新我们的黑匣子来反映这个新的现实。
我知道你在想什么。 图像不是256×256 该怎么办? 那么,你可以使用以下步骤将任何图像转换为256×256大小。
1、非正方形宽高比:如果输入图像不是正方形,则可以调整图像的大小,使得较小的尺寸为256.然后,从图像的中心裁剪256×256像素。
2、灰度图像:如果输入图像不是彩色图像,则可以通过将灰度图像复制到三个通道来创建3通道图像。
人们使用许多不同的技巧将图像转换为固定大小(例如256×256)的图像,但是由于我承诺我会保持简单,所以我不会进入这些技巧。 重要的是要注意的是任何图像都可以被转换成一个固定大小的图像,即使我们在裁剪图像的时候会丢失一些信息,
训练神经网络意味着什么?
黑盒子有可以用来“调”的旋钮。 在技术术语中,这些旋钮被称为weights。 当旋钮处于正确的位置时,神经网络为不同的输入提供更多的正确输出。
训练神经网络只需要找到正确的旋钮设置(或权重)。
你如何训练一个神经网络?
如果你有这个神奇的黑盒,但不知道正确的旋钮设置,这将是一个无用的盒子。
好消息是你可以通过“训练”神经网络找到合适的旋钮设置。
训练一个神经网络非常类似于训练一个小孩。你向孩子展示一个球,并告诉她这是一个“球”。当你用不同种类的球做很多次时,孩子会发现球是球的形状,而不是颜色,质地或大小。然后,你给孩子展示一个鸡蛋,并问:“这是什么?”她回应“球”,你纠正他们,这不是一个球,而是一个鸡蛋。当这个过程重复多次时,孩子能够分辨出球和蛋之间的差异。
为了训练一个神经网络,你要展示几千个你想要学习的类(例如猫,狗,其他)的例子。这种训练称为监督式学习,因为您将神经网络提供给一个类别的图像,并明确地告诉它这是该类别的图像。
为了训练神经网络,我们需要三件事情。
- 训练数据:每个类别的成千上万的图像和预期的输出。例如,对于此数据集中所有猫的图像,期望的输出是(1,0,0)。
- 成本函数:我们需要知道当前设置是否比上一个旋钮设置更好。成本函数将训练集中的所有图像的神经网络的误差总和。例如,一个共同的成本函数被称为平方和误差(SSE)。如果图像的期望输出是猫,或者(1,0,0)和神经网络输出(0.37,0.5,0.13),神经网络在这个特定图像上的平方误差为 (1−0.37)2+(0−0.5)2+(0−0.13)2=0.6638 。所有图像的总成本只是所有图像的平方误差的总和。训练的目标是找到最小化成本函数的旋钮设置。
- 如何更新旋钮设置:最后,我们需要一种方法来根据我们在所有训练图像上观察到的错误更新旋钮设置。
用一个旋钮训练神经网络
比方说,我们有一千个猫的图像,一千个狗的图像,以及一千个不是猫或狗的随机物体的图像。 这三千幅图像是我们的训练集。 如果我们的神经网络没有被训练,它将会有一些随意的旋钮设置,当你输入这三千个图像时,输出将只有三次。
为了简单起见,假设我们的神经网络只有一个旋钮。 由于我们只有一个旋钮,因此我们可以测试涵盖期望旋钮值范围的上千种不同的旋钮设置,并找到使成本函数最小化的最佳旋钮设置。 这将完成我们的训练。
但是,真实世界的神经网络没有一个单一的旋钮。 例如,流行的神经网络架构VGG-Net拥有1.38亿个旋钮!
用多个旋钮训练神经网络
当我们只有一个旋钮时,我们可以通过测试所有(或非常多的)可能性来轻松找到最佳设置。 这很快变得不现实,因为即使我们只有三个旋钮,我们也要测试十亿个设置。 想象一下像VGG-Net这样大的可能性的数量。 不用说强力搜索最佳的旋钮设置是不可行的。
幸运的是,有一条出路。 当成本函数是凸的(即,像碗的形状)时,通过称为渐变下降(Gradient Descent)的方法来迭代地找到最佳权重是有原则的方式
渐变下降
让我们回到我们的神经网络只有一个旋钮,并假设我们目前的旋钮设置(或重量)的估计是W_e。 如果我们的成本函数的形状像一个碗,我们可以找到成本函数的斜率,并更接近最佳的旋钮设置W_o。 这个过程被称为渐变下降,因为我们正在下降(下降)基于斜率(梯度)的曲线。 当你到达碗的底部,梯度或坡度为零,这完成了你的训练。 这些碗形功能在技术上被称为凸函数。
你如何得出第一个估计?你可以选择一个随机数字。
注意:如果您使用流行的神经网络体系结构(如GoogleNet或VGG-Net),您可以使用在ImageNet上训练的权重,而不是选择随机初始权重来获得更快的收敛。
当有多个旋钮时,渐变下降的工作方式类似。例如,当有两个旋钮时,成本函数是3D中的一个碗。如果我们在这个碗的任何部分放置一个球,它会沿着最大下坡的路径向下滚到底部。这正是梯度下降的工作原理。此外,请注意,如果让球以全速滚动下降,则与底部以更受控制的方式缓慢滚动的球相比,底部会超出底部,需要花费更多的时间在底部安顿下来。同样,在训练一个神经网络时,我们使用一个称为学习率的参数来控制成本收敛到最小。
当我们有数百万个旋钮(重量)时,成本函数的形状就是这个高维空间中的一个碗。即使这样一个碗是不可能的,坡度和梯度下降的概念也是如此。因此,梯度下降使我们能够收敛到一个解决方案,从而使问题变得易于处理。
反向传播
在拼图中还剩下一块。 鉴于我们目前的旋钮设置,我们如何知道成本函数的斜率?
首先,我们要记住,成本函数,因此其梯度取决于训练集中所有图像的真实输出和当前输出之间的差异。 换句话说,基于神经网络在这些图像上的表现如何严重,训练集中的每个图像都有助于最终的梯度计算。
用于估计成本函数的梯度的算法被称为反向传播。 我们将在未来的文章中介绍反向传播,是的,它涉及微积分。 你会感到惊讶,虽然退缩只是重复应用你可能在高中学到的连锁规则。