配置文件解读 http://blog.csdn.net/maweifei/article/details/52965523

来源:互联网 发布:淘宝产品为什么下架了 编辑:程序博客网 时间:2024/06/08 14:08
[cpp] view plain copy
  1. /********************************************************************************************** 
  2. *文件说明: 
  3. *       Mnist手写数字识别----对应的CNN神经网络模型的详细解释 
  4. *时间地点: 
  5. *        陕西师范大学----2016.10.26   
  6. **********************************************************************************************/  
  7. (一)CNN神经网络模型的概述:  
  8.    在我没有学习卷积神经网络(深度学习)之前,我看了很多的神经网络,什么人工神经网络,BP神经网络等等,在学习  
  9. 神经网络的时候,经常会见到下面的网络模型或者说图片吧:  

[cpp] view plain copy
  1. 那么问题来了,如果我们要用程序来实现这些神经网络的话,使用什么样的形式去实现它呢?  
  2.        1---结构体+结构体指针  
  3.        2---类  
  4.    总之,是一个比较困难的事情.现在caffe为我们提供了一种很方便的方法:使用网络配置文件去实现它,如果拿Mnist  
  5. 手写数字识别所使用的CNN神经网络模型LeNet来说的话,它的神经网络模型的描述文件就是/home/wei/caffe/examples  
  6. /mnist/文件夹下面的:lenet_train_test.prototxt  
  7. (二)LeNet模型的详解  
  8.    在我们具体看这个网络模型描述文件之前,我们首先使用caffe的可视化程序,将这个网络模型画出来.我们使用/home  
  9. /wei/caffe/python/文件夹下的draw_net.py这个python脚本程序.  
  10.    具体的命令如下所示:  

[cpp] view plain copy
  1. sudo python ./python/draw_net.py  ./examples/mnist/lenet_train_test.prototxt  ./examples/mnist/lenet_train_test.jpeg  


结合上面我画的LeNat-CNN模型的网络结构图,然后去看网络描述(配置文件),试着理解LeNet模型(最简单的卷积神经网络模型):

那么,现在,我们来具体看一下lenet_train_test.prototxt这个文件的具体内容:

