神经网络如何识别图像?

机器算法验证 机器学习 神经网络 图像处理
2022-01-17 16:17:29

我正在尝试学习神经网络如何在图像识别中发挥作用。我看过一些例子,变得更加困惑。在 20x20 图像的字母识别示例中,每个像素的值成为输入层。所以400个神经元。然后是一个隐藏层神经元和 26 个输出神经元。然后训练网络,然后它就可以工作了,并不完美。

神经网络让我感到困惑的是,它如何了解图像中的内容。您不需要进行阈值处理、分割或测量,网络以某种方式学习比较图像和识别。现在对我来说就像魔术一样。从哪里开始学习神经网络?

4个回答

在研究 1980 年代 Kunihiko Fukushima 教授关于新认知的工作时,我对神经网络如何学习对像图像数据这样复杂的事物进行分类有了一个重要的见解。他不只是向他的网络展示一堆图像,并使用反向传播让它自己计算事物,而是采用了不同的方法,逐层训练他的网络,甚至逐个节点地训练他的网络。他分析了网络中每个单独节点的性能和操作,并有意修改了这些部分,以使它们以预期的方式响应。

例如,他知道他希望网络能够识别线,因此他训练了特定的层和节点来识别三个像素水平线、三个像素垂直线以及各个角度的对角线的特定变化。通过这样做,他确切地知道当期望的模式存在时,可以指望网络的哪些部分被触发。然后,由于每一层都高度连接,整个新认知器作为一个整体可以识别图像中存在的每个复合部分,无论它们物理存在于何处。因此,当图像中某处存在特定线段时,总会有一个特定节点会触发。

保持这张图片永远存在,考虑线性回归,它只是通过平方误差之和找到一个公式(或一条线),它最接近地传递你的数据,这很容易理解。为了找到弯曲的“线”,我们可以进行相同的乘积计算,除了现在我们添加了一些 x^2 或 x^3 甚至更高阶多项式的参数。现在你有一个逻辑回归分类器。这个分类器可以找到本质上不是线性的关系。事实上,逻辑回归可以表达任意复杂的关系,但您仍然需要手动选择正确数量的幂特征才能很好地预测数据。

考虑神经网络的一种方法是将最后一层视为逻辑回归分类器,然后可以将隐藏层视为自动“特征选择器”这消除了手动选择输入特征的正确数量和功率的工作。因此,NN 成为自动功率特征选择器,可以找到任何线性或非线性关系 或用作任意复杂集合的分类器**(这仅假设有足够的隐藏层和连接来表示它需要学习的模型)。最后,一个运行良好的 NN 不仅要学习输入和输出之间的“关系”,而且我们要争取一个抽象或模型概括得很好。

根据经验,如果有足够的时间从相同的数据中学习,神经网络无法从理论上学习一个合理智能的人类无法学习的任何东西,但是,

  • 它可能能够学到一些还没有人想出来的东西
  • 对于大型问题,一组处理神经网络的计算机可以比一组人更快地找到真正好的解决方案(成本低得多)
  • 一旦经过训练的 NN 将与他们接受过训练的输入产生一致的结果,并且如果调整得当,应该可以很好地泛化
  • NN永远不会感到无聊或分心

您可能听说过神经网络是“通用函数逼近器”。本质上,Cybenko 定理说,对于任何将实数映射到实数的函数,您都可以使用具有 sigmoid 激活函数的神经网络来近似它。事实上,事实证明,神经网络允许您计算任何可由图灵机计算的函数(即任何您可以编写算法来计算的函数)。不幸的是,这些证明仅表明对于神经元和权重的某些有限配置,您可以逼近任何函数。

这个理论很好,很花哨,但你的问题似乎更多的是如何将某些函数的计算实际编码为一组神经元和权重。为了说明,考虑一个简单的例子——异或。XOR 接受两个输入,然后传递这些输入。当只有一个输入被激活时,输出节点被激活。如果两个输入都被激活或都不激活,那么输出节点不会被激活。

一个三层感知器网络,能够计算从维基百科借来的 XOR。

请注意,三个隐藏节点做不同的事情。最左边和最右边的节点只是通过相应的输入节点激活。中间神经元接受这两个输入,如果它们都打开,则以某种方式否定它们。这种巧妙的输入组合和重新组合本质上是神经网络中的工作方式。

显然,对于更复杂的功能,组合和重新组合必须以更聪明和更复杂的方式完成,但这本质上是在低级别发生的。疯狂的是,这实际上是计算任何可计算函数所需的全部内容!话又说回来,图灵机也变得看似简单......

问题是我们真的没有办法神奇地生成计算任意函数的神经网络。证明只告诉我们有一些网络可以做到这一点。当我们训练我们的神经网络时,我们只是试图找到一个非常接近的网络。

在图像识别的上下文中,您可以想象将模式编码到网络中。例如,要识别数字“1”,您可以想象一个隐藏节点,该节点期望一列像素大部分或全部被激活,而相邻像素处于关闭状态。这个隐藏节点可能非常擅长识别该特定列中的直线。把足够多的这些放在一起,很快你就会有一堆节点在你的图像的足够多的地方做这件事,如果我向网络展示一个,足够的直线隐藏节点将被激活,指示一个“1”。问题当然变成了泛化网络,以便它可以识别一组不同的输入。

希望这可以帮助您或多或少地理解神经网络如何执行计算的概念。然而,你已经找到了关于神经网络相当重要的一点:一般来说,很难理解为什么网络会吐出一个特定的输出,尤其是当你考虑到像图像识别这样的东西时,网络通常是足够大,以至于人类很难理解机器的每个运动部件。使问题进一步复杂化的是,通常大多数神经网络实际上并没有为网络可以了解数据的每个小特征提供一个隐藏节点。相反,检测诸如直线之类的东西来对数字“1”进行分类将以非集中方式在许多隐藏节点上进行。其他算法,

如果您正在寻找更多阅读内容,我强烈建议您在 ai junkie阅读本教程。它向您介绍了神经网络如何工作的基础知识,甚至提供了一个简单的代码示例,让神经网络驱动坦克朝着目标前进。然而,本教程不涉及反向传播,这是迄今为止训练神经网络最常用的方法,而是使用简单的遗传算法。一旦他开始谈论遗传学,我想你可以停止阅读......

让你困惑的是

它如何了解图像中的内容。

图像中的内容由图像像素中的值数字表示。如果您以图像中的颜色为例。像素可能有三个值,每个值代表三种主要颜色 - 红色、绿色和蓝色 ( RGB)。带有 ( 10,50,100) 的像素意味着它比带有 ( ) 的像素具有“更少”的蓝色元素40,50,100因此,在图像中,第一个像素代表蓝色较少的区域。这是神经网络从图像的一个位置/区域到另一个位置/区域学习的信息,最终“知道”图像中的内容。相同的原理适用于可用作神经网络输入的其他图像特征(除了颜色)。请参阅,以及以了解基本图像概念,然后移至了解神经网络的工作原理。

所有的机器学习问题都是一样的。你有一些训练数据,学习一个代表这些数据的模型,并有能力以你聚类、分类、学习不同算法的方式概括这些知识。

在图像识别中,您再次拥有一组想要了解的图像。

  1. 首先处理这些图像,然后从图像中提取一些特征(许多可能的图像特征方案,如 SIFT、Bag of WORDS),就像您使用像素及其值一样。
  2. 将这些具有相应特征向量的图像提供给您的 ML 算法(神经网络、SVM 或其他)。
  3. 学习一个模型
  4. 使用此模型来识别在训练数据上充分可见的对象。

如果您想识别多个事物,请为每个事物使用多个分类器。