一、finetune命令:
mpirun /home/zhangsuosheng/caffe_mpi/build/tools/caffe train -solver solver.prototxt -gpu all -weights ShuffleNet-0.25x-g3-highacc/model_head.bin
二、快照命令:
mpirun /home/zhangsuosheng/caffe_mpi/build/tools/caffe train -solver solver.prototxt -gpu all -snapshot snapshot/_iter_41000.solverstate
三、待修改:
1、train.prototxt中
train的input层:
train的input路径,包括图片的prefix和train.txt的绝对路径;train的batch_size
test的input层:
test的input路径,包括图片的prefix和test.txt的绝对路径;test的batch_size
2、solver.prototxt中
train.prototxt的路径(net)
test的迭代次数(test_iter)
训练多少代测试一次(test_interval)(测试一次将用完所有测试数据,所需测试数据数=test_iter*测试的batch_size)
训练多少代保存一次快照(snapshot)
snapshot的存储路径(snapshot_prefix)
四、技巧
snapot实际与.bin一样,都是参数文件
如果网络变了bin文件是要变的。
但是我们在使用一些net时,例如googlenet、resnet、shufflenet,
我们不太会修改这些net结构,而是对输入以及其后面的一些层做改动,因此训练的时候是可以直接使用finetune参数的
分成多个branch
每个branch对应一个输入,使用一个net(例如googlenet shufflenet),产生一个feature
然后可以做多种尝试,例如讲feature加起来后面接一个fc,也可以每个feature单独处理
五、各层
1、silence层:
假如有某一层的某个top后面没有bottom,caffe训练的时候就会把这些top的结果都print出来,用Silence layer就是为了把接住以防止它print
例如:
通过修改网络将原来的多个分支改成了只有一个分支(head),但是但是因为label数据还是所有的,所以需要将不需要的label输入到silence,否则就会想上图这样print出来,很难看,因此加一个silence layer屏蔽掉label_eye_lo和label_eye_la
layer { name: "slice" type: "Slice" bottom: "label" top: "label_head_lo" top: "label_head_la" top: "label_eye_lo" top: "label_eye_la" slice_param { axis: 1 slice_point: 1 slice_point: 2 slice_point: 3 } } layer { name: "silence_eye" type: "Silence" bottom: "label_eye_lo" bottom: "label_eye_la" }
2、slice层:
切片,例如某一层读入了多个branch的标签,则可以在后面跟一个slice层,切片后得到所需的标签,然后与output层做差得loss层
3、bn层:batch normalization
传统的神经网络,只是在将样本输入输入层之前进行标准化处理(减均值,除标准差),以降低样本间的差异性。BN是在此基础上,不仅仅只对输入层的输入数据进行标准化,还对隐藏层的输入进行标准化。
https://blog.csdn.net/whitesilence/article/details/75667002
https://arxiv.org/pdf/1502.03167.pdf
lr_mult为学习率因子
decay_mult为衰减因子
4、inner_proudct层(内积层,其实就是全连接层)
https://www.cnblogs.com/dupuleng/articles/4312149.html
5、Eltwise 层(Eltwise层的操作有三个:product(点乘), sum(相加减) 和 max(取大值),其中sum是默认操作。)
例如实现A-B
layer { name: "eltwise_layer" type: "Eltwise" bottom: "A" bottom: "B" top: "diff" eltwise_param { operation: SUM coeff: 1 coeff: -1 } }
https://www.cnblogs.com/kunyuanjushi/p/5937177.html
六、注意事项
注意shufflenet与shuffle的区别
shuffle指的是乱序操作,一般我们在处理数据的时候会用到,在数据增强,生成input文件(输入图片url,标签)之后进行shuffle,然后将shuffle后的input文件输入网络
python shuffle数据集:
https://blog.csdn.net/orangefly0214/article/details/80352310
一个层可以输出给多个层
一个层也可以接受多个层的输入
但是
1个bottom只能对应1个top
1个top只能对应0个或1个bottom(如果对应0个则会输出出来)
/build/tools/caffe与caffe.cpp源文件:
https://blog.csdn.net/teeyohuang/article/details/76778593