caffe学习--Lenet5的应用和原理、实现----ubuntu16.04.2+caffe+mnist+train+test

Lenet5的应用和原理、实现

 

----------------------------------------------ubuntu16.04.2----------------------------------------------------------html

ubuntu16.04.2:

#获取数据mysql

cd data/mnist算法

sh get_mnist.shsql

#转换格式数据库

sh examples/mnist/create_mnist.sh
# 训练模型
ubuntu

sh examples/mnist/train_lenet.sh网络

# 测试模型ide

./build/tools/caffe test -model=examples/mnist/lenet_train_test.prototxt -weights=examples/mnist/lenet_iter_10000.caffemodel -gpu=0
# 识别手写数字文本图片:
函数

classification   examples/mnist/lenet.prototxt  examples/mnist/lenet_iter_10000.caffemodel  examples/mnist/mean.binaryproto  data/mnist/synset_words.txt  examples/images/1.png布局

 

------------------------------------------------win7vs2013----------------------------------------------------------

win7-vs2013 :

转换:

convert_mnist_data  data/mnist/train-images.idx3-ubyte  data/mnist/train-labels.idx1-ubyte  examples/mnist/mnist_train_lmdb --backend=lmdb

convert_mnist_data  data/mnist/t10k-images.idx3-ubyte  data/mnist/t10k-labels.idx1-ubyte  examples/mnist/mnist_test_lmdb --backend=lmdb

训练:

caffe train --solver=examples/mnist/lenet_solver.prototxt

测试:

caffe test -model=examples/mnist/lenet_train_test.prototxt -weights=examples/mnist/lenet_iter_10000.caffemodel -gpu=0

计算模型的耗时状况:
caffe time -model=examples/mnist/lenet_train_test.prototxt -weights=examples/mnist/lenet_iter_10000.caffemodel -gpu=0
------------------------>

...   ... ...   ...   ...   ... 

I0705 16:50:08.214988 7784 caffe.cpp:413] loss backward: 0.10135 ms.
I0705 16:50:08.214988 7784 caffe.cpp:418] Average Forward pass: 4.75881 ms.
I0705 16:50:08.214988 7784 caffe.cpp:420] Average Backward pass: 5.6007 ms.
I0705 16:50:08.214988 7784 caffe.cpp:422] Average Forward-Backward: 14.5615 ms.
I0705 16:50:08.214988 7784 caffe.cpp:424] Total Time: 728.073 ms.
I0705 16:50:08.214988 7784 caffe.cpp:425] *** Benchmark ends ***

---------------------------------------------------------------------------------------------------------------------------------

计算平均值:

compute_image_mean.exe  -backend=lmdb examples/mnist/mnist_train_lmdb examples/mnist/mean.binaryproto

 

识别一张图像:

(cifar10 )classification.exe  examples/cifar10/cifar10_quick.prototxt  examples/cifar10/cifar10_quick_iter_5000.caffemodel.h5  examples/cifar10/mean.binaryproto  data/cifar10/synset_words.txt  examples/images/cat.jpg    (参考)

classification.exe  examples/mnist/lenet.prototxt  examples/mnist/lenet_iter_10000.caffemodel  examples/mnist/mean.binaryproto  data/mnist/synset_words.txt  examples/images/le01.jpg

classification   examples/mnist/lenet.prototxt  examples/mnist/lenet_iter_10000.caffemodel  examples/mnist/mean.binaryproto  data/mnist/synset_words.txt  examples/images/1.png

-----------------------------------------------------------------------------------------------------------------------------

synset_words:

0

1

2

3

4

5

6

7

8

9

 ------------------------------------------------------原理解释------------------------------------------------------------

 一个典型的例子说明

    一种典型的用来识别数字的卷积网络是LeNet-5(效果和paper等见这)。当年美国大多数银行就是用它来识别支票上面的手写数字的。可以达到这种商用的地步,它的准确性可想而知。毕竟目前学术界和工业界的结合是最受争议的。

    LeNet-5共有7层,不包含输入,每层都包含可训练参数(链接权重)。输入图像为32*32大小。这要比Mnist数据库(一个公认的手写数据库)中最大的字母还大。这样作的缘由是但愿潜在的明显特征如笔画断电或角点可以出如今最高层特征监测子感觉野的中心。

