老饼讲解-深度学习 机器学习 神经网络 深度学习
经典CNN模型
1.LeNet与ALexNet网络
2.VGG网络
3.GoogLeNet-Inception
4.ResNet

【模型】LeNet卷积神经网络模型介绍

作者 : 老饼 发表日期 : 2023-07-28 10:50:05 更新日期 : 2024-03-13 15:43:44
本站原创文章,转载请说明来自《老饼讲解-深度学习》www.bbbdata.com




LeNet卷积神经网络由Yann LeCun等人在1998年提出,用于手写数字的识别,

LeNet是最早的卷积神经网络之一,它为后续的卷积神经网络的发展奠定了基础

Yann LeCun也因此被誉为卷积神经网络之父,并获得了2018年的图灵奖

本文讲解LeNet卷积神经网络的模型结构,详细描述每一层的计算方法

通过本文可以清晰了解LeNet神经网络是什么,用于解决什么问题,及它的具体计算过程





   01. LeNet-5的网络结构简介   



本节对LeNet-5的网络结构进行简单描述


     LeNet简介    


LeNet由AT&T贝尔实验室的研究员Yann LeCun在1998年提出
LeNet是一种经典、简单的CNN神经网络,用于解决手写数字的识别问题
LeNet系列中核心模型就是LeNet-5,一般说LeNet指的就是LeNet-5
 LeNet-5原文地址:《Gradient-based learning applied to document recognition




    LeNet-5结构简介    


 LeNet-5输入输出简介      
在原文中,LeNet用于解决手写数字的识别,输入手写数字图片(28×28),输出所属数字类别
更一般来说,LeNet用于图片的类别识别,输入是28×28的图片,输出图片的所属类别
 其中,输出的类别由一个维度为类别个数的列向量表示,
第i个数值越大,代表是类别i的可能性越大
      LeNet网络结构简介      
 
LeNet的网络结构如下:
LeNet-5原文结构图
LeNet一共有7层(不包括输入层),结构简述如下:
 LeNet-5简化结构图
              👉包含3个卷积层(C),2个采样层/池化层(S),和2个全连接层(F)






   02. LeNet-5的网络结构详细述   



本节介绍LeNet-5各层的结构及运算细节



    LeNet-input与C1层    


输入层
LeNet的输入层是28*28的图片(手写数字)
   C1层 
 C1的输入:C1是卷积层,它的输入是输入层28×28的图片                                       
 C1的运算:C1利用6个5×5×1的卷积核进行卷积,填充为2,步幅为1                      
              卷积后的输出则为6个(28+4-5+1)×(28+4-5+1)=28×28的特征映射图 
 
C1的参数个数:(5*5*1+1)*6=156                                                                          
 C1的输出:28×28×6的特征映射图                                                                        



        LeNet-S2层       


S2的输入:S2是采样层(池化层),它的输入是C1的输出                                          
   即S2的输入为28×28×6的特征映射图                       
 S2的运算S2的运算包括池化与激活两个步骤                                                        
                         
1. 池化:采用Size为2×2,步幅为2的池化窗口对输入进行均值池化             
   这里的池化是带阈值的池化             
          池化后为6个(28/2)×(28/2)=14×14的特征映射图 
 
                  2. 激活:将池化后的结果使用Sigmoid函数进行激活                            
 
S2的参数个数:(1+1)*6=12                                                                                   
                  每组池化后都需要再乘以一个权重和加上阈值,所以是(1+1)*6=12                     
 S2的输出:14×14×6的特征映射图                                                                        
✍️补充:关于原文的采样层
原文中的采样层是将窗口所有值相加,再乘以一个系数
由于与后来的池化运算相似,所以这里不妨采用均值池化,即窗口所有值求平均
由于有系数的控制,所以求和与求平均对模型来说,并无差异



      LeNet-C3层      


C3的输入:C3是卷积层,它的输入是S2的输出                                                      
  即C3的输入为14×14×6的特征映射图                     
 
C3与S2的连接方式C3与S2的连接方式较为特殊,采用非完全连接方式                    
 C3与S2的连接方式详细如下:        
 C3共有16个5×5×1的卷积核                                                  
         每个卷积核并不都与S2层的6组输出完全连接,它的连接方式如下:
                 LeNet-5的C3层连接方式
       总的来说,共有四种连接类型
    👉1.前6个只连续连接三组              
    👉2.后6个只连续连接4组               
    👉3.再之后的3三个只连接不连续的4组   
    👉4.最后一个是全连接                 
                   备注:这样的连接在生物意义上理解为尽量充分地从不同角度、不同粒度地观察S2
 
