LeNet-5简介及matlab实现-1

发布于:2025-04-03 ⋅ 阅读:(42) ⋅ 点赞:(0)

LeNet-5是一种经典的卷积神经网络(CNN),由Yann LeCun等人提出,最初用于手写数字识别任务。它的结构简单清晰,为CNN的发展奠定了基础。

一、LeNet-5网络结构简介

LeNet-5的网络结构如下图所示

在这里插入图片描述

详细参数:

层名 类型 输入尺寸 尺寸 输出尺寸 激活函数
输入 图片 28×28×1 - 32×32×1
C1 卷积 28×28×1,padding为2 5×5, 6个卷积核,步长为1 28×28×6 relu
S2 池化 28×28×6 2×2 池化,步长为2 14×14×6
C3 卷积 14×14×6,padding为0 5×5, 16个卷积核 10×10×16 relu
S4 池化 10×10×16 2×2 池化,步长为2 5×5×16
C5 卷积(全连接卷积) 5×5×16 5×5, 120个卷积核 120×1 relu
F6 全连接层 120 全连接 84×1 relu
输出 全连接层 84 全连接 10 (数字类别) softmax

二、LeNet-5每一层的实现原理

2.1. 第一层 (C1) :卷积层(Convolution Layer)

输入: 一张灰度图像,尺寸为 28 × 28 × 1 28\times28\times1 28×28×1

参数:

  • 卷积核尺寸为 5 × 5 5\times5 5×5,共 6个卷积核
  • 偏置项 (bias):每个卷积核对应一个独立的偏置值,因此共有6个偏置值。

输出: 经过卷积后的特征图,共6个,尺寸为 28 × 28 × 6 28\times28\times6 28×28×6

(1)卷积计算原理:

卷积层本质上是将卷积核(滤波器)与输入图像进行卷积操作:
Output ( x , y ) = f ( ∑ i = 1 5 ∑ j = 1 5 Kernel ( i , j ) × Input ( x + i , y + j ) + b ) \text{Output}(x,y) = f\left(\sum_{i=1}^{5}\sum_{j=1}^{5}\text{Kernel}(i,j)\times\text{Input}(x+i,y+j)+b\right) Output(x,y)=f(i=15j=15Kernel(i,j)×Input(x+i,y+j)+b)

  • 这里:
    • Kernel ( i , j ) \text{Kernel}(i,j) Kernel(i,j):表示卷积核的第 i i i行、第 j j j列元素的数值。
    • Input ( x + i , y + j ) \text{Input}(x+i,y+j) Input(x+i,y+j):表示输入图像中对应位置上的数值。
    • b b b:表示该卷积核的偏置项(bias)。
    • f ( ⋅ ) f(\cdot) f():激活函数(例如sigmoid或tanh函数或relu函数),推荐使用relu函数。

上面公式中求和部分的计算原理可以通过下面简单的例子理解

在这里插入图片描述

(2)输出特征图尺寸的计算:

卷积后输出尺寸计算公式为:
Output Size = ( Input Size − Kernel Size ) + 2 × Padding Size Stride + 1 \text{Output Size} = \frac{(\text{Input Size}-\text{Kernel Size})+2\times\text{Padding Size}}{\text{Stride}} + 1 Output Size=Stride(Input SizeKernel Size)+2×Padding Size+1

  • 输入:28×28,卷积核:5×5,Stride(步长)=1,padding=2时,计算结果为:

( 28 − 5 ) + 2 × 2 1 + 1 = 28 \frac{(28 - 5)+2\times2}{1} + 1 = 28 1(285)+2×2+1=28

  • 因此,输出特征图为28×28,6个卷积核则输出为28×28×6。

对于padding的理解,可以通过下面简单的例子理解

当padding为0时

在这里插入图片描述

当padding为2时

在这里插入图片描述

2.2. 第二层 (S2) :池化层(Pooling Layer)

输入: C1层输出特征图,共6个,尺寸为 28 × 28 × 6 28\times28\times6 28×28×6

参数:

  • 池化(Pooling)窗口大小: 2 × 2 2\times2 2×2,步长(Stride)= 2。
  • 无需额外参数,无权值,通常采用平均池化或最大池化,推荐使用最大池化。

