caffe模型参数解释

作者:wjmishuai

出处: http://blog.csdn.net/wjmishuai/article/details/50890214

    1. 原始数据是28*28  
    2. 1:数据层:  
    3. layer {  
    4.   name: "mnist"//数据层的名字是mnist  
    5.   type: "Data"//这个层的类型是data  
    6.   top: "data"//产生两个blob,一个是data blob  
    7.   top: "label"//一个是lable blob  
    8.   include {  
    9.     phase: TRAIN  
    10.   }  
    11.   transform_param {  
    12.     scale: 0.00390625//像素归一化  
    13.   }  
    14.   data_param {  
    15.     source: "examples/mnist/mnist_train_lmdb"  
    16.     batch_size: 64  
    17.     backend: LMDB  
    18.   }  
    19. }  
    20. 2:卷积层  
    21. layer {  
    22.   name: "conv1"  
    23.   type: "Convolution"  
    24.   bottom: "data"//获取上一层的data blob  
    25.   top: "conv1"//产生conv1层  
    26.   param {  
    27.     lr_mult: 1//学习率。表示 weight的学习率和slover.pro中的学习率是一致的。  
    28.   }  
    29.   param {  
    30.     lr_mult: 2//表示 bias的学习率是slover.pro中的学习率的2倍。  这样设置会导致更快的收敛  
    31.   }  
    32.   convolution_param {  
    33.     num_output: 20//cov1层将产生输出20个通道  
    34.     kernel_size: 5//卷积核大小是5*5  
    35.     stride: 1//步长是1  
    36.     weight_filler {//权重填充器,使用xavier算法填充weight。根据输入和输出神经元的数量自动确定初始化的规模。  
    37.       type: "xavier"  
    38.     }  
    39.     bias_filler {//偏置填充器,使用constant算法填充bias。是一个常数,默认是0  
    40.       type: "constant"  
    41.     }  
    42.   }  
    43. }  
    44. 3:池化层(避免数据过拟合)  
    45. layer {  
    46.   name: "pool1"  
    47.   type: "Pooling"  
    48.   bottom: "conv1"  
    49.   top: "pool1"  
    50.   pooling_param {  
    51.     pool: MAX//使用MAX进行池化  
    52.     kernel_size: 2//卷积核大小是2*2  
    53.     stride: 2//步长是2  
    54.   }  
    55. }  
    56.   
    57. 4:全连接层  
    58. layer {  
    59.   name: "ip1"  
    60.   type: "InnerProduct"  
    61.   bottom: "pool2"  
    62.   top: "ip1"  
    63.   param {  
    64.     lr_mult: 1  
    65.   }  
    66.   param {  
    67.     lr_mult: 2  
    68.   }  
    69.   inner_product_param {  
    70.     num_output: 500//产生500维的输出数据  
    71.     weight_filler {  
    72.       type: "xavier"  
    73.     }  
    74.     bias_filler {  
    75.       type: "constant"  
    76.     }  
    77.   }  
    78. }  
    79.   
    80. 5:ReLU层(紧跟在全连接层后,目的是节省内存)  
    81. layer {  
    82.   name: "relu1"  
    83.   type: "ReLU"  
    84.   bottom: "ip1"  
    85.   top: "ip1"  
    86. }  
    87.   
    88. ReLU层后紧跟一个InnerProduct层  
    89. layer {  
    90.   name: "ip2"  
    91.   type: "InnerProduct"  
    92.   bottom: "ip1"  
    93.   top: "ip2"  
    94.   param {  
    95.     lr_mult: 1  
    96.   }  
    97.   param {  
    98.     lr_mult: 2  
    99.   }  
    100.   inner_product_param {  
    101.     num_output: 10//因为有10类,所以输出10  
    102.     weight_filler {  
    103.       type: "xavier"  
    104.     }  
    105.     bias_filler {  
    106.       type: "constant"  
    107.     }  
    108.   }  
    109. }  
    110.   
    111. 6:Loss层//不产生任何输出,只是用来计算损失函数的值,用来初始化ip2的gradient   
    112. layer {  
    113.   name: "loss"  
    114.   type: "SoftmaxWithLoss"  
    115.   bottom: "ip2"//需要两个blob,一个是ip2,作为预测用  
    116.   bottom: "label"//来自数据层,作为标签  
    117.   top: "loss"  
    118. }  

name: 表示该层的名称,可随意取

 

type: 层类型,如果是Data,表示数据来源于LevelDB或LMDB。根据数据的来源不同,数据层的类型也不同(后面会详细阐述)。一般在练习的时候,我们都是采 用的LevelDB或LMDB数据,因此层类型设置为Data。

 

top或bottom: 每一层用bottom来输入数据,用top来输出数据。如果只有top没有bottom,则此层只有输出,没有输入。反之亦然。如果有多个 top或多个bottom,表示有多个blobs数据的输入和输出。

 

data 与 label: 在数据层中,至少有一个命名为data的top。如果有第二个top,一般命名为label。 这种(data,label)配对是分类模型所必需的。

 

include: 一般训练的时候和测试的时候,模型的层是不一样的。该层(layer)是属于训练阶段的层,还是属于测试阶段的层,需要用include来指定。如果没有include参数,则表示该层既在训练模型中,又在测试模型中。

Transformations: 数据的预处理,可以将数据变换到定义的范围内。如设置scale为0.00390625,实际上就是1/255, 即将输入数据由0-255归一化到0-1之间