这次我们换个姿势介绍卷积神经网络,用TensorFlow构建CNN

点击上方关注,All in AI中国

了解用于计算机视觉的卷积神经网络的基础,并使用TensorFlow构建CNN

这次我们换个姿势介绍卷积神经网络,用TensorFlow构建CNN

深度学习的最新进展使得计算机视觉应用实现飞跃:从我们的面部解锁手机到更安全的自动驾驶汽车等等。

卷积神经网络(CNN)是计算机视觉应用背后的架构。在这篇文章中,您将了解CNN和计算机视觉的基础,例如卷积运算、填充、跨步卷积和池化层。然后,我们将使用TensorFlow构建用于图像识别的CNN。

这次我们换个姿势介绍卷积神经网络,用TensorFlow构建CNN

理解卷积

卷积运算是卷积神经网络的构建块,顾名思义。

现在,在计算机视觉领域,图像可以表示为RGB值的矩阵。这个概念实际上是在之前的文章中介绍的。

要完成卷积操作,我们需要一个图像和一个过滤器。

因此,让我们将下面的6x6矩阵视为图像的一部分:

这次我们换个姿势介绍卷积神经网络,用TensorFlow构建CNN

6x6矩阵

过滤器将是以下矩阵:

这次我们换个姿势介绍卷积神经网络,用TensorFlow构建CNN

3x3过滤器

然后,卷积涉及将滤波器叠加到图像矩阵上,添加来自滤波器的值的乘积和来自图像矩阵的值,其将生成4×4的卷积层。

这很难用文字表达,但这里有一个动画可以很好的解释卷积:

这次我们换个姿势介绍卷积神经网络,用TensorFlow构建CNN

卷积操作

在上面的图像矩阵上执行此操作并使用上面定义的过滤器,您可以获得以下结果矩阵:

这次我们换个姿势介绍卷积神经网络,用TensorFlow构建CNN

4x4输出层

你如何解释输出层?

好吧,考虑到每个值都表示颜色,或者像素有多暗(正值表示光,负值表示暗),那么您可以将输出层解释为:

这次我们换个姿势介绍卷积神经网络,用TensorFlow构建CNN

输出层解释

因此,似乎这个特定的滤镜负责检测图像中的垂直边缘!

你如何选择合适的过滤器?

这是一个很自然的问题,因为您可能会发现可以应用于图像的无限数量的过滤器。

事实证明,滤波器矩阵中的精确值可以是基于模型目标的可训练参数。因此,您可以选择适用于特定应用程序的过滤器,也可以使用反向传播来确定过滤器的最佳值,从而产生最佳结果。

在计算机视觉中填充

以前,我们已经看到一个3x3滤波器与6x6图像进行卷积,将产生4x4矩阵。这是因为滤波器有4x4个可能的位置以适合6x6图像。

因此,在每个卷积步骤之后,图像缩小,这意味着只能执行有限数量的卷积,直到图像不再缩小为止。此外,位于图像角落的像素仅使用一次,这会导致神经网络的信息丢失。

为了解决上述两个问题,使用padding。padding包括在输入图像周围添加边框,如下所示:

这次我们换个姿势介绍卷积神经网络,用TensorFlow构建CNN

padding为1的输入图像

如您所见,添加的边框通常用零填充。现在,图像的角点像素将被多次使用来计算输出,从而有效地防止信息丢失。此外,它允许我们在输出中保持输入矩阵形状。

考虑到我们的6x6输入图像,如果我们添加1的padding,我们得到一个8x8矩阵。应用3x3滤波器,这将产生6x6输出。

一个简单的等式可以帮助我们找出输出的形状:

这次我们换个姿势介绍卷积神经网络,用TensorFlow构建CNN

其中n是输入形状,p是padding大小,f是滤波器形状

重申一下,我们有:

  • 6x6输入
  • padding1
  • 3x3过滤器

因此,输出形状将是:6 + 2(1)-3 + 1 = 6.因此,输出将是6x6矩阵,就像输入图像一样!

填充并不总是必需的。但是,使用填充时,通常输出的大小与输入图像的大小相同,这会产生两种类型的卷积。