咱们先要明确一点:每一个层有多个Feature Map,每一个Feature Map经过一种卷积滤波器提取输入的一种特征,而后每一个Feature Map有多个神经元。

     C1层是一个卷积层(为何是卷积?卷积运算一个重要的特色就是,经过卷积运算,可使原信号特征加强,而且下降噪音),由6个特征图Feature Map构成。特征图中每一个神经元与输入中5*5的邻域相连。特征图的大小为28*28,这样能防止输入的链接掉到边界以外(是为了BP反馈时的计算,不致梯度损失,我的看法)。C1有156个可训练参数(每一个滤波器5*5=25个unit参数和一个bias参数,一共6个滤波器,共(5*5+1)*6=156个参数),共156*(28*28)=122,304个链接。

    S2层是一个下采样层(为何是下采样?利用图像局部相关性的原理,对图像进行子抽样,能够减小数据处理量同时保留有用信息),有6个14*14的特征图。特征图中的每一个单元与C1中相对应特征图的2*2邻域相链接。S2层每一个单元的4个输入相加,乘以一个可训练参数,再加上一个可训练偏置。结果经过sigmoid函数计算。可训练系数和偏置控制着sigmoid函数的非线性程度。若是系数比较小,那么运算近似于线性运算,亚采样至关于模糊图像。若是系数比较大,根据偏置的大小亚采样能够被当作是有噪声的“或”运算或者有噪声的“与”运算。每一个单元的2*2感觉野并不重叠,所以S2中每一个特征图的大小是C1中特征图大小的1/4(行和列各1/2)。S2层有12个可训练参数和5880个链接。

 

 

     图2:卷积和子采样过程:卷积过程包括:用一个可训练的滤波器fx去卷积一个输入的图像(第一阶段是输入的图像,后面的阶段就是卷积特征map了),而后加一个偏置bx,获得卷积层Cx。子采样过程包括:每邻域四个像素求和变为一个像素,而后经过标量Wx+1加权,再增长偏置bx+1,而后经过一个sigmoid激活函数,产生一个大概缩小四倍的特征映射图Sx+1

     因此从一个平面到下一个平面的映射能够看做是做卷积运算,S-层可看做是模糊滤波器,起到二次特征提取的做用。隐层与隐层之间空间分辨率递减,而每层所含的平面数递增,这样可用于检测更多的特征信息。

    C3层也是一个卷积层,它一样经过5x5的卷积核去卷积层S2,而后获得的特征map就只有10x10个神经元,可是它有16种不一样的卷积核,因此就存在16个特征map了。这里须要注意的一点是:C3中的每一个特征map是链接到S2中的全部6个或者几个特征map的,表示本层的特征map是上一层提取到的特征map的不一样组合(这个作法也并非惟一的)。(看到没有,这里是组合,就像以前聊到的人的视觉系统同样,底层的结构构成上层更抽象的结构,例如边缘构成形状或者目标的部分)。

    刚才说C3中每一个特征图由S2中全部6个或者几个特征map组合而成。为何不把S2中的每一个特征图链接到每一个C3的特征图呢?缘由有2点。第一,不彻底的链接机制将链接的数量保持在合理的范围内。第二,也是最重要的,其破坏了网络的对称性。因为不一样的特征图有不一样的输入,因此迫使他们抽取不一样的特征(但愿是互补的)。

    例如,存在的一个方式是:C3的前6个特征图以S2中3个相邻的特征图子集为输入。接下来6个特征图以S2中4个相邻特征图子集为输入。而后的3个以不相邻的4个特征图子集为输入。最后一个将S2中全部特征图为输入。这样C3层有1516个可训练参数和151600个链接。

    S4层是一个下采样层,由16个5*5大小的特征图构成。特征图中的每一个单元与C3中相应特征图的2*2邻域相链接,跟C1和S2之间的链接同样。S4层有32个可训练参数(每一个特征图1个因子和一个偏置)和2000个链接。

    C5层是一个卷积层,有120个特征图。每一个单元与S4层的所有16个单元的5*5邻域相连。因为S4层特征图的大小也为5*5(同滤波器同样),故C5特征图的大小为1*1:这构成了S4和C5之间的全链接。之因此仍将C5标示为卷积层而非全相联层,是由于若是LeNet-5的输入变大,而其余的保持不变,那么此时特征图的维数就会比1*1大。C5层有48120个可训练链接。

     F6层有84个单元(之因此选这个数字的缘由来自于输出层的设计),与C5层全相连。有10164个可训练参数。如同经典神经网络,F6层计算输入向量和权重向量之间的点积,再加上一个偏置。而后将其传递给sigmoid函数产生单元i的一个状态。

      最后,输出层由欧式径向基函数(Euclidean Radial Basis Function)单元组成,每类一个单元,每一个有84个输入。换句话说,每一个输出RBF单元计算输入向量和参数向量之间的欧式距离。输入离参数向量越远,RBF输出的越大。一个RBF输出能够被理解为衡量输入模式和与RBF相关联类的一个模型的匹配程度的惩罚项。用几率术语来讲,RBF输出能够被理解为F6层配置空间的高斯分布的负log-likelihood。给定一个输入模式,损失函数应能使得F6的配置与RBF参数向量(即模式的指望分类)足够接近。这些单元的参数是人工选取并保持固定的(至少初始时候如此)。这些参数向量的成分被设为-1或1。虽然这些参数能够以-1和1等几率的方式任选,或者构成一个纠错码,可是被设计成一个相应字符类的7*12大小(即84)的格式化图片。这种表示对识别单独的数字不是颇有用,可是对识别可打印ASCII集中的字符串颇有用。

      使用这种分布编码而非更经常使用的“1 of N”编码用于产生输出的另外一个缘由是,当类别比较大的时候,非分布编码的效果比较差。缘由是大多数时间非分布编码的输出必须为0。这使得用sigmoid单元很难实现。另外一个缘由是分类器不只用于识别字母,也用于拒绝非字母。使用分布编码的RBF更适合该目标。由于与sigmoid不一样,他们在输入空间的较好限制的区域内兴奋,而非典型模式更容易落到外边。

     RBF参数向量起着F6层目标向量的角色。须要指出这些向量的成分是+1或-1,这正好在F6 sigmoid的范围内,所以能够防止sigmoid函数饱和。实际上,+1和-1是sigmoid函数的最大弯曲的点处。这使得F6单元运行在最大非线性范围内。必须避免sigmoid函数的饱和,由于这将会致使损失函数较慢的收敛和病态问题。

