在过去的几年里,关于介绍卷积神经网络(CNN)的文档有很多,特别是它已经彻底改变了计算机视觉领域。在这篇文章中,我们将以神经网络的基本背景知识为基础,探索CNN是什么,了解它是如何工作的,并从头开始构建一个简单的CNN。

1.目的

CNN的一个典型的用例是执行图像分类任务,例如查看宠物图像,并决定它是猫还是狗。这似乎是个简单的任务–为什么不直接使用正常的神经网络呢?
(1)图像大
目前用于处理计算机视觉问题的图像通常是224 x 224或更大,想象一下,构建一个神经网络来处理224 x 224彩色图像:包括图像中的3个颜色通道(RGB),即224 x 224 x 3 = 150528个输入特征,这样典型的网络中隐藏层可能有1024个节点,所以我们必须训练150528 x 1024 = 154140672,单是第一层就使得普通神经网络无法对其进行训练。
(2)位置可能改变
如果你训练了一个网络模型用来检测图像中的狗,无论狗处于图像中的什么位置,你都希望此模型能够从图像中检测出来。想象一下,如果训练了一个网络模型,而且它可以很好地检测出某只特定的狗,然后再给它提供一个稍微移动位置的相同版本的图像,此时网络会有完全不同的反应。

2.数据集

在本节中,我们将讨论计算机视觉世界里的“hello world!”:MNIST,手写体数字分类问题,它很简单,给定一个图像,把它分类为一个数字。

ResNet和视觉transformer以及swin transformer优缺点对比 视觉cnn_计算机视觉


MNIST数据集中的每个图像均为28x28,我们看到,都是居中的灰度数字。

正常的神经网络其实就可以解决这个问题,首先将每张图像视为28×28=784维向量,将784维送到一个784维的输入层,堆叠几个隐藏层,然后用10个节点的输出层来完成,每个数字1个节点。

但这些数字居中,且图像较小,所以也就没有尺寸大、位置偏移的问题。但是我们知道实际生活中,情况并非如此。

好了,有了一个基本的了解之后,我们就进入了这个卷积神经网络的世界吧。

3.卷积

什么是卷积神经网络?

顾名思义,卷积神经网络就是基本上只是由卷积层组成的神经网络,卷积层是基于卷积的数学运算。

而卷积层是由一组滤波器组成,你可以将其视为二维矩阵的数字。比如,这是一个3×3滤波器。

ResNet和视觉transformer以及swin transformer优缺点对比 视觉cnn_卷积_02


将输入图像与滤波器结合卷积生成图像,这其中包括:

(1)将滤波器叠加在图像的某个位置上。

(2)在滤波器中的值和图像中的相应值之间进行元素乘法。

(3)将所有元素的乘积相加,此和就是输出图像中目标像素的输出值。

(4)对所有位置重复进行。

这4步的描述有点抽象,接下来让我们来做一个例子。我们以一个微小的4×4灰度图像和一个3×3的滤波器为例:

ResNet和视觉transformer以及swin transformer优缺点对比 视觉cnn_池化_03


图像中的数字就是我们日常见到的像素强度,其中0为黑色,255为白色,我们的输出设置成为一个2×2的输出图像。

首先,将我们的滤波器叠加到图像的左上位置:

ResNet和视觉transformer以及swin transformer优缺点对比 视觉cnn_神经网络_04


接着,将两个值(图像值和滤波器值)进行逐元素相乘。得到了如下的表格:

ResNet和视觉transformer以及swin transformer优缺点对比 视觉cnn_计算机视觉_05


得出结果62-33=29。

最后,我们将结果放在输出图像的目标像素中。由于我们的过滤器被覆盖在输入图像的左上角,我们的目标像素是输出图像的左上角:

ResNet和视觉transformer以及swin transformer优缺点对比 视觉cnn_池化_06


以此类推,就可以得到2×2图像的数值:

ResNet和视觉transformer以及swin transformer优缺点对比 视觉cnn_神经网络_07


3.1 卷积有什么用?

我们先把卷积的用途放一下,来看图:

ResNet和视觉transformer以及swin transformer优缺点对比 视觉cnn_池化_08


这不就是刚刚3×3的滤波器吗?其实它还有一个专业的名字——垂直Sobel滤波器,对应的还有一个水平Sobel滤波器,就是中间横着的一行数字为0。

