深度学习三:卷积神经网络

卷积神经网络

卷积神经网络(Convolutional Neural Network,CNN)又叫卷积网络(Convolutional Network),是一种专门用来处理具备相似网格结构的数据的神经网络。卷积神经网络一词中的卷积是一种特殊的线性运算。卷积网络是指那些至少在网络的一层中使用卷积运算来代替通常的矩阵乘法的神经网络。面试

卷积神经网络的出现,极大的缓解了全链接神经网络中存在的一个典型的问题:数据的波形被忽视了!众所周知,全链接神经网络在进行数据输入的时候,须要将一个二维或者三维的数据展平为一维的数据。而咱们知道在计算机中图形是一个三维的数据,由于须要存储一些相似 RGB 各个通道之间关联性的空间信息,因此三维形状中可能隐藏有值得提取的本质模式。而全链接展平会致使形状的忽视。所以须要利用卷积神经网络来保持形状的不变。数组

典型应用场景:图像识别、语音识别等。网络

典型结构以下图所示:app

神经网络中的各层

  • 输入层(Input Layer):主要是对原始的图像数据进行预处理
  • 卷积层(Convolution Layers):从前一层提取移位不变特征。即当输入数据是图像的时候,卷积层会以3维数据的形式接收输入数据,并一样以3维数据的形式输出至下一层。所以,在CNN中,能够(有可能)正确理解图像等具备形状的数据。注:卷积层的输入和输出数据一般又被称为特征图(Feature Map)。卷积层的输入数据称为输入特征图(Input Feature Map),输出数据称为输出特征图(Output Feature Map)。
  • 池化层(Pooling Layers):将前一层的多个单元的激活组合为一个单元。池化是缩小高、长方向上的空间的运算,一般减少一半。
  • 全链接层(Fully Connected Layers):收集空间扩散信息
  • 输出层(Output Layer):选择类

卷积操做

卷积运算至关于图像处理中的“滤波器运算”。卷积运算会对输入数据应用滤波器(Filter)函数

假设,一个初始的图像大小为 \(J*K\), 同时有 \(L\) 个管道,以下图所示:学习

咱们应用一个 \(M*N\) 大小的滤波器。图中绿色的格子就是一个 3*3 的滤波器。卷积运算的整个操做为:将各个位置上滤波器的元素和输入的对应元素相乘,而后再求和(整个操做也被称为乘积累加运算),而后,将这个结果保存到输出的对应位置。spa

将计算过程公式化,公式以下:3d

\[Z_{j,k} = b + \sum_{m=0}^{M-1}\sum_{n=0}^{N-1}K_{m,n}V_{j+m,k+n} \]

其中 \(K_{m,n}\) 表示滤波器的 \(m,n\) 位置的数据,\(V_{j+m,k+n}\) 表示图像的 \(j+m,k+n\) 位置的数据,\(b\) 是偏置项。orm

将计算过程图像化,以下图所示:blog

其中,滤波器的参数就是权重(Weights),同时还有有个偏置项(Bias),这个偏置项会被加到滤波器最后的输出上。

权重共享

咱们能够根据上图看到,对一层中的每个 \(M×N\) 块输入应用相同的权值,计算卷积层中的下一个隐藏单元,这就是个权重共享(Weight Sharing)的概念。

填充

填充(Padding):在进行卷积操做以前,有时候要向周围填入固定的数据,好比用数值 0 进行填充,也叫零填充(Zero Padding)

应用填充以后,卷积层的输出大小将会和卷积以前的层同样,如图所示,其中粉色的 6 * 7 的格子是原始的图像尺寸,咱们在周围加上一圈数值为 0 的格子,用白色表示:

以步幅 1 进行卷积,以下图所示:

最终咱们获得了一个大小为 6 * 7 的蓝色的卷积层,和原始图像的尺寸相同,以下图所示:

这主要也是为了不卷积过程当中过一个典型的问题:若是每次惊醒卷积运算都会缩小空间,那么在某个时刻输出大小就有可能变成 1,致使没法再应用卷积运算。为了不这个状况的出现,就须要使用填充。

步幅

步幅(Stribe):应用滤波器间隔的位置称为步幅。在上面的例子中,采用的步幅为 1。

咱们能够将步幅改成 2,那么卷积过程就会变成下图所示的:

能够看到应用滤波器的窗口的间隔变成了 2 个元素,以下图所示:

最终,新的一层的尺寸变为一个 3 * 4 的层。用公式表示为(设步长为\(s\)):

\[(1+\frac{(J-M)}{s}), (1+\frac{(K-N)}{s}) \]

3 维数据的卷积运算