5)训练过程

     神经网络用于模式识别的主流是有指导学习网络,无指导学习网络更多的是用于聚类分析。对于有指导的模式识别,因为任同样本的类别是已知的,样本在空间的分布再也不是依据其天然分布倾向来划分,而是要根据同类样本在空间的分布及不一样类样本之间的分离程度找一种适当的空间划分方法,或者找到一个分类边界,使得不一样类样本分别位于不一样的区域内。这就须要一个长时间且复杂的学习过程,不断调整用以划分样本空间的分类边界的位置,使尽量少的样本被划分到非同类区域中。

    卷积网络在本质上是一种输入到输出的映射,它可以学习大量的输入与输出之间的映射关系,而不须要任何输入和输出之间的精确的数学表达式,只要用已知的模式对卷积网络加以训练,网络就具备输入输出对之间的映射能力。卷积网络执行的是有导师训练,因此其样本集是由形如:(输入向量,理想输出向量)的向量对构成的。全部这些向量对,都应该是来源于网络即将模拟的系统的实际“运行”结果。它们能够是从实际运行系统中采集来的。在开始训练前,全部的权都应该用一些不一样的小随机数进行初始化。“小随机数”用来保证网络不会因权值过大而进入饱和状态,从而致使训练失败;“不一样”用来保证网络能够正常地学习。实际上,若是用相同的数去初始化权矩阵,则网络无能力学习。

    训练算法与传统的BP算法差很少。主要包括4步,这4步被分为两个阶段:

第一阶段,向前传播阶段:

a)从样本集中取一个样本(X,Yp),将X输入网络;

b)计算相应的实际输出Op

      在此阶段,信息从输入层通过逐级的变换,传送到输出层。这个过程也是网络在完成训练后正常运行时执行的过程。在此过程当中,网络执行的是计算(实际上就是输入与每层的权值矩阵相点乘,获得最后的输出结果):

       Op=Fn(…(F2(F1(XpW1)W2)…)Wn

第二阶段,向后传播阶段

a)算实际输出Op与相应的理想输出Yp的差;

b)按极小化偏差的方法反向传播调整权矩阵。

