这次我们换个姿势介绍卷积神经网络,用TensorFlow构建CNN
了解用于计算机视觉的卷积神经网络的基础,并使用TensorFlow构建CNN
深度学习的最新进展使得计算机视觉应用实现飞跃:从我们的面部解锁手机到更安全的自动驾驶汽车等等。
卷积神经网络(CNN)是计算机视觉应用背后的架构。在这篇文章中,您将了解CNN和计算机视觉的基础,例如卷积运算、填充、跨步卷积和池化层。然后,我们将使用TensorFlow构建用于图像识别的CNN。
理解卷积
卷积运算是卷积神经网络的构建块,顾名思义。
现在,在计算机视觉领域,图像可以表示为RGB值的矩阵。这个概念实际上是在之前的文章中介绍的。
要完成卷积操作,我们需要一个图像和一个过滤器。
因此,让我们将下面的6x6矩阵视为图像的一部分:
6x6矩阵
过滤器将是以下矩阵:
3x3过滤器
然后,卷积涉及将滤波器叠加到图像矩阵上,添加来自滤波器的值的乘积和来自图像矩阵的值,其将生成4×4的卷积层。
这很难用文字表达,但这里有一个动画可以很好的解释卷积:
卷积操作
在上面的图像矩阵上执行此操作并使用上面定义的过滤器,您可以获得以下结果矩阵:
4x4输出层
你如何解释输出层?
好吧,考虑到每个值都表示颜色,或者像素有多暗(正值表示光,负值表示暗),那么您可以将输出层解释为:
输出层解释
因此,似乎这个特定的滤镜负责检测图像中的垂直边缘!
你如何选择合适的过滤器?
这是一个很自然的问题,因为您可能会发现可以应用于图像的无限数量的过滤器。
事实证明,滤波器矩阵中的精确值可以是基于模型目标的可训练参数。因此,您可以选择适用于特定应用程序的过滤器,也可以使用反向传播来确定过滤器的最佳值,从而产生最佳结果。
在计算机视觉中填充
以前,我们已经看到一个3x3滤波器与6x6图像进行卷积,将产生4x4矩阵。这是因为滤波器有4x4个可能的位置以适合6x6图像。
因此,在每个卷积步骤之后,图像缩小,这意味着只能执行有限数量的卷积,直到图像不再缩小为止。此外,位于图像角落的像素仅使用一次,这会导致神经网络的信息丢失。
为了解决上述两个问题,使用padding。padding包括在输入图像周围添加边框,如下所示:
padding为1的输入图像
如您所见,添加的边框通常用零填充。现在,图像的角点像素将被多次使用来计算输出,从而有效地防止信息丢失。此外,它允许我们在输出中保持输入矩阵形状。
考虑到我们的6x6输入图像,如果我们添加1的padding,我们得到一个8x8矩阵。应用3x3滤波器,这将产生6x6输出。
一个简单的等式可以帮助我们找出输出的形状:
其中n是输入形状,p是padding大小,f是滤波器形状
重申一下,我们有:
- 6x6输入
- padding1
- 3x3过滤器
因此,输出形状将是:6 + 2(1)-3 + 1 = 6.因此,输出将是6x6矩阵,就像输入图像一样!
填充并不总是必需的。但是,使用填充时,通常输出的大小与输入图像的大小相同,这会产生两种类型的卷积。
当没有应用填充时,这称为“有效卷积”。否则,它被称为“相同的卷积”。要确定保持输入图像尺寸所需的填充大小,只需将上面的公式等同于n即可。解决p后,你应该得到:
您可能已经注意到f应该是奇数,以便填充为整数。因此,计算机视觉领域的惯例是奇数滤波器。
跨步卷积
以前,我们已经看到了一个步幅为1的卷积。这意味着滤波器水平和垂直移动了1个像素。
一个跨步卷积是当步幅大于1。在下面的动画中,步幅为2:
步长为2的卷积
现在,考虑到步幅,计算输出矩阵形状的公式为:
作为惯例,如果上面的公式不产生整数,那么我们就四舍五入到最近的整数
汇聚层
汇聚层是减少图像解释大小以增加计算速度的另一种方法,它使检测到的特征更加鲁棒。
最好用图像解释池化。以下是最大池的示例:
使用2x2过滤器进行最大池化
如您所见,我们选择了一个步长为2的2x2滤波器。这相当于将输入分成4个相同的方块,然后我们取每个方块的最大值,并在输出中使用它。
也可以执行平均池化,但它不如最大池化。
您可以将池化视为防止过度拟合的一种方法,因为我们正在从输入图像中删除某些功能。
为什么要使用卷积神经网络?
我们现在对卷积神经网络有很强的基础知识。但是,为什么深度学习从业者会使用它们呢?
与完全连接的层不同,卷积层具有要学习的小得多的参数集。这是因为:
- 参数共享
- 稀疏连接
参数共享指的是一个特征检测器,例如垂直边缘检测器,将在图像的许多部分中有用。然后,连接的稀疏性指的是只有少数特征与某个输出值相关的事实。
考虑到上面的最大池化示例,输出的左上角值仅取决于输入图像的左上角2x2平方。
因此,我们可以训练较小的数据集并大大减少要学习的参数数量,使CNN成为计算机视觉任务的一个很好的工具。
使用TensorFlow构建CNN
足够理论,让我们编码CNN进行手势识别。我们重新审视之前的项目,看看CNN是否会表现更好。
与往常一样,这里有完整的内容。
第1步:预处理图像
导入所需的库和资产后,我们加载数据并对图像进行预处理:
第2步:创建占位符
然后,我们为功能和目标创建占位符:
第3步:初始化参数
然后我们使用Xavier初始化初始化我们的参数:
第4步:定义前向传播
现在,我们定义前向传播步骤,这实际上是我们CNN的架构。我们将使用具有2个卷积层和最终完全连接层的简单3层网络:
第5步:计算成本
最后,我们定义一个计算成本的函数:
第6步:将所有功能组合到一个模型中化
现在,我们将上述所有功能合并到一个CNN网络中。我们将使用小批量梯度下降进行训练:
现在,我们可以运行我们的模型并查看它的执行情况:
就我而言,我只使用CPU在笔记本电脑上训练了CNN,结果非常糟糕。如果你在具有更好CPU和GPU的桌面上训练CNN,你肯定会得到比我更好的结果。
恭喜!您现在对CNN和计算机视觉领域有很好的了解。虽然还有很多东西需要学习,但更高级的技术使用这里介绍的概念作为构建块。
编译出品