C3的运算C3使用16个5*5*1的卷积核进行卷积,填充为0,步幅为1                       
                                   卷积后的输出则为16个[(14+4-5)/1+1]*[(14+4-5)/1+1]=10*10的特征映射图
         C3的参数个数: 6*(3*5*5+1)+6*(4*5*5+1)+3*(4*5*5+1)+1*(6*5*5+1)=1516            
 C3的输出:10*10*16的特征映射图                                                                        



     LeNet-S4层      


S4的输入:S4是采样层(池化层),它的输入是C3的输出                          
 即S4的输入为10×10×16的特征映射图          
 
S4的运算S4采用Size为2*2,步幅为2的池化窗口对输入进行均值池化   
    池化后为[10/2]×[10/2]=5×5的特征映射图       
 
S4的参数个数:(1+1)*16=32                                                                
         每组池化后都需要再乘以一个权重和加上阈值            
所以参数个数为
(1+1)*16=32                            
 S4的输出:5×5×16的特征映射图                                                         




      LeNet-C5层     


C5的输入:C5是卷积层,它的输入是S4层的输出                                   
 即C5的输入为5×5×16的特征映射图             
  
C5的运算:C5使用120个5×5×16的卷积核进行卷积,填充为0步幅为1      
  卷积后的输出则为1×1×120的特征映射图          
 
C5的参数个数:(5*5*16+1)*120=48120                              
 C5的输出:1×1×120的特征映射图                                                       
✍️备注:关于把C5看作全连接层的观点
 
    由于C5共有120个卷积核,每个卷积核为5×5×16,
而输入也是5×5×16,所以每个卷积核的输出结果只有一个,
在这种特殊的情况下,也可以把它看作全连接层,即120个神经元,与S4的所有输出全连接,
但实际上,它是一个卷积层,在当S4的输出不为16×5×5时,应当按卷积层的逻辑计算




      LeNet-F6层      


F6的输入:F6是全连接层,它的输入是S4层的输出展平后的向量            
          即F6的输入是1×1×120的特征映射图展平后的120×1向量  
F6的运算:
F6是传统神经网络的运算方法,激活函数使用tanh               
 F6的计算具体如下:
    
     其中:
       X:120*1的输入向量   
     W:权重,84×120的矩阵
     b:阈值,84×1的列向量
    tanh:双曲正切函数   
    y:F6层的输出       

 
F6的参数个数:(120+1)*84=10164                                                      
 F6的输出:
84×1的列向量                                                                     



       LeNet-F7层      


F7的输入:F7是最后的输出层,它是一个全连接层                                 
  F7的输入是F6层的输出(84*1的列向量)                 
 F7的运算:有多少个类别,F7就有多少个神经元                                       
      F7与F6全连接,使用RBF函数作为激活函数            
               F7的计算公式如下:                               
                     
              其中,是F7的第i个输出                  
                           
是F6层第j个神经元与F7第i个神经元的权重       
    F7的计算示图如下:      

                             LeNet-5的F7的计算方式     
                                        简单来说,就是F6的输出与W的欧基里德距离     
 F7的参数个数:类别个数*84                                                                  
F7的输出:
类别个数*1的列向量                                                            
补充:关于F7的意义
不妨记F6与F7第i个神经元相连的84个权重记为
 的意义实际是代表第i个类别的坐标,F6的输出与的距离越近,则输出就越小
最终对比F7的所有输出值,如果第k个输出值最小,就判为第k类 
 特别说明的是,F6与F7的连接权重是根据类别的背景意义事前精心设计的,
设计完后在训练中并不调整(或者设计后也参与调整)





   03. LeNet-5运算流程图与统计   



本节通过图表来直观介绍、理解LeNet-5的结构与运算



      Lenet-5的运算流程图总览     


为方便理解,整理出LeNet-5各层结构的处理流程图如下所示
LeNet-5模型结构图 
结合上图与第二节的描述进行理解,就可以非常细节与具体地理解LeNet-5的结构与计算方法






     Lenet-5网络的统计概览表    


Lenet-5各层的输出、参数等相关统计如下
 LeNet-5配置表





      笔者语:关于LeNet-5的实现    


一般很少会再按LeNet-5原文的网络结构去复现LeNet-5,
笔者认为有三个原因:
1.F7层使用的是RBF函数,并且F7的权重需要根据具体业务背景精心设计,所以难以复现                                  
                       2.LeNet-5是一个初代的卷积神经网络,结构细节上与后来的卷积神经网络略有出入,导致使用pytorch等框架实现时稍为复杂 
3.LeNet-5是一个初代的卷积神经网络,有些细节技术方面在后来并没有太多价值,强行实现也没有太大好处    
 例如池化层加权重、C3的非完全连接与F7的RBF激活函数等等,都已经被淘汰了,强行实现没有太大价值    
总的来说,知道LeNet就好了,初学者不要太纠结一定要按原文去复现,对学习、实际使用都没有太大的价值








 End 





联系老饼