6)卷积神经网络的优势

     卷积神经网络CNN主要用来识别位移、缩放及其余形式扭曲不变性的二维图形。因为CNN的特征检测层经过训练数据进行学习,因此在使用CNN时,避免了显式的特征抽取,而隐式地从训练数据中进行学习;再者因为同一特征映射面上的神经元权值相同,因此网络能够并行学习,这也是卷积网络相对于神经元彼此相连网络的一大优点。卷积神经网络以其局部权值共享的特殊结构在语音识别和图像处理方面有着独特的优越性,其布局更接近于实际的生物神经网络,权值共享下降了网络的复杂性,特别是多维输入向量的图像能够直接输入网络这一特色避免了特征提取和分类过程当中数据重建的复杂度。

     流的分类方式几乎都是基于统计特征的,这就意味着在进行分辨前必须提取某些特征。然而,显式的特征提取并不容易,在一些应用问题中也并不是老是可靠的。卷积神经网络,它避免了显式的特征取样,隐式地从训练数据中进行学习。这使得卷积神经网络明显有别于其余基于神经网络的分类器,经过结构重组和减小权值将特征提取功能融合进多层感知器。它能够直接处理灰度图片,可以直接用于处理基于图像的分类。

    卷积网络较通常神经网络在图像处理方面有以下优势:

a)输入图像和网络的拓扑结构能很好的吻合;

b)特征提取和模式分类同时进行,并同时在训练中产生;

c)权重共享能够减小网络的训练参数,使神经网络结构变得更简单,适应性更强。

 

--------------------------------->  上面都是俺copy来的  <-----------------------------------

做者不屑于讲里面参数的计算过程,俺看了很久很久才算出来,下面是我对做者上文中参数计算的理解:

   1.C1层是一个卷积层(为何是卷积?卷积运算一个重要的特色就是,经过卷积运算,可使原信号特征加强,而且下降噪音),由6个特征图Feature Map构成。特征图中每一个神经元与输入中5*5的邻域相连。特征图的大小为28*28,这样能防止输入的链接掉到边界以外(是为了BP反馈时的计算,不致梯度损失,我的看法)。C1有156个可训练参数(每一个滤波器5*5=25个unit参数和一个bias参数,一共6个滤波器,共(5*5+1)*6=156个参数),共156*(28*28)=122,304个链接。

    ---->

   2.S2层是一个下采样层(为何是下采样?利用图像局部相关性的原理,对图像进行子抽样,能够减小数据处理量同时保留有用信息),有6个14*14的特征图。特征图中的每一个单元与C1中相对应特征图的2*2邻域相链接。S2层每一个单元的4个输入相加,乘以一个可训练参数,再加上一个可训练偏置。结果经过sigmoid函数计算。可训练系数和偏置控制着sigmoid函数的非线性程度。若是系数比较小,那么运算近似于线性运算,亚采样至关于模糊图像。若是系数比较大,根据偏置的大小亚采样能够被当作是有噪声的“或”运算或者有噪声的“与”运算。每一个单元的2*2感觉野并不重叠,所以S2中每一个特征图的大小是C1中特征图大小的1/4(行和列各1/2)。S2层有12个可训练参数和5880个链接。

    ---->6个2*2的小方框,每一个有一个参数,加上一个偏置,也就是(1+1)*6=12个可训练参数

    ---->对于S2层的每个图的每个点,链接数是(2*2+1)=5,总共是14*14*6*(2*2+1)=5880个链接

    3.C3层也是一个卷积层,它一样经过5x5的卷积核去卷积层S2,而后获得的特征map就只有10x10个神经元,可是它有16种不一样的卷积核,因此就存在16个特征map了。这里须要注意的一点是:C3中的每一个特征map是链接到S2中的全部6个或者几个特征map的,表示本层的特征map是上一层提取到的特征map的不一样组合(这个作法也并非惟一的)。

