27

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

 4 years ago
source link: http://www.cnblogs.com/jyroy/p/13762902.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

卷积神经网络

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

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

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

典型结构如下图所示:

QVNviaQ.png!mobile

神经网络中的各层

2quyAfi.png!mobile

  • 输入层(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\) 个管道,如下图所示:

eiaQ7jr.png!mobile

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

将计算过程公式化,公式如下:

\[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\) 是偏置项。

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

jeUNjmQ.png!mobile

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

QNzUbaj.png!mobile

权重共享

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

填充

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

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

ZnaMF3M.png!mobile

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

VRZbQj3.png!mobile

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

7Fb6Vja.png!mobile

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

步幅

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

我们可以将步幅改为 2,那么卷积过程就会变成下图所示的:

IjAJFbZ.png!mobile

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

fURR3aM.png!mobile

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

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

3 维数据的卷积运算

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

RZFrIbj.png!mobile

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

mQJ36n.png!mobile

至此,我们的公式可以总结为:

\[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) ,如下图所示,这是一个单层的池化:

Bjayiq.png!mobile

图中所示的步骤是,我们划定一个 \(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 年提出的进行手写数字识别的网络。具有连续的卷积层和池化层(准确的讲是只抽取元素的子采样层),最后经全连接层输出结果。基本结构如下:

auI3Qjq.png!mobile

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

和现在的 CNN 相比,LeNet 有几个 不同点

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

AlexNet

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

YVbaq2N.png!mobile

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

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

AlexNet 虽然在结构上和 LeNet 没有很大的不同,但是也有一些细节上的 差异

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

面试常见问题

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

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

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

  • LeNet-5 结构

  • AlexNet 结构


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK