深度学习入门(一):LeNet-5教程与详解

1.什么是LeNet

LeNet5诞生于1994年,是最早的卷积神经网络之一,并且推动了深度学习领域的发展。自从1988年开始,在多年的研究和许多次成功的迭代后,这项由Yann LeCun完成的开拓性成果被命名为LeNet5。
LeNet:

  • 主要用来进行手写字符的识别与分类
  • 确立了CNN的结构,现在神经网络中的许多内容在LeNet的网络结构中都能看到

虽然LeNet网络结构比较简单,但是刚好适合神经网络的入门学习。

2.分析

2.1.LeNet结构

深度学习入门(一):LeNet-5教程与详解_第1张图片
如图所示,LeNet共分为7层,分别是:

  • C1,卷积层
  • S2,池化层
  • C3,卷积层
  • S4,池化层
  • C5,卷积层
  • F6,全连接层
  • OUTPUT,全连接层

接下来我们将对各层进行详细的分析。

2.2.输入层INPUT

一般来说不将输入层视为网络层次结构之一,上面讲的"7层"也不包括输入层

输入层为尺寸32 × 32的图片。由于MNIST数据集中的图片也是32 × 32的,因此不用进行额外的尺寸调整操作。

2.3.卷积层C1

2.3.1.什么是卷积

卷积的本质就是输入图片卷积核做点积(数量积)。
举一个例子,假设我们有一副5 × 5的输入图片、3 × 3的卷积核分别如下:

# 图片        #卷积核
1 1 1 0 0     1 0 1
0 1 1 1 0     0 1 0
0 0 1 1 1     1 0 1
0 0 1 1 0
0 1 1 0 0

那么卷积的过程就如下面的动画所示:卷积核顺序扫描输入图片,并作点积。
深度学习入门(一):LeNet-5教程与详解_第2张图片
例如,左上角"4"的计算过程为:

1*1 + 1*0 + 1*1 + 0*0 + 1*1 + 1*0 + 0*1 + 0*0 + 1*1 = 4

深度学习入门(一):LeNet-5教程与详解_第3张图片
一般来说,通过卷积操作输出的新图像(在这里为一张3 × 3的图像)我们称之为特征图(featuremap)
卷积的意义在于,利用不同的卷积核扫描图像,可以提取图像不同的特征。例如,用以下卷积核便可以提取出水平方向的边缘(思考:为什么?)

-1 -1 -1
 2  2  2
-1 -1 -1
2.3.2.卷积层C1参数分析
  • 输入:32 × 32的图像
  • 卷积核种类: 6
    因此卷积层C1理论上能提取出输入图像6种不同的特征
  • 卷积核大小:5 × 5
  • 输出特征图数量: 6
    每个卷积核分别与输入图像进行卷积运算,共得到6份输出
  • 输出特征图大小:28 × 28
    从上一节举的例子中可以分析出,在没有进行 填充(padding) 的情况下,输出特征图的边长为:
    输入图像 - 卷积核 + 1
    即32 - 5 + 1 = 28
  • 神经元数量:28 × 28 × 6
    在神经网络的学习中,我们可以知道神经元其实就是一个"数"。而卷积层C1是由6张特征图组成的,每张特征图中包含28 × 28个像素,一个像素其实就是一个0 ~ 255之间的数(表示灰度值),对应着一个神经元。因此共有28 × 28 × 6 = 4704个神经元。
  • 可训练参数:(5 × 5 + 1) × 6
    首先,每个卷积核是一个5 × 5的矩阵,矩阵里的每个数都是要通过训练得到的;此外,在实际卷积运算后还要加上一个偏置(bias),因此每个卷积核需要训练5 × 5 + 1个参数,六个卷积核共需要训练(5 × 5 + 1) × 6 = 156个参数。
  • 连接数:28 × 28 × (5 × 5 + 1) × 6
    卷积层的每个特征图的各像素都与其对应的卷积核的各参数间有连接。一共有6个这样的特征图——卷积核对,每个"特征图——卷积核"对包含28 × 28 × (5 × 5 + 1) × 6个连接,因此共有28 × 28 × (5 × 5 + 1) × 6 = 122304个连接。
    需要注意的是,由于权值共享机制的存在,我们只需要训练156个参数。

