likes
comments
collection
share

卷积神经网络教程 (CNN) – 使用 TensorFlow 在 Python 中开发图像分类器

作者站长头像
站长
· 阅读数 17

在这篇博客中,让我们讨论什么是卷积神经网络 (CNN) 以及 卷积神经网络背后的架构——旨在解决 图像识别系统和分类问题。 卷积神经网络在图像和视频识别、推荐系统和自然语言处理方面有着 广泛的应用

考虑这张纽约天际线的图像,第一眼你会看到很多建筑物颜色。 那么计算机是如何处理这张图像的呢?

卷积神经网络教程 (CNN) – 使用 TensorFlow 在 Python 中开发图像分类器

图像分为3 个颜色通道,即红、绿蓝。 每个颜色通道都映射图像的像素。

卷积神经网络教程 (CNN) – 使用 TensorFlow 在 Python 中开发图像分类器

然后,计算机识别与 每个像素相关 值并确定图像的大小。

然而,对于黑白图像,只有一个通道概念相同的。


为什么不是全连接网络?

当涉及到卷积神经网络时,我们无法使用全连接网络,原因如下!

考虑下图:

卷积神经网络教程 (CNN) – 使用 TensorFlow 在 Python 中开发图像分类器

在这里,我们考虑了 大小28x28x3像素的图像输入。如果我们将其输入到卷积神经网络,则第一个隐藏层本身将有大约2352 权重

但这种情况并不实用。现在,看看这个:

卷积神经网络教程 (CNN) – 使用 TensorFlow 在 Python 中开发图像分类器

任何通用输入图像的 大小至少为200x200x3像素。第一个隐藏层的大小变成了惊人的 120,000。如果这只是第一个隐藏层,想象一下处理整个复杂图像集所需 的神经元数量。

这会导致过度拟合并且不切实际。因此,我们无法利用完全连接的网络。


什么是卷积神经网络?

卷积神经网络与神经网络一样,由具有可学习 权重偏差的 神经元组成。每个神经元接收多个输入,对它们进行加权求和,将其传递给 激活 函数并以输出响应。

整个网络具有损失 函数,我们为神经网络开发的所有提示和技巧仍然适用于卷积神经网络。

很简单,对吧?

神经网络,顾名思义,是一种模仿大脑结构的 机器学习技术它由称为神经元的学习单元网络组成。

这些神经元学习如何将 输入信号 (例如猫的图片)转换为相应的 输出信号 (例如标签“猫”),形成自动识别的基础。

我们以自动图像识别为例 确定 图片是否包含猫的过程涉及 激活函数。如果图片与神经元之前见过的猫图像相似, “猫” 标签就会被激活。

因此, 神经元接触到的标记图像越,它就越能学会如何识别其他未标记的图像。我们称之为训练神经元的过程  。


卷积神经网络的起源

神经网络的智能是不可思议的。 虽然Rosenblatt早在20 世纪 60 年代就 开始研究人工神经网络 但直到2000 年代末,使用神经网络的深度学习才开始兴起。 关键的推动因素是 计算能力数据集的规模,而谷歌在深度学习方面的开创性研究。2012 年 7 月,谷歌的研究人员将先进的神经网络暴露于从​网络上截取的一系列未标记的静态图像视频。

令他们惊讶的是, 他们发现神经网络自己学习了一个猫检测神经元 ,这支持了 “互联网是由猫组成的” 这一流行说法。

卷积神经网络教程 (CNN) – 使用 TensorFlow 在 Python 中开发图像分类器


卷积神经网络如何工作?

 在卷积神经网络中我们应该理解四个分层 概念: 

  1. 卷积,
  2. 热卢,
  3. 汇集和
  4. 全连接(全连接层)。

让我们首先看一个简单的例子:

CNN 示例:

考虑下图:

卷积神经网络教程 (CNN) – 使用 TensorFlow 在 Python 中开发图像分类器卷积神经网络教程 (CNN) – 使用 TensorFlow 在 Python 中开发图像分类器

这里,有 X 和 O 的多种演绎。这使得计算机很难识别。但目标是,如果输入信号看起来像以前看过的图像, “图像”参考信号将混合到输入信号中,或与输入信号 进行卷积。然后将所得的输出信号传递到下一层。

卷积神经网络教程 (CNN) – 使用 TensorFlow 在 Python 中开发图像分类器

因此,计算机可以理解每个像素。在本例中,白色像素为**-1**,而黑色像素为1。 这正是我们在基本二元分类中实现区分像素的方法。

卷积神经网络教程 (CNN) – 使用 TensorFlow 在 Python 中开发图像分类器

现在, 如果我们通常搜索比较普通图像和另一个“x”再现之间的值,我们会得到很多丢失 的像素。

那么,我们该如何解决这个问题呢?

