Lenet网络模型

Posted AI菜鸟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lenet网络模型相关的知识,希望对你有一定的参考价值。

Lenet-5是Lecun大神在1998年提出的卷积网络模型,共有7层(除输入层)。本文主要详细介绍卷积层与池化层,及其在caffe中的网络描述,最后介绍Lenet-5网络在数字识别方面的应用。

数据层:

1.原图尺寸大小输入

2.进行padding处理输入:这样做的目的是为了保证输入图像的所有内容。

3.一般进行归一化(幅度归一化到同样的范围),减均值(把数据各个维度都中心化到0)等预处理操作。如下图:

接下来我们考虑数据层在caffe的实现:

  1. 数据来源

数据库(LevelDB和LMDB)、图像、内存、HDF5等,在这只介绍来源于图像,其他的可查看《caffe官方教程中译本》

  • 来源于数据库(LevelDB和LMDB):

      其中制作成的LevelDB数据存放在examples/mnist下

layer {

  name:  "mnist"

  type:  "Data"

  top:  "data"

  top:  "label"

  include {

    phase: TRAIN

  }

  transform_param  {

    scale:  0.00390625

  }

  data_param {

  source: "examples/mnist/mnist_train_leveldb"

batch_size: 64

#选择采用LevelDB还是LMDB,默认是LevelDB

    backend:  LEVELDB

  }

}

  • 来源于图像

 其中数据路径为:F:deep_learninglenet下的mnist文件下,由test(测试数据集)与train(训练数据集)两个文件夹组成:

Lenet网络模型


每个文件下存放的内容:

Lenet网络模型

其中0-9文件夹下为每一类的图像;labels.txt为标签0-9;train.txt由路径和标签组成如Lenet网络模型


layer {

  name:  "mnist"

  type:  "ImageData"

  top:  "data"

  top:  "label"

  include {#指定训练or测试状态

    phase: TRAIN

  }

  transform_param  {#数据预处理

scale: 0.00390625  #1/255

#mean_file_size:用一个配置文件进行

#均值操作

#mirror1表示开启镜像,0表示关闭

  }

   image_data_param {

#source:一个文本文件的名字,每一行

#给定图像文件夹的名称和标签

source: "F:/deep_learning/lenet/

mnist/train/train.txt"

#batch_size:每一次处理的数据个数,

#即图像数

batch_size: 64

#可选参数:

#rand_skip:在开始时略过某个数据的

#输入,通常对异步SGD很有用

#shuffle:随即打乱顺序,默认false

#new_heightnew_width:如果设置,

#则将图像进行resize

    new_height:28

    new_width:28

   root_folder: "F:/deep_learning/

lenet/"

  }

}

卷积层:

我们利用一个3*3的卷积核对一5*5的矩阵(图像)进行卷积来说明卷积的具体操作,如下图:

 1.输出卷积特征大小:

  • 图像大小:5*5

  • Padding:为0,没有进行边缘填充操作

  • 卷积核大小:3*3

  • 卷积步长:1,隔一个像素点

  • 利用如下公式可以确定输出特征的大小为3*3

    2.对应矩阵点乘求和进行填充输出矩阵元素

layer {

  name:  "conv1"

  type:  "Convolution"

  bottom:  "data"

  top:  "conv1"

 #param {

 #  lr_mult: 1 权值学习率系数,最终的学习率是这个数乘以solver.prototxt配置文件中的base_lr

 # }

 # param {

 #   lr_mult: 2   偏置学习系数

 # }

   convolution_param {

#卷积核的个数

num_output: 20

#卷积核大小

kernel_size: 5

#卷积核步长

stride: 1

#pad:扩充边缘,默认为0,不扩充

# weight_filler权值初始化,默认为constant值全为0

    weight_filler  {

      type:  "xavier"

}

# bias_filler偏置初始化

    bias_filler {

      type:  "constant"

    }

  }

}

池化层(下采样层):

   池化主要有三种方法:Max-pooling,Mean-pooling与Stochastic-pooling。我们利用一个4*4的矩阵进行池化来说明池化的具体操作,如下图:

  1. 池化结果大小:

    l  图像大小:4*4

    l  Padding:为0,没有进行边缘填充操作

    l  池化核大小:2*2

    l  池化步长:2

    l  利用如下公式可以确定输出特征的大小为2*2

2.对池化核大小内(即2*2)的元素进行求最大值,均值,以最大概率取值,填充到池化结果矩阵中。

layer {

  name:  "pool1"

  type:  "Pooling"

  bottom:  "conv1"

  top:  "pool1"

  pooling_param {

#池化方法,默认Max,可选MAXAVESTOCHASTIC

pool: MAX

#池化核大小

kernel_size: 2

#池化步长

stride: 2

#pad:进行边缘填充

  }

}

池化的作用:

1.显著的减少参数数量

2.池化具有平移不变性(感觉讲解非常直白所以就引用过来了,以下解释主要参考https://my.oschina.net/findbill/blog/550565)

例如,有一个 12×12 的 featuremap (隐藏层的一个单元提取到的卷积特征矩阵),池化区域的大小为 6×6,那么池化后,feature map 的维度变为 2×2

Lenet网络模型

假设原 feature map 中灰色元素的值为 1,白色元素的值为 0。如果采用max pooling,那么池化后左上角窗口的值为 1。如果将图像向右平移一个像素:

Lenet网络模型

池化后左上角窗口的值还是 1。如果将图像缩小:

Lenet网络模型

池化后左上角窗口的值依然是 1。通常我们认为图像经过有限的平移、缩放、旋转,不应改变其识别结果,这就要求经过平移、缩放、旋转的图片所提取的特征与原图所提取的特征相同或相似,因此分类器才能把它们识别成同一类。

Lenet网络结构:

Lenet网络模型

Input:  图像大小为32*32

C1 bottom:1*32*32,kernel:6*5*5,top:6*28*28

        参数个数:(5*5+1)*6

S2:    bottom:6*28*28,kernel:2*2,top :6*14*14

        参数个数:(1+1)*6

C3bottom:6*14*14,kernel:16*5*5,top:16*10*10

         连接方式:

      参数个数:(5*5*3+1)*6+(5*5*4+1)*9+5*5*6+1

S4:   bottom:16*10*10,kernel:2*2,top:16*5*5

       参数个数:(1+1)*16

C5bottom:16*5*5,kernel:120*5*5,top:120*1*1

       参数个数:(5*5*16+1)*120

F6bottom:120*1*1,top:86*1*1

      参数个数:86*120

输出: bottom:86*1*1,top:10*1*1

       参数个数:86*10


欢迎关注“AI菜鸟”:


以上是关于Lenet网络模型的主要内容,如果未能解决你的问题,请参考以下文章

深度学习: LeNet-5 网络模型小结

卷积神经网络模型之——LeNet网络结构与代码实现

卷积神经网络-2-LeNet 模型应用

源码三维LeNet-5网络的预训练神经网络工具箱模型

卷积池化与LeNet5网络模型

tensorflow实现LeNet-5模型