2.4.池化层S2

2.4.1.什么是池化

在这里,池化(pooling)是进行下采样(downsampling)操作,即对图像进行压缩。
以最大池化为例:
深度学习入门(一):LeNet-5教程与详解_第4张图片
采用2 × 2的滤波器(filter),最大池化的结果如上,即对每个2 × 2的区域取最大值。最小池化、平均池化同理,分别是取相应区域的最小值,平均值。
一般来说,池化:

  • 往往在卷积层后面
  • 可以降低卷积层输出的特征向量,改善过拟合的现象
2.4.2.池化层S2参数分析
  • 输入:28 × 28的特征图(6张)
  • 采样区域: 2 × 2
    在这里,采样方式为4个输入相加,乘以一个可训练参数,再加上一个可训练偏置,并将结果通过sigmoid函数。
  • 输出特征图大小:14 × 14
  • 输出特征图数量:6
  • 神经元数量:14 × 14 × 6
    计算方法同上一节,每张特征图有14 × 14个像素,共6张,因此有14 × 14 × 6 = 1176个神经元。
  • 可训练参数:2 × 6
    对于每张特征图,只有两个参数需要确定:用于相乘的"可训练参数"与"可训练偏置",共6张特征图,因此要训练6 × 2 = 12个参数。
  • 连接数:14 × 14 × 6 × (2 × 2 + 1)
    池化层的每个特征图的各像素都与2×2采样区域以及1个偏置有连接。因此共有14 × 14 × 6 × (2 × 2 + 1) = 5880个连接。

2.5.卷积层C3

  • 输入:14 × 14的特征图(6张)
  • 卷积核种类: 16
    因此卷积层C3能够提取出更多细微的特征
  • 卷积核大小:5 × 5
  • 输出特征图数量: 16
    在卷积层C1中,卷积核有6种,而输入图像只有1张,因此只需要将6个卷积核分别对1张图像进行卷积操作,最后得到6张特征图。那么输入6张图像的话应该怎么处理呢?
    在这里,采用的方法是"每个卷积核对多张特征图"进行处理,例如,编号为0的卷积核处理编号为0、1、2的特征图,编号为15的卷积核处理编号为0、1、2、3、4、5的特征图…具体的对应规则如下:
    深度学习入门(一):LeNet-5教程与详解_第5张图片
    横轴为编号0 ~ 15的16个卷积核,纵轴为编号为0 ~ 5的6张输入特征图。一种方便的记忆方法是前6个卷积核处理三张连续的特征图(对应第一个红框),之后6个卷积核处理四张连续的特征图(对应第二个红框),之后3个卷积核处理四张两两连续的特征图(对应第三个红框),最后1个卷积核处理全部六张特征图(对应最后一个红框)。
  • 输出特征图大小:10 × 10
    输出特征图的边长为14 - 5 + 1 = 10
  • 可训练参数:1516
    以第一个红框为例。首先,每个卷积核包含5 × 5个可训练的参数;而在这里每个卷积核需要与3张特征图相连,最后还要加上1个偏置,因此需要训练3 × 5 × 5 + 1个参数。第一个红框内有6个这样的卷积核,因此共需要训练6 × (3 × 5 × 5 + 1)个参数。
    同理,对于第二个红框,其共需要训练6 × (4 × 5 × 5 + 1)个参数;对于第三个红框,其共需要训练3 × (4 × 5 × 5 + 1)个参数;对于第四个红框,其共需要训练1 × (6 × 5 × 5 + 1)个参数。
    总计可训练6 × (3 × 5 × 5 + 1) + 6 × (4 × 5 × 5 + 1) + 3 × (4 × 5 × 5 + 1) + 1 × (6 × 5 × 5 + 1) = 1516个参数。
  • 连接数:10 × 10 × 1516
    卷积层的每个特征图的各像素都与其对应的卷积核的各参数间有连接。因此共有10 × 10 × 1516 = 151600个连接。