卷积神经网络教程 (CNN) – 使用 TensorFlow 在 Python 中开发图像分类器

我们采用称为过滤器小块像素并尝试匹配 将它们放在相应的附近位置,看看我们是否得到匹配。 通过这样做,卷积神经网络在发现相似性方面比直接尝试匹配整个图像要好得多


图像的卷积

卷积具有平移不变性的良好特性 。直观上,这意味着每个卷积滤波器代表一个感兴趣的特征(例如 字母中的像素) ,并且卷积神经网络算法学习哪些特征构成最终的参考(即字母表)。

我们有4 个卷积步骤:

  • 将特征和图像对齐
  • 每个图像像素乘以相应的特征像素
  • 将值相加并求出 总和
  • 总和除以特征中的像素总数

卷积神经网络教程 (CNN) – 使用 TensorFlow 在 Python 中开发图像分类器

卷积神经网络教程 (CNN) – 使用 TensorFlow 在 Python 中开发图像分类器

考虑上图 - 正如您所看到的,我们已经完成了前2 个步骤。我们考虑了一张特征图像和其中的一个像素。 我们将其与现有图像 相乘,并将乘积存储在另一个缓冲区特征图像中。

卷积神经网络教程 (CNN) – 使用 TensorFlow 在 Python 中开发图像分类器

通过这张图片, 我们完成了最后2 个步骤。 我们将得出总和的值相加 然后,我们将该数字除以特征图像中的像素总数 完成后,获得的最终值将放置在滤波图像中心,如下所示:

卷积神经网络教程 (CNN) – 使用 TensorFlow 在 Python 中开发图像分类器

 现在,我们可以移动这个 滤镜,并对图像中的任何像素执行相同的操作。 为了更清楚起见, 让我们考虑另一个例子:

卷积神经网络教程 (CNN) – 使用 TensorFlow 在 Python 中开发图像分类器

如您所见,执行前 4 个步骤后,我们的值为 0.55!我们采用该值并将其放置在图像中,如前所述。这是在下图中完成的:

卷积神经网络教程 (CNN) – 使用 TensorFlow 在 Python 中开发图像分类器

类似地,我们将特征移动到图像中的每个其他位置,并查看该特征如何与该区域匹配。因此,完成此操作后,我们将得到输出:

卷积神经网络教程 (CNN) – 使用 TensorFlow 在 Python 中开发图像分类器

这里我们只考虑一种过滤器。类似地,我们将与其他每个过滤器执行相同的卷积以获得该过滤器的卷积。

输出信号强度不取决于特征所在的位置,而仅取决于特征 是否存在 因此,字母表可能位于不同的位置 ,卷积神经网络算法仍然能够识别它。


ReLU层

ReLU 是一种激活函数。但是,什么是激活函数?

整流线性单元(ReLU)变换函数仅在输入高于一定量时才激活节点,而输入低于零时,输出为零,但当输入上升到一定阈值以上时,与输入呈线性关系。因变量。

考虑下面的例子:

卷积神经网络教程 (CNN) – 使用 TensorFlow 在 Python 中开发图像分类器

我们考虑了一个具有上述值的简单函数。因此,只有当该值是由因变量获得时,该函数才会执行操作。对于本示例,获得以下值:

卷积神经网络教程 (CNN) – 使用 TensorFlow 在 Python 中开发图像分类器

为什么这里需要 ReLU?

卷积神经网络教程 (CNN) – 使用 TensorFlow 在 Python 中开发图像分类器

主要目的是消除卷积中的所有负值。所有正值保持不变,但所有负值都更改为零,如下所示:

卷积神经网络教程 (CNN) – 使用 TensorFlow 在 Python 中开发图像分类器

因此,在处理这个特定功能后,我们得到以下输出:

卷积神经网络教程 (CNN) – 使用 TensorFlow 在 Python 中开发图像分类器

现在,类似地,我们也对所有其他特征图像执行相同的过程:

卷积神经网络教程 (CNN) – 使用 TensorFlow 在 Python 中开发图像分类器

来自卷积层的输入可以被 平滑 ,以降低 滤波器噪声和变化的敏感性  这种平滑过程称为 子采样,可以通过对信号样本平均值或取最大值来 实现。


池化层

在这一层中,我们将图像堆栈缩小更小的尺寸。 池化是在经过激活层 之后完成的。我们通过实施以下 4 个步骤来做到这一点:

  • 选择窗口大小(通常为 2 或 3)
  • 选择步幅(通常为 2)
  • 在经过过滤的图像 走过你的窗户
  • 从每个窗口中取最大值

让我们通过一个例子来理解这一点。考虑使用窗口大小为 2 且步长也为 2 来执行池化。

转载自:https://juejin.cn/post/7267734333533028386
评论
请登录