【转】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