当没有应用填充时,这称为“有效卷积”。否则,它被称为“相同的卷积”。要确定保持输入图像尺寸所需的填充大小,只需将上面的公式等同于n即可。解决p后,你应该得到:

这次我们换个姿势介绍卷积神经网络,用TensorFlow构建CNN

您可能已经注意到f应该是奇数,以便填充为整数。因此,计算机视觉领域的惯例是奇数滤波器。

跨步卷积

以前,我们已经看到了一个步幅为1的卷积。这意味着滤波器水平和垂直移动了1个像素。

一个跨步卷积是当步幅大于1。在下面的动画中,步幅为2:

这次我们换个姿势介绍卷积神经网络,用TensorFlow构建CNN

步长为2的卷积

现在,考虑到步幅,计算输出矩阵形状的公式为:

这次我们换个姿势介绍卷积神经网络,用TensorFlow构建CNN

作为惯例,如果上面的公式不产生整数,那么我们就四舍五入到最近的整数

汇聚层

汇聚层是减少图像解释大小以增加计算速度的另一种方法,它使检测到的特征更加鲁棒。

最好用图像解释池化。以下是最大池的示例:

这次我们换个姿势介绍卷积神经网络,用TensorFlow构建CNN

使用2x2过滤器进行最大池化

如您所见,我们选择了一个步长为2的2x2滤波器。这相当于将输入分成4个相同的方块,然后我们取每个方块的最大值,并在输出中使用它。

也可以执行平均池化,但它不如最大池化。

您可以将池化视为防止过度拟合的一种方法,因为我们正在从输入图像中删除某些功能。

为什么要使用卷积神经网络?

我们现在对卷积神经网络有很强的基础知识。但是,为什么深度学习从业者会使用它们呢?

与完全连接的层不同,卷积层具有要学习的小得多的参数集。这是因为:

  • 参数共享
  • 稀疏连接

参数共享指的是一个特征检测器,例如垂直边缘检测器,将在图像的许多部分中有用。然后,连接的稀疏性指的是只有少数特征与某个输出值相关的事实。

考虑到上面的最大池化示例,输出的左上角值仅取决于输入图像的左上角2x2平方。

因此,我们可以训练较小的数据集并大大减少要学习的参数数量,使CNN成为计算机视觉任务的一个很好的工具。

使用TensorFlow构建CNN

足够理论,让我们编码CNN进行手势识别。我们重新审视之前的项目,看看CNN是否会表现更好。

与往常一样,这里有完整的内容。

第1步:预处理图像

导入所需的库和资产后,我们加载数据并对图像进行预处理:

这次我们换个姿势介绍卷积神经网络,用TensorFlow构建CNN

第2步:创建占位符

然后,我们为功能和目标创建占位符:

这次我们换个姿势介绍卷积神经网络,用TensorFlow构建CNN

第3步:初始化参数

然后我们使用Xavier初始化初始化我们的参数:

这次我们换个姿势介绍卷积神经网络,用TensorFlow构建CNN

第4步:定义前向传播

现在,我们定义前向传播步骤,这实际上是我们CNN的架构。我们将使用具有2个卷积层和最终完全连接层的简单3层网络:

这次我们换个姿势介绍卷积神经网络,用TensorFlow构建CNN

第5步:计算成本

最后,我们定义一个计算成本的函数:

这次我们换个姿势介绍卷积神经网络,用TensorFlow构建CNN

第6步:将所有功能组合到一个模型中化

现在,我们将上述所有功能合并到一个CNN网络中。我们将使用小批量梯度下降进行训练:

这次我们换个姿势介绍卷积神经网络,用TensorFlow构建CNN

现在,我们可以运行我们的模型并查看它的执行情况:

这次我们换个姿势介绍卷积神经网络,用TensorFlow构建CNN

就我而言,我只使用CPU在笔记本电脑上训练了CNN,结果非常糟糕。如果你在具有更好CPU和GPU的桌面上训练CNN,你肯定会得到比我更好的结果。

恭喜!您现在对CNN和计算机视觉领域有很好的了解。虽然还有很多东西需要学习,但更高级的技术使用这里介绍的概念作为构建块。

这次我们换个姿势介绍卷积神经网络,用TensorFlow构建CNN

编译出品

相关推荐