caffe例子mnist

为了程序的简洁,在caffe中是不带练习数据的,因此需要自己去下载。但在caffe根目录下的data文件夹里,作者已经为我们编写好了下载数据的脚本文件,我们只需要联网,运行这些脚本文件就行了。

注意:在caffe中运行所有程序,都必须在根目录下进行,否则会出错

1、mnist实例

mnist是一个手写数字库,由DL大牛Yan LeCun进行维护。mnist最初用于支票上的手写数字识别, 现在成了DL的入门练习库。征对mnist识别的专门模型是Lenet,算是最早的cnn模型了。

mnist数据训练样本为60000张,测试样本为10000张,每个样本为28*28大小的黑白图片,手写数字为0-9,因此分为10类。

首先下载mnist数据,假设当前路径为caffe根目录

# sudo sh data/mnist/get_mnist.sh

运行成功后,在 data/mnist/目录下有四个文件:

train-images-idx3-ubyte:  训练集样本 (9912422 bytes) 
train-labels-idx1-ubyte:  训练集对应标注 (28881 bytes) 
t10k-images-idx3-ubyte:   测试集图片 (1648877 bytes) 
t10k-labels-idx1-ubyte:   测试集对应标注 (4542 bytes)

这些数据不能在caffe中直接使用,需要转换成LMDB数据

# sudo sh examples/mnist/create_mnist.sh

注:  我的不能加 sudo ?????   不懂为啥

如果想运行leveldb数据,请运行 examples/siamese/ 文件夹下面的程序。 examples/mnist/ 文件夹是运行lmdb数据

转换成功后,会在 examples/mnist/目录下,生成两个文件夹,分别是mnist_train_lmdb和mnist_test_lmdb,里面存放的data.mdb和lock.mdb,就是我们需要的运行数据。

接下来是修改配置文件,如果你有GPU且已经完全安装好,这一步可以省略,如果没有,则需要修改solver配置文件。

需要的配置文件有两个,一个是lenet_solver.prototxt,另一个是train_lenet.prototxt.

首先打开lenet_solver_prototxt

# sudo vi examples/mnist/lenet_solver.prototxt

根据需要,在max_iter处设置最大迭代次数,以及决定最后一行solver_mode,是否要改成CPU

保存退出后,就可以运行这个例子了

# sudo time sh examples/mnist/train_lenet.sh

CPU运行时候大约13分钟,GPU运行时间大约4分钟,GPU+cudnn运行时候大约40秒,精度都为99%左右

以上参考   http://www.cnblogs.com/denny402/p/5075490.html



后来发现作者根据 caffe-master/examples/mnist/readme 文件改的。

这个readme引人入胜,娓娓道来