[cpp] view plain copy
  1. //***********************************************************************************************  
  2. name: "LeNet"                       //[1]网络(Net)的名称为:LeNet  
  3. /***********************************************************************************************  
  4. *模块1:  
  5. *     1--数据层----Data Layer  
  6. *     2--该数据层只在[训练]阶段有效  
  7. ***********************************************************************************************/  
  8. layer {                             /****[1]定义一个数据层****/  
  9.   name: "mnist"                     //[1]数据层的名字为--mnist  
  10.   type: "Data"                      //[2]层的层类型:Data(数据层)(数据库作为输入)  
  11.   top: "data"                       //[3]数据层的输出blob有两个:data,label(对应生成的CNN图看)  
  12.   top: "label"                        
  13.   include {                         //[4]include里面的数据说明,该层只在训练阶段有效  
  14.     phase: TRAIN  
  15.   }  
  16.   transform_param {                 //[5]数据预处理,转换参数的定义  
  17.     scale: 0.00390625              //[5]特征归一化系数,将范围为[0,255]的MNIST数据归一化为[0,1]  
  18.   }  
  19.   data_param {                      //[6]数据层的参数  
  20.     source: "examples/mnist/mnist_train_lmdb"//[1]由于该数据层的数据来源是数据库(由层类型Data指定),  
  21.                                              //   因此,source对应的就是数据库LMDB的路径,也就是训练  
  22.                                              //   数据和测试数据的path  
  23.     batch_size: 64                           //[2]批量数目,表示caffe一次从数据库LMDB读入的图片的数量  
  24.     backend: LMDB                            //[3]数据库的类型说明区别于LevelDB数据库  
  25.   }  
  26. }  
  27. /*********************************************************************************************** 
  28. *模块2: 
  29. *     1--数据层----Data Layer 
  30. *     2--一个新的数据层,名字也叫做mnist,输出的blob也是data和label,但是这个数据层只在分类阶段有效,Test 
  31. *     3--图片大小28*28 
  32. ***********************************************************************************************/  
  33. layer {  
  34.   name: "mnist"  
  35.   type: "Data"  
  36.   top: "data"  
  37.   top: "label"  
  38.   include {  
  39.     phase: TEST  
  40.   }  
  41.   transform_param {  
  42.     scale: 0.00390625  
  43.   }  
  44.   data_param {  
  45.     source: "examples/mnist/mnist_test_lmdb"  
  46.     batch_size: 100  
  47.     backend: LMDB  
  48.   }  
  49. }  
  50. /*********************************************************************************************** 
  51. *模块3: 
  52. *     1--第一个卷积层---Convolution 
  53. *     2--定义一个新的卷积层,卷积层的输入blob为data;输出blob为conv1 
  54. *     3--Convolution层,使用一系列可训练的卷积核(相当于空间滤波的滤波算子)对输入图像进行卷积操作,每组 
  55. *           卷积核生成输出图像中的一个特征图(相当于对输入图像,使用20个不同的滤波算子(卷积)进行20次卷积 
  56. *           之后生成的20张经过滤波的特征图) 
  57. *     4--输出图片大小:(28+2*0-5)/1+1=(img_h+2*pad_h-kernel_h)/stride_h+1======24*24 
  58. ***********************************************************************************************/  
  59. layer {  
  60.   name: "conv1"  
  61.   type: "Convolution"  
  62.   bottom: "data"                    //[1]卷积层的输入blob为data  
  63.   top: "conv1"                      //[2]卷积层的输出blob为conv1  
  64.   param {                           //[3]卷积层的:权值学习速率倍乘因子,1表示,保持与全局参数一致  
  65.     lr_mult: 1  
  66.   }  
  67.   param {                           //[4]卷积层的:偏置项的学习速率倍乘因子,是全局参数的2倍  
  68.     lr_mult: 2  
  69.   }  
  70.   convolution_param {               //[5]卷积层的计算参数  
  71.     num_output: 20                         //[1]输出feature map的数目为20,对应的也就是卷积核的数量  
  72.     kernel_size: 5                         //[2]卷积核的尺寸为:5*5  
  73.     stride: 1                              //[3]卷积核在输入图片上滑动的步长为:1  
  74.     weight_filler {                 //[6]指定权值的初始化方案为:xavier  
  75.       type: "xavier"  
  76.     }  
  77.     bias_filler {                   //[7]偏执项的初始化方案为:constant,默认为0  
  78.       type: "constant"  
  79.     }  
  80.   }  
  81. }  
  82. /*********************************************************************************************** 
  83. *模块4: 
  84. *     1--第一个池化层---pool1 
  85. *     2--定义一个下采样层(池化层),这个池化层的输入blob为conv1,输出blob为pool1 
  86. *     3--输出图片的大小===12*12 
  87. ***********************************************************************************************/  
  88. layer {  
  89.   name: "pool1"  
  90.   type: "Pooling"  
  91.   bottom: "conv1"  
  92.   top: "pool1"  
  93.   pooling_param {                  //[1]池化层(下采样)的参数  
  94.     pool: MAX                            //[1]目前提供了三种池化的方法:最大值池化,均值池化,随机池化  
  95.                                          //    很明显,该池化层使用了最大值池化MAX  
  96.     kernel_size: 2                       //[2]指定池化窗口的宽度和高度:2*2  
  97.     stride: 2                            //[3]指定池化窗口在输入数据上滑动的步长为:2  
  98.   }  
  99. }  
  100. /*********************************************************************************************** 
  101. *模块5: 
  102. *     1--第二个卷积层:conv2 
  103. *     2--该卷积层的输入blob为pool1,输出blob为conv2 
  104. *     3--注意:该卷积层输出的feature map(特征图的数量)为:50 
  105. *     4--输出图片的大小为:(12-2*0-5)/1+1=======8*8 
  106. ***********************************************************************************************/  
  107. layer {  
  108.   name: "conv2"  
  109.   type: "Convolution"  
  110.   bottom: "pool1"  
  111.   top: "conv2"  
  112.   param {  
  113.     lr_mult: 1  
  114.   }  
  115.   param {  
  116.     lr_mult: 2  
  117.   }  
  118.   convolution_param {  
  119.     num_output: 50  
  120.     kernel_size: 5  
  121.     stride: 1  
  122.     weight_filler {  
  123.       type: "xavier"  
  124.     }  
  125.     bias_filler {  
  126.       type: "constant"  
  127.     }  
  128.   }  
  129. }  
  130. /*********************************************************************************************** 
  131. *模块6: 
  132. *     1--第二个池化层:pool2 
  133. *     2--该池化层的输入blob为conv2,输出blob为pool2 
  134. ***********************************************************************************************/  
  135. layer {  
  136.   name: "pool2"  
  137.   type: "Pooling"  
  138.   bottom: "conv2"  
  139.   top: "pool2"  
  140.   pooling_param {  
  141.     pool: MAX  
  142.     kernel_size: 2  
  143.     stride: 2  
  144.   }  
  145. }  
  146. /*********************************************************************************************** 
  147. *模块7: 
  148. *     1--第一个全连接层 
  149. *     2--该层的输入blob为:pool2,输出blob为iP1 
  150. *     3--注意:全连接层的的输出节点数(num_output==500)可以理解为滤波器的个数(滤波算子的个数),对应的也 
  151. *        就是输出特征图的个数 
  152. ***********************************************************************************************/  
  153. layer {  
  154.   name: "ip1"  
  155.   type: "InnerProduct"  
  156.   bottom: "pool2"  
  157.   top: "ip1"  
  158.   param {  
  159.     lr_mult: 1  
  160.   }  
  161.   param {  
  162.     lr_mult: 2  
  163.   }  
  164.   inner_product_param {       //[1]全连接层的参数:  
  165.     num_output: 500                  //[1]该层的输出元素的个数为:500  
  166.     weight_filler {                  //[2]指定全连接层的初始化方案:xavier  
  167.       type: "xavier"  
  168.     }  
  169.     bias_filler {  
  170.       type: "constant"  
  171.     }  
  172.   }  
  173. }  
  174. /*********************************************************************************************** 
  175. *模块8: 
  176. *     1--新的非线性层(激活函数)(规整化线性单元),此激活层采用的激活函数为:RELU 
  177. *     2--该激活层的输入blob为iP1,输出blob也为iP1 
  178. *     3--该(规整化线性单元)激活层的作用为:对全连接层的每一个输出数据进行判断,当x>0时,RELU的输出为x, 
  179. *        根据X的大小,说明这个单元的激活程度(兴奋程度);如果x<=0,则这个信号(特征图)被完全抑制 
  180. ***********************************************************************************************/  
  181. layer {  
  182.   name: "relu1"  
  183.   type: "ReLU"  
  184.   bottom: "ip1"  
  185.   top: "ip1"  
  186. }  
  187. /*********************************************************************************************** 
  188. *模块9: 
  189. *     1--第二个全连接层InnerProduct 
  190. *     2--该层的输入blob为iP1,输出blob为ip2 
  191. ***********************************************************************************************/  
  192. layer {  
  193.   name: "ip2"  
  194.   type: "InnerProduct"  
  195.   bottom: "ip1"  
  196.   top: "ip2"  
  197.   param {  
  198.     lr_mult: 1  
  199.   }  
  200.   param {  
  201.     lr_mult: 2  
  202.   }  
  203.   inner_product_param {       //[1]全连接层的计算参数  
  204.     num_output: 10                   //[1]该层的输出为10个特征,对应0--9这10类数字  
  205.     weight_filler {                  //[2]该层在网络初始化的初始化方案为:xavier  
  206.       type: "xavier"  
  207.     }  
  208.     bias_filler {                    //[3]给该层添加偏置项,偏置项网络的初始化方案为:constant  
  209.       type: "constant"  
  210.     }  
  211.   }  
  212. }  
  213. /*********************************************************************************************** 
  214. *模块10: 
  215. *     1--Accuracy---分类准确率层 
  216. *     2--Accuracy层的作用:该层用来计算网络输出相对于目标值的准确率 
  217. *     3--该层的输入blob为iP2和label,输出blob为accuracy 
  218. *     4--注意:记住该层只在Test(测试)阶段有效,并且,它并不是一个Loss层,所以这次没有BP操作 
  219. ***********************************************************************************************/  
  220. layer {  
  221.   name: "accuracy"  
  222.   type: "Accuracy"  
  223.   bottom: "ip2"  
  224.   bottom: "label"  
  225.   top: "accuracy"  
  226.   include {  
  227.     phase: TEST  
  228.   }  
  229. }  
  230. /*********************************************************************************************** 
  231. *模块11: 
  232. *     1--Loss层,损失层 
  233. *     2--层类型:SoftnaxWithLoss---softmax损失层一般用于计算[多分类问题]的损失,在概念上等同于softmax 
  234. *               层后面跟一个多变量的logistic回归损失层,但能提供更稳定的梯度 
  235. ***********************************************************************************************/  
  236. layer {  
  237.   name: "loss"  
  238.   type: "SoftmaxWithLoss"  
  239.   bottom: "ip2"  
  240.   bottom: "label"  
  241.   top: "loss"  
  242. }  
阅读全文
0 0
原创粉丝点击