例如,存在的一个方式是:C3的前6个特征图以S2中3个相邻的特征图子集为输入。接下来6个特征图以S2中4个相邻特征图子集为输入。而后的3个以不相邻的4个特征图子集为输入。最后一个将S2中全部特征图为输入。这样C3层有1516个可训练参数和151600个链接。

     ---->这里的参数和链接数最很差理解啦

     ---->从C3的角度看,它有16个图.把每一个图对应的参数加起来就好了:

            6*(3*25+1) + 6*(4*25+1) + 3*(4*25+1)+ 1*(6*25+1)=1516个可训练参数

    ---->上面的1516*10*10=151600个链接

     4.S4层是一个下采样层,由16个5*5大小的特征图构成。特征图中的每一个单元与C3中相应特征图的2*2邻域相链接,跟C1和S2之间的链接同样。S4层有32个可训练参数(每一个特征图1个因子和一个偏置)和2000个链接。

     ---->16个2*2的小方框,每一个有一个参数,加上一个偏置,也就是(1+1)*16=32个可训练参数

     ---->对于S4层的每个图的每个点,链接数是(2*2+1)=5,总共是5*5*16*(2*2+1)=2000个链接

    5. C5层是一个卷积层,有120个特征图。每一个单元与S4层的所有16个单元的5*5邻域相连。因为S4层特征图的大小也为5*5(同滤波器同样),故C5特征图的大小为1*1:这构成了S4和C5之间的全链接。之因此仍将C5标示为卷积层而非全相联层,是由于若是LeNet-5的输入变大,而其余的保持不变,那么此时特征图的维数就会比1*1大。C5层有48120个可训练链接。

       ---->120*(5*5*16+1)=48120个可训练链接

    6. F6层有84个单元(之因此选这个数字的缘由来自于输出层的设计),与C5层全相连。有10164个可训练参数。如同经典神经网络,F6层计算输入向量和权重向量之间的点积,再加上一个偏置。而后将其传递给sigmoid函数产生单元i的一个状态。

    ---->84*(120+1)=10164个可训练链接

 

 -------------------------------------------网络解析------------------------------------------------

根据caffe所给样例,lenet网络结构以下:

概要:

层数:10

分别为:mnist,mnist,conv1,pool1,conv2,

pool2,ip1, relu1, ip2, accuracy, loss

 

 =================================================================

name: "LeNet"

layer {

  name: "mnist"

  type: "Data"

  top: "data"

  top: "label"

  include {

    phase: TRAIN

  }

  transform_param {

    scale: 0.00390625

  }

  data_param {

    source: "examples/mnist/mnist_train_lmdb"

    batch_size: 64

    backend: LMDB

  }

}

layer {

  name: "mnist"

  type: "Data"

  top: "data"

  top: "label"

  include {

    phase: TEST

  }

  transform_param {

    scale: 0.00390625

  }

  data_param {

    source: "examples/mnist/mnist_test_lmdb"

    batch_size: 100

    backend: LMDB

  }

}

layer {

  name: "conv1"

  type: "Convolution"

  bottom: "data"

  top: "conv1"

  param {

    lr_mult: 1

  }

  param {

    lr_mult: 2

  }

  convolution_param {

    num_output: 20

    kernel_size: 5

    stride: 1

    weight_filler {

      type: "xavier"

    }

    bias_filler {

      type: "constant"

    }

  }

}

layer {

  name: "pool1"

  type: "Pooling"

  bottom: "conv1"

  top: "pool1"

  pooling_param {

    pool: MAX

    kernel_size: 2

    stride: 2

  }

}

layer {

  name: "conv2"

  type: "Convolution"

  bottom: "pool1"

  top: "conv2"

  param {

    lr_mult: 1

  }

  param {

    lr_mult: 2

  }

  convolution_param {

    num_output: 50

    kernel_size: 5

    stride: 1

    weight_filler {

      type: "xavier"

    }

    bias_filler {

      type: "constant"

    }

  }

}

layer {

  name: "pool2"

  type: "Pooling"

  bottom: "conv2"

  top: "pool2"

  pooling_param {

    pool: MAX

    kernel_size: 2

    stride: 2

  }

}

layer {

  name: "ip1"

  type: "InnerProduct"

  bottom: "pool2"

  top: "ip1"

  param {

    lr_mult: 1

  }

  param {

    lr_mult: 2

  }

  inner_product_param {

    num_output: 500

    weight_filler {

      type: "xavier"

    }

    bias_filler {

      type: "constant"

    }

  }

}

layer {

  name: "relu1"

  type: "ReLU"

  bottom: "ip1"

  top: "ip1"

}

layer {

  name: "ip2"

  type: "InnerProduct"

  bottom: "ip1"

  top: "ip2"

  param {

    lr_mult: 1

  }

  param {

    lr_mult: 2

  }

  inner_product_param {

    num_output: 10

    weight_filler {

      type: "xavier"

    }

    bias_filler {

      type: "constant"

    }

  }

}

layer {

  name: "accuracy"

  type: "Accuracy"

  bottom: "ip2"

  bottom: "label"

  top: "accuracy"

  include {

    phase: TEST

  }

}

layer {

  name: "loss"

  type: "SoftmaxWithLoss"

  bottom: "ip2"

  bottom: "label"

  top: "loss"

}

 

 

 

 

----------------------------关键步骤解释-------------------------------- -------------------------finish and to do ----------------------------

相关文章
相关标签/搜索