王老头

导航

【转】Caffe细节知识整理

1.caffe中的solver.prototxt的参数理解(详细请转到https://www.cnblogs.com/denny402/p/5074049.html

 1 net: "examples/mnist/lenet_train_test.prototxt"
 2 test_iter: 100
 3 test_interval: 500
 4 base_lr: 0.01
 5 momentum: 0.9
 6 type: SGD
 7 weight_decay: 0.0005
 8 lr_policy: "inv"
 9 gamma: 0.0001
10 power: 0.75
11 display: 100
12 max_iter: 20000
13 snapshot: 5000
14 snapshot_prefix: "examples/mnist/lenet"
15 solver_mode: CPU

下面对其中的参数进行解释:

1 test_iter: 100

这个要与test layer中的batch_size结合起来理解。mnist数据中测试样本总数为10000,一次性执行全部数据效率很低,因此我们将测试数据分成几个批次来执行,每个批次的数量就是batch_size。假设我们设置batch_size为100,则需要迭代100次才能将10000个数据全部执行完。因此test_iter设置为100。执行完一次全部数据,称之为一个epoch。(当然test_iter也可以小于100,这样只是没有执行全部的数据而已。)

1 test_interval: 500

测试间隔。也就是每训练500次,才进行一次测试。

2.数据预处理

图像数据转换成db(leveldb/lmdb)文件:转链接http://www.cnblogs.com/denny402/p/5082341.html

均值处理:一般caffe程序都是先将图片转换成lmdb文件,但这样做有点麻烦,可以直接用原始图片进行操作,所不同的就是直接用图片操作,均值很难计算,因此可以不减均值。

 

3.Concat层解析

Concat层的作用就是将两个及以上的特征图按照在channel或num维度上进行拼接,并没有eltwise层的运算操作,举个例子,如果说是在channel维度上进行拼接conv_9和deconv_9的话,首先除了channel维度可以不一样,其余维度必须一致(也就是num、H、W一致),这时候所做的操作仅仅是conv_9 的channel k1加上deconv_9的channel k2,Concat 层输出的blob可表示为:N*(k1+k2)*H*W。通常情况下,考虑到Concat是希望将同大小的特征图拼接起来,那为什么会产生同大小的特征图呢?显然离不开上采样和下采样的操作,接下来,以Caffe为例,介绍一下这两种拼接的方式,如下:

  • 选择axis=0,表示在num维度上进行拼接,可表示为:(k1+k2)*C*H*W;
  • 选择axis=1,表示在channel维度上进行拼接,可表示为:N*(k1+k2)*H*W。

目前我见过的大都是在channel维度上进行拼接,其实也容易想到,因为我们说feature map 的num是minibatch的图片数目,比方我们的batch是32,但是我们有4张显卡同时训练,显然minibatch等于8,这个8表示的是每张显卡一次性处理的图片数目,这么说来,如果在num维度上拼接的意思就是将同一张显卡处理的feature map数目重复的加倍了,当然由于上下采样并不是严格的互逆运算,所以在重复的特征图上像素值还是存在差异。反之,如果是在channel 维度上拼接,此时channel 的数量增加了,也就是说同一个大小的特征图有了更多的特征表示,很多论文都已经证实其可以提高检测性能,但是如果不是cancat的方式,而是增加原有的卷积层的channel数目会导致显存占用增加,速度下降,这样一来concat的方式在不失速度的前提下,提高了精度,这也是其主要的贡献。

总结:concat层多用于利用不同尺度特征图的语义信息,将其以增加channel的方式实现较好的性能,但往往应该在BN之后再concat才会发挥它的作用,而在num维度的拼接较多使用在多任务问题上。

 

4.next

posted on 2018-02-28 19:39  王老头  阅读(153)  评论(0)    收藏  举报