卷积层C3采用这种卷积核-特征图组合方式的好处有:

  • 减少参数
  • 有利于提取多种组合特征(因为组合方式并不对称)

2.6.池化层S4

  • 输入:10 × 10的特征图(16张)
  • 采样区域: 2 × 2
    在这里,采样方式为4个输入相加,乘以一个可训练参数,再加上一个可训练偏置,并将结果通过sigmoid函数。
  • 输出特征图大小:5 × 5
  • 输出特征图数量:16
  • 神经元数量:5 × 5 × 16
    每张特征图有5 × 5个像素,共16张,因此有5× 5 × 16 = 400个神经元。
  • 可训练参数:2 × 16
    对于每张特征图,只有两个参数需要确定:用于相乘的"可训练参数"与"可训练偏置",共16张特征图,因此要训练16 × 2 = 32个参数。
  • 连接数:5 × 5 × 16 × (2 × 2 + 1)
    池化层的每个特征图的各像素都与2×2采样区域以及1个偏置有连接。因此共有5 × 5 × 16 × (2 × 2 + 1) = 2000个连接。

2.6.卷积层C5

  • 输入:5 × 5的特征图(16张)

  • 卷积核种类: 120

  • 卷积核大小:5 × 5

  • 输出:120维向量

  • 算法:
    每个卷积核与16张特征图做卷积,得到的结果求和,再加上一个偏置,结果通过sigmoid函数输出。
    深度学习入门(一):LeNet-5教程与详解_第6张图片

  • 可训练参数:(5 x 5 x 16 + 1) x 120
    对于每个卷积核,其要与16张特征图的每个像素以及偏置相连,共120个卷积核,因此要训练的参数为(5 x 5 x 16 + 1) x 120 = 48120。

2.7.全连接层F6

  • 输入:120维向量
  • 算法: 计算输入向量和权重向量之间的点积,再加上一个偏置,结果通过sigmoid函数输出。

F6层有84个结点,本质上对应一张7×12的比特图。实际上,ASCII码就可以用一张7×12的比特图来表示,每个像素若为-1则表示白色,1表示黑色。该全连接层的设计也是利用了这一思想。
深度学习入门(一):LeNet-5教程与详解_第7张图片

  • 输出:84维向量
  • 可训练参数:84 × (120 + 1)
    对于F6层的每个结点,其值是由输入向量与权重向量做点积得到的,而由于权重向量与输入向量的维度相同,因此权重向量也是120维的,需要训练120个参数,加上偏置,每个结点需要训练121个参数。一共有84个结点,因此需要训练84 × 121 = 10164个参数。

2.8.全连接层OUTPUT

  • 输入:84维向量
    本质上是一张7×12的比特图,表示经过我们多层处理最终得到的一张"数字图像"。
  • 输出:10维向量
    OUTPUT层共有10个结点y0、y1、…、y9,分别对应着数字0到9。

采用径向基函数(RBF)的连接方式,计算方式为:
y i = ∑ j = 0 83 ( x j − w i j ) 2 {y_i} = \sum\limits_{j = 0}^{83} {{{({x_j} - {w_{ij}})}^2}} yi=j=083(xjwij)2
其中, w i j w_{ij} wij的值由数字i的比特图编码(即上一节展示的ASCII码比特图编码)确定。如果结点yi的计算结果最小,则数字识别的结果为数字i。
本质上是比较"我们处理得到的数字比特图"与"真实比特图"之间的相似度。

3.总结

深度学习入门(一):LeNet-5教程与详解_第8张图片
本文撰写时间有限,如有不足,欢迎指正!

你可能感兴趣的:(cv,计算机视觉)