其中提到的lenet 网络结构如下:

    //***********************************************************************************************  
    name: "LeNet"                       //[1]网络(Net)的名称为:LeNet  
    /***********************************************************************************************  
    *模块1:  
    *     1--数据层----Data Layer  
    *     2--该数据层只在[训练]阶段有效  
    ***********************************************************************************************/  
    layer {                             /****[1]定义一个数据层****/  
      name: "mnist"                     //[1]数据层的名字为--mnist  
      type: "Data"                      //[2]层的层类型:Data(数据层)(数据库作为输入)  
      top: "data"                       //[3]数据层的输出blob有两个:data,label(对应生成的CNN图看)  
      top: "label"                        
      include {                         //[4]include里面的数据说明,该层只在训练阶段有效  
        phase: TRAIN  
      }  
      transform_param {                 //[5]数据预处理,转换参数的定义  
        scale: 0.00390625              //[5]特征归一化系数,将范围为[0,255]的MNIST数据归一化为[0,1]  
      }  
      data_param {                      //[6]数据层的参数  
        source: "examples/mnist/mnist_train_lmdb"//[1]由于该数据层的数据来源是数据库(由层类型Data指定),  
                                                 //   因此,source对应的就是数据库LMDB的路径,也就是训练  
                                                 //   数据和测试数据的path  
        batch_size: 64                           //[2]批量数目,表示caffe一次从数据库LMDB读入的图片的数量  
        backend: LMDB                            //[3]数据库的类型说明区别于LevelDB数据库  
      }  
    }  
    /*********************************************************************************************** 
    *模块2: 
    *     1--数据层----Data Layer 
    *     2--一个新的数据层,名字也叫做mnist,输出的blob也是data和label,但是这个数据层只在分类阶段有效,Test 
    *     3--图片大小28*28 
    ***********************************************************************************************/  
    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  
      }  
    }  
    /*********************************************************************************************** 
    *模块3: 
    *     1--第一个卷积层---Convolution 
    *     2--定义一个新的卷积层,卷积层的输入blob为data;输出blob为conv1 
    *     3--Convolution层,使用一系列可训练的卷积核(相当于空间滤波的滤波算子)对输入图像进行卷积操作,每组 
    *           卷积核生成输出图像中的一个特征图(相当于对输入图像,使用20个不同的滤波算子(卷积)进行20次卷积 
    *           之后生成的20张经过滤波的特征图) 
    *     4--输出图片大小:(28+2*0-5)/1+1=(img_h+2*pad_h-kernel_h)/stride_h+1======24*24 
    ***********************************************************************************************/  
    layer {  
      name: "conv1"  
      type: "Convolution"  
      bottom: "data"                    //[1]卷积层的输入blob为data  
      top: "conv1"                      //[2]卷积层的输出blob为conv1  
      param {                           //[3]卷积层的:权值学习速率倍乘因子,1表示,保持与全局参数一致  
        lr_mult: 1  
      }  
      param {                           //[4]卷积层的:偏置项的学习速率倍乘因子,是全局参数的2倍  
        lr_mult: 2  
      }  
      convolution_param {               //[5]卷积层的计算参数  
        num_output: 20                         //[1]输出feature map的数目为20,对应的也就是卷积核的数量  
        kernel_size: 5                         //[2]卷积核的尺寸为:5*5  
        stride: 1                              //[3]卷积核在输入图片上滑动的步长为:1  
        weight_filler {                 //[6]指定权值的初始化方案为:xavier  
          type: "xavier"  
        }  
        bias_filler {                   //[7]偏执项的初始化方案为:constant,默认为0  
          type: "constant"  
        }  
      }  
    }  
    /*********************************************************************************************** 
    *模块4: 
    *     1--第一个池化层---pool1 
    *     2--定义一个下采样层(池化层),这个池化层的输入blob为conv1,输出blob为pool1 
    *     3--输出图片的大小===12*12 
    ***********************************************************************************************/  
    layer {  
      name: "pool1"  
      type: "Pooling"  
      bottom: "conv1"  
      top: "pool1"  
      pooling_param {                  //[1]池化层(下采样)的参数  
        pool: MAX                            //[1]目前提供了三种池化的方法:最大值池化,均值池化,随机池化  
                                             //    很明显,该池化层使用了最大值池化MAX  
        kernel_size: 2                       //[2]指定池化窗口的宽度和高度:2*2  
        stride: 2                            //[3]指定池化窗口在输入数据上滑动的步长为:2  
      }  
    }  
    /*********************************************************************************************** 
    *模块5: 
    *     1--第二个卷积层:conv2 
    *     2--该卷积层的输入blob为pool1,输出blob为conv2 
    *     3--注意:该卷积层输出的feature map(特征图的数量)为:50 
    *     4--输出图片的大小为:(12-2*0-5)/1+1=======8*8 
    ***********************************************************************************************/  
    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"  
        }  
      }  
    }  
    /*********************************************************************************************** 
    *模块6: 
    *     1--第二个池化层:pool2 
    *     2--该池化层的输入blob为conv2,输出blob为pool2 
    ***********************************************************************************************/  
    layer {  
      name: "pool2"  
      type: "Pooling"  
      bottom: "conv2"  
      top: "pool2"  
      pooling_param {  
        pool: MAX  
        kernel_size: 2  
        stride: 2  
      }  
    }  
    /*********************************************************************************************** 
    *模块7: 
    *     1--第一个全连接层 
    *     2--该层的输入blob为:pool2,输出blob为iP1 
    *     3--注意:全连接层的的输出节点数(num_output==500)可以理解为滤波器的个数(滤波算子的个数),对应的也 
    *        就是输出特征图的个数 
    ***********************************************************************************************/  
    layer {  
      name: "ip1"  
      type: "InnerProduct"  
      bottom: "pool2"  
      top: "ip1"  
      param {  
        lr_mult: 1  
      }  
      param {  
        lr_mult: 2  
      }  
      inner_product_param {       //[1]全连接层的参数:  
        num_output: 500                  //[1]该层的输出元素的个数为:500  
        weight_filler {                  //[2]指定全连接层的初始化方案:xavier  
          type: "xavier"  
        }  
        bias_filler {  
          type: "constant"  
        }  
      }  
    }  
    /*********************************************************************************************** 
    *模块8: 
    *     1--新的非线性层(激活函数)(规整化线性单元),此激活层采用的激活函数为:RELU 
    *     2--该激活层的输入blob为iP1,输出blob也为iP1 
    *     3--该(规整化线性单元)激活层的作用为:对全连接层的每一个输出数据进行判断,当x>0时,RELU的输出为x, 
    *        根据X的大小,说明这个单元的激活程度(兴奋程度);如果x<=0,则这个信号(特征图)被完全抑制 
    ***********************************************************************************************/  
    layer {  
      name: "relu1"  
      type: "ReLU"  
      bottom: "ip1"  
      top: "ip1"  
    }  
    /*********************************************************************************************** 
    *模块9: 
    *     1--第二个全连接层InnerProduct 
    *     2--该层的输入blob为iP1,输出blob为ip2 
    ***********************************************************************************************/  
    layer {  
      name: "ip2"  
      type: "InnerProduct"  
      bottom: "ip1"  
      top: "ip2"  
      param {  
        lr_mult: 1  
      }  
      param {  
        lr_mult: 2  
      }  
      inner_product_param {       //[1]全连接层的计算参数  
        num_output: 10                   //[1]该层的输出为10个特征,对应0--9这10类数字  
        weight_filler {                  //[2]该层在网络初始化的初始化方案为:xavier  
          type: "xavier"  
        }  
        bias_filler {                    //[3]给该层添加偏置项,偏置项网络的初始化方案为:constant  
          type: "constant"  
        }  
      }  
    }  
    /*********************************************************************************************** 
    *模块10: 
    *     1--Accuracy---分类准确率层 
    *     2--Accuracy层的作用:该层用来计算网络输出相对于目标值的准确率 
    *     3--该层的输入blob为iP2和label,输出blob为accuracy 
    *     4--注意:记住该层只在Test(测试)阶段有效,并且,它并不是一个Loss层,所以这次没有BP操作 
    ***********************************************************************************************/  
    layer {  
      name: "accuracy"  
      type: "Accuracy"  
      bottom: "ip2"  
      bottom: "label"  
      top: "accuracy"  
      include {  
        phase: TEST  
      }  
    }  
    /*********************************************************************************************** 
    *模块11: 
    *     1--Loss层,损失层 
    *     2--层类型:SoftnaxWithLoss---softmax损失层一般用于计算[多分类问题]的损失,在概念上等同于softmax 
    *               层后面跟一个多变量的logistic回归损失层,但能提供更稳定的梯度 
    ***********************************************************************************************/  
    layer {  
      name: "loss"  
      type: "SoftmaxWithLoss"  
      bottom: "ip2"  
      bottom: "label"  
      top: "loss"  
    }  

怎么直观看看这个结构呢?
一句话


 sudo python ./python/draw_net.py  ./examples/mnist/lenet_train_test.prototxt  ./examples/mnist/lenet_train_test.jpeg

or : 
sudo python ./python/draw_net.py --rankdir BT ./examples/mnist/lenet_train_test.prototxt  ./examples/mnist/lenet_train_test.jpeg


如果你一句话画出下图成功,恭喜!


我折腾几个小时,遇到各种问题,各种问题解答见点击打开链接



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值