输出: 池化后的特征图,共6个,尺寸为 14 × 14 × 6 14\times14\times6 14×14×6

(1)池化计算原理:

池化层的作用是降低特征图的尺寸,同时提取特征的重要信息,增强网络的泛化能力。

常见池化方法:

  • 平均池化(Average Pooling): 取池化窗口区域内所有像素值的平均值作为输出。

    例如窗口区域:
    [ 2 4 6 8 ] \begin{bmatrix} 2 & 4\\ 6 & 8 \end{bmatrix} [2648]
    平均池化的结果为:
    2 + 4 + 6 + 8 4 = 5 \frac{2+4+6+8}{4}=5 42+4+6+8=5

  • 最大池化(Max Pooling): 取池化窗口区域内的最大像素值作为输出。

    以上面的区域为例:
    max ⁡ { 2 , 4 , 6 , 8 } = 8 \max\{2,4,6,8\}=8 max{2,4,6,8}=8

LeNet-5原论文中使用的是平均池化

一个图形化的例子如下所示

在这里插入图片描述

(2)输出特征图尺寸的计算:

池化后输出尺寸计算公式为:
Output Size = Input Size − Pooling Size Stride + 1 \text{Output Size} = \frac{\text{Input Size}-\text{Pooling Size}}{\text{Stride}} + 1 Output Size=StrideInput SizePooling Size+1

  • 输入:28×28,池化窗口:2×2,Stride=2时,计算结果为:

28 − 2 2 + 1 = 14 \frac{28-2}{2}+1=14 2282+1=14

  • 所以S2层输出特征图为 14 × 14 × 6 14\times14\times6 14×14×6

2.3. 第三层(C3):卷积层(Convolution Layer)

输入: 第二层(S2)输出,尺寸为 14 × 14 × 6 14 \times 14 \times 6 14×14×6

参数:

  • 卷积核大小为 5 × 5 5\times 5 5×5,共 16个卷积核
  • 偏置(bias):每个卷积核一个偏置,共16个偏置。

这里卷积的计算需要注意的是,输入是多个通道了,这种情况下的计算可以通过下面的图示理解

在这里插入图片描述

一个简单的计算示例如下,这里输入是 4 × 4 × 3 4\times 4\times3 4×4×3,卷积核大小为 3 × 3 3\times3 3×3,但是也要是三通道

在这里插入图片描述

2.4. 第四层(S4):池化层(Pooling Layer)

输入: 第三层(C3)输出,尺寸为 10 × 10 × 16 10\times10\times16 10×10×16

参数:

  • 池化窗口大小: 2 × 2 2\times2 2×2,步长: 2 2 2
  • LeNet-5使用平均池化(Average Pooling),输出特征图尺寸为: 5 × 5 × 16 5\times5\times16 5×5×16

2.5. 第五层(C5):卷积层(全连接卷积层)

输入:第四层(S4)输出特征图,尺寸为 5 × 5 × 16 5\times5\times16 5×5×16

参数

  • 卷积核尺寸: 5 × 5 5\times5 5×5
  • 卷积核数量:120个
  • 偏置数量:120个(每个卷积核对应1个偏置)

由于输入特征图大小为 5 × 5 × 16 5\times5\times 16 5×5×16,而卷积核也为 5 × 5 5\times5 5×5,因此每个卷积核与输入特征图卷积后会变成 1 × 1 1\times1 1×1 的输出,这相当于对整个特征图做了全连接卷积(即卷积核与整个输入特征图区域进行完全连接)。因此,这一层又称为 全连接卷积层

2.6. 第六层(F6):全连接层(Fully Connected Layer)

输入:第五层(C5)输出,共120个神经元(1维向量)。

参数

  • 全连接层的神经元数量:84个
  • 权重数量: 84 × 120 84\times120 84×120(120个输入与84个神经元全连接)
  • 偏置数量:84个(每个神经元一个偏置)

全连接层的计算本质为矩阵乘法+偏置+激活函数:

  • 计算公式:

Output = f ( W × Input ( 120 × 1 ) + b ) \text{Output} = f\left(W \times \text{Input}_{(120\times1)}+b\right) Output=f(W×Input(120×1)+b)