ResNet和视觉transformer以及swin transformer优缺点对比 视觉cnn_池化_09


其实,Sobel滤波器是边缘检测器,垂直Sobel滤波器是检测垂直边缘,而水平Sobel是检测水平边缘。

下图分别为垂直Sobel滤波器和水平Sobel滤波器的应用实例:

ResNet和视觉transformer以及swin transformer优缺点对比 视觉cnn_卷积_10


ResNet和视觉transformer以及swin transformer优缺点对比 视觉cnn_卷积_11


试想,如果两个滤波器都是用了,卷积是不是就能抓住图像的边缘特征了。输出图像中的亮像素说明了原始图像的周围有很强的边缘。这样一来,卷积就可以帮助我们寻找特定的局部图像特征,比如边缘。

3.2 填充

通常来说,我们其实都希望输出图像能够跟原始图像的大小相同。但在上面的示例中,我们是以4×4图像为输入,以2×2图像为输出,那应该怎么解决这个问题呢?

填充。这时候就要谈到0的妙用了,就是要在图像周围添加一圈“0”,而滤波器则也需要填充1个像素。

ResNet和视觉transformer以及swin transformer优缺点对比 视觉cnn_神经网络_12


这样,输出跟输入的图像具有相同的尺寸,叫做相同填充。

3.3 卷积层

卷积层就包含了上述的一组滤波器,卷积层的主要参数就是滤波器的数量。

对于MNIST CNN,如果使用带有8个滤波器的小型卷积层,那么输入为28×28,输出结果就变成了26×26×8 。

ResNet和视觉transformer以及swin transformer优缺点对比 视觉cnn_神经网络_13


提示:输出是26x26x8,而不是28x28x8,因为我们正在使用有效填充,使输入的宽度和高度减少2。

4.池化层

图像中的相邻i像素往往都有相似的值,而经过卷积层也就能在相邻像素中产生了相似的值。这样就会导致卷积层输出的很多信息都是多余的。

就如上述的负责边缘检测的滤波器,它能够在某个位置上找到较强的边缘,但是从很可能在其相邻的一个像素也能找到较强的边缘,这样就造成了两个相同的边缘同时存在。

这样的话,就造成了信息的冗余,不会发现新的信息。

池化就解决了这个问题。池化,就是通过将输入中的值集中在一起,减少输入的大小。

通常,是通过一个简单的操作来完成的,比如取max、min或average。

下面是一个最大池化层的例子,池化大小为2的最大池化层。为了执行最大池化,以2×2块遍历输入图像,并将最大值放入对应像素的输出图像中。

ResNet和视觉transformer以及swin transformer优缺点对比 视觉cnn_神经网络_14


池化将输入的宽度和高度除以池大小。

比如,对于我们的MNIST CNN,我们将在初始转换层之后立即放置一个池大小为2的最大池化层。池化层会将26 x 26 x 8输入转换为13 x 13 x 8输出。

ResNet和视觉transformer以及swin transformer优缺点对比 视觉cnn_卷积_15

5.Softmax

实际上,最终完成CNN,还需要赋予其预测的能力。

那么,将通过使用多类分类问题的标准最终层:Softmax层,这是一个完全连接(密集)的层,它使用Softmax函数作为其激活的全连接(密集)层。

什么是Softmax函数?

给定一些数字,Softmax函数就能将任意数字转化为概率。比如,我们选定数字 -1、0、3和5。首先,我们需要计算e的指定数字次方,然后将其所有结果相加,当作分母。

ResNet和视觉transformer以及swin transformer优缺点对比 视觉cnn_卷积_16


最后,e的指定数字次方的值就作为分子,由此计算可能性。

ResNet和视觉transformer以及swin transformer优缺点对比 视觉cnn_计算机视觉_17


而以MNIST CNN为例,将使用带有10个节点的softmax层作为CNN的最后一层,每个数字代表一个数字。层中的每个节点将连接到每个输入。

ResNet和视觉transformer以及swin transformer优缺点对比 视觉cnn_池化_18


应用softmax变换后,由节点表示的概率最高的数字将是CNN的输出了。

好了,介绍了这么多。是不是能够很好的理解卷积神经网络了呢?