这系列博客大概是想速成关于CNN方面的内容,于是基本还是以罗列为主。

首先介绍一下经典的神经网络LeNet-5,接着简单地列了一下CNN的基本结构,之后还打算详细地写一下它们的细节。

LetNet-5

卷积神经网络(Convolutional Neural Network, CNN)是一种前馈神经网络

这其中最经典的一种就是LeNet-5

LeNet在论文中是用于手写数字识别,里面的结构大概如下:

  • Input: 0-9数字的$ 32\times32 $手写数字图片。

  • C1: 卷积层1。选择了六个$5\times5$卷积核。使每张图片生成总共 $6\times(32-5+1)\times(32-5+1) = 6 \times 28 \times 28$ 个像素点的新图片。

  • S2: 池化层2。在上一层的基础上进行池化,每$(2,2)$个元素取一个元素,使得对于最初的每张图片生成总计 $ 6 \times 14 \times 14 $ 个像素点的新图片。
  • C3: 卷积层3。再上一层基础上进行两次卷积,得到对于最初的每张图片生成 $16$ 张 $10 \times 10$ 的新图片。
  • S4: 池化层4。再次池化。每$(2,2)$个元素取一个元素,使得对于最初的每张图片生成总计 $ 16 \times 5 \times 5 $ 个像素点的新图片。
  • C5: 卷积层5。使用与C1同样的卷积核,卷积后形成的图的大小为1x1。这里形成120个卷积结果。
  • F6: 全连接层6。
  • Output: 也可以视作一个全连接层。输出0-9。

使用LetNet的目的并不只是因为它很重要,而是借此说明CNN的基本组件,并希望依次地做个介绍。

另外值得一提的是,在这个神经网络中各个图像大小参数是否有很特别的意义,这是没法说明的。这也是令人诟病的地方。

卷积层

卷积的目的就是为了进行特征提取。基于这种目的有人把它叫做滤波器。

卷积核

卷积核是一种特定大小矩阵,它的作用是提取出图像更高维的特征,一个卷积核代表一种特征提取方式。

通过设计不同的卷积核能从图片中获得不同的特征,然后我们在神经网络中对这样的卷积核进行训练以便获得更能体现图片的特征。

所以我们最初需要给定一个特定大小(在LeNet-5种为$5\times5$)的矩阵,然后由反向传播算法改进这个矩阵内的值。

卷积参数

卷积需要的参数:

  • 步长(stride)
  • 边界(padding)

步长指上面说得卷积核每次在图像上移动的像素数。我们也可以使矩阵每次移动多步。但是这样我们生成的图像就会变小。

边界指在进行卷积时在边界上补出一圈0的点以保证图片的大小不发生变化。

设卷积核的某一边的长度为 $f$,padding为$p$, stride为$s$。原始的长度为$n$,经过卷积之后的矩阵长度为$n’$。那么:

LeNet中步长是1,边界是0,也就是最经典的一种卷积方式了。

池化层

也称下采样层。其实也就是以一定规则从一定大小中提取出某一个像素。用于减小尺寸,提高运算速度的,同时也可以减少噪声。

常用的有平均池化与最大池化。

  • 平均池化是计算图像区域的平均值作为该区域池化后的值。就这种说法来说,平均池化也可以理解为一个各处值相等的卷积核所作的卷积。
  • 最大池化是计算图像区域的最大值作为该区域池化后的值。

与池化相关的参数包括 步长s过滤器大小f。设原始矩阵一侧的长度为$n$,经过池化之后的矩阵长度为$n’$。

除了上面所述的池化外,也有池化的其它方式,如: Stochastic-pooling, Overlapping Pooling, Spatial Pyramid Pooling

全连接层

全连接层指的是在该层所有的节点都与上一层的每个节点相连。

全连接层其实可以视作是一个特殊的卷积层,因为这就是使用$1\times1$矩阵作为卷积核所能提取的特征值。

设上一层节点i的值为$x_i$,本层节点的值为$a_i$,连接上一层节点i和该层节点j的边权重为$w_{ij}$,在转到该层之后偏移$b_i$。基于这些符号,可以列出这样的式子。