其中:

  • W W W:是一个大小为 84 × 120 84\times120 84×120 的权重矩阵
  • b b b:大小为 84 × 1 84\times1 84×1 偏置向量
  • f f f:激活函数(如tanh或sigmoid)
  • 输出为84维的向量,即大小为: 84 × 1 84\times1 84×1

2.7. 第七层(Output):全连接输出层(Softmax分类层)

输入:第六层(F6)输出的84个神经元(向量)。

参数

  • 输出类别:10个类别(0-9手写数字)
  • 权重数量: 10 × 84 10\times84 10×84(84个输入与10个输出神经元全连接)
  • 偏置数量:10个(每个输出神经元对应1个偏置)

最后一层通常是全连接层,并使用softmax函数作为分类器:

  • 计算公式:

Z j = ∑ i = 1 84 w j , i x i + b j , j = 1 , 2 , . . . , 10 Z_j = \sum_{i=1}^{84}w_{j,i}x_i + b_j,\quad j=1,2,...,10 Zj=i=184wj,ixi+bj,j=1,2,...,10

其中:

  • Z j Z_j Zj:第 j j j个类别的线性输出值
  • w j , i w_{j,i} wj,i:第 j j j个输出神经元与第 i i i个输入神经元的权重
  • b j b_j bj:第 j j j个输出神经元的偏置

计算Softmax概率:
y j = e Z j ∑ k = 1 10 e Z k y_j = \frac{e^{Z_j}}{\sum_{k=1}^{10}e^{Z_k}} yj=k=110eZkeZj

  • y j y_j yj:为第 j j j 类别的概率值,所有 y j y_j yj 和为1。
  • 最终预测类别即为概率最大的类别。
  • 输出尺寸为: 10 × 1 10\times1 10×1,表示10个类别的概率分布。

分析完每一层的原理后,我们就可以计算一下这个网络的可学习参量了

第一层:卷积核尺寸为 5 × 5 5\times5 5×5,共 6个卷积核,考虑到一个卷积核对应一个偏置量,所以
5 × 5 × 6 + 6 = 156 5\times5\times6+6=156 5×5×6+6=156
第二层:池化层无需要学习参量

第三层:卷积核大小为 5 × 5 5\times 5 5×5,共 16个卷积核,因为这一层的输入是6个通道,并考虑到偏置量,所以
5 × 5 × 6 × 16 + 16 = 2416 5\times5\times6\times16+16=2416 5×5×6×16+16=2416
第四层:池化层无需要学习参量

第五层:卷积核大小为 5 × 5 5\times 5 5×5,共 120个卷积核,因为这一层的输入是16个通道,并考虑到偏置量,所以
5 × 5 × 16 × 120 + 120 = 48120 5\times5\times16\times120+120=48120 5×5×16×120+120=48120
第六层:学习参数为权重数量加偏置,所以
84 × 120 + 84 = 10164 84\times120+84=10164 84×120+84=10164
第七层:学习参数为权重数量加偏置,所以
10 × 84 + 10 = 850 10\times84+10=850 10×84+10=850
所以,这个网络的总学习参数为
156 + 2416 + 48120 + 10164 + 850 = 61706 156+2416+48120+10164+850=61706 156+2416+48120+10164+850=61706

三、matlab实现LeNet-5

这里,我们需要借用到matlab工具栏里APPS里的Deep Network Designer,如下图所示

在这里插入图片描述

在Deep Network Designer, 我们创建一个空白Designer画布

在这里插入图片描述

然后我们可以拖动相应的层到Designer里,并连接各个层,如下图所示

在这里插入图片描述

然后,我们需要设置各个层的参量,对于输入图像来说

在这里插入图片描述

第一层:

在这里插入图片描述

第二层:注意到第一层和二层之间有一个激活函数,这是因为所有的卷积层和全连接层后都要跟激活函数

在这里插入图片描述

第三层:

在这里插入图片描述

第四层:

在这里插入图片描述

第五层:

在这里插入图片描述

第六层:

在这里插入图片描述

第七层:

在这里插入图片描述

设置完成后,我们就可以用Analyze这个按钮分析这个网络了,分析内容很详细,可以看到这个网络的可学习参量为61.7k,跟我们上面计算的结果相同。至此,我们就完成了LeNet-5的搭建。

在这里插入图片描述