在一开始,虽然咱们假设了一个初始的图像大小为 \(J*K\), 同时有 \(L\) 个管道。可是咱们讨论的卷积操做一直只在单层上进行的,下面咱们就讨论一下在 3 维状况下的卷积运算。

当在通道方向上有多个特征图的时候,会按照通道进行输入数据滤波器的卷积运算,并将结果相加,从而获得输出。计算步骤以下图所示:

至此,咱们的公式能够总结为:

\[Z^i_{j,k} = b^i + \sum_l\sum_{m=0}^{M-1}\sum_{n=0}^{N-1}K^i_{m,n}V^l_{j+m,k+n} \]

其中 \(K^i_{m,n}\) 表示第 \(i\) 个滤波器的 \(m,n\) 位置的数据,\(V^l_{j+m,k+n}\) 表示图像第 \(l\) 层通道的 \(j+m,k+n\) 位置的数据,\(b^i\) 是第 \(i\) 个偏置项。根据以前的权重共享的概念,咱们能够知道,每一层通道是共用一个滤波器的相同权重的,一样也共用相同的偏置。

池化

池化(Pooling)是缩小高、长方向上的空间的运算。

最典型的池化过程叫作最大池化(Max Pooling),以下图所示,这是一个单层的池化:

图中所示的步骤是,咱们划定一个 \(2 * 2\) 的窗口,找出这个窗口中最大的那个值,做为下一层的数据,这个窗口以步幅 2 进行移动。通常来讲,池化的窗口大小会和步幅设定成相同的值。

除了 Max Pooling 以外,还有 Average Pooling/Mean Pooling,即平均池化,是计算目标区域的平均值。在图像识别领域中,主要使用 Max Pooling。

重叠池化

重叠池化(Overlapping Pooling)是 AlexNet 中的一个概念。Overlapping Pooling 的概念和 No-Overlapping Pooling的概念相对。

  • Overlapping Pooling:当步幅大于窗口宽度,会使池化窗口产生重叠区域。能够提高预测精度、缓解过拟合。
  • No-Overlapping Pooling:步幅和窗口宽度相同,池化窗口没有重叠区域。如上图的展现。又叫通常池化,General Pooling

池化层的特征

  • 没有要学习的参数:池化层和卷积层不一样,没有要学习的参数。池化层只是从目标区域中取最大值或平均值。
  • 通道数不发生变化:通过池化运算,输入数据和输出数据的通道数不会发生变化。即计算是按照通道独立进行的。
  • 对微小的位置变化具备鲁棒性(健壮):输入数据发生微小误差时,池化仍会返回相同的结果。

典型的CNN

LeNet

LeNet 是在 1998 年提出的进行手写数字识别的网络。具备连续的卷积层和池化层(准确的讲是只抽取元素的子采样层),最后经全链接层输出结果。基本结构以下:

  • C1:第一个卷积层的 5×5 的窗口从原始的 32×32 的图像中提取出 28×28 的特征数组。
  • S2:而后再进行子抽样,将其大小减半为14×14。
  • C3:第二个卷积层使用另外一个 5×5 的窗口提取一个 10×10 的特征数组。
  • S4:第二个子采样层将其简化为 5×5。
  • C五、F6:这些激活而后经过两个全链接层进入对应数字 ‘0’ 到 ‘9’ 的10个输出单元。

和如今的 CNN 相比,LeNet 有几个不一样点

  • 激活函数:LeNet中使用 Sigmoid 函数,而如今的 CNN 中主要使用 ReLU 函数。
  • 池化/子采样:LeNet 中使用子采样缩小中间数据的大小,而如今的 CNN 中 Max Pooling 是主流。

AlexNet

AlexNet 是一个引起深度学习热潮的导火索。基本结构以下:

AlexNet 叠有多个卷积层和池化层,最后经由全链接层输出:

  • 5 个卷积层和 3 个全链接层
  • 利用重叠步幅的最大池化层
  • 1000 个类的 Softmax
  • 两个只在特定层进行交互的 GPU。上图中就是利用了两个 GPU,在第二个 Max Pooling 层进行交互,一直到最后进行输出两个 GPU 一直是在并行运算。

AlexNet 虽然在结构上和 LeNet 没有很大的不一样,可是也有一些细节上的差别

  • AlexNet 的激活函数使用的是 ReLU
  • 使用进行局部正规化的 LRN(Local Response Normalization)层
  • 使用 Dropout

面试常见问题

  • 神经网络中的权重共享是什么?

  • \(1 * 1\) 卷积的做用

  • 卷积层和池化层有什么区别

  • LeNet-5 结构

  • AlexNet 结构