use_global_stats: true 表示使用预训练模型内的BatchNorm层均值与方差参数,而非基于当前batch内计算均值和方差,若是从头训练则必须设置为false(caffe默认是设置false,可不手动设置), 若是finetuning则根据情况设置。
2. LOSS层参数 loss_weight
loss_weight表示当前loss层的权重,默认设置为1,当有多个loss层的时候可根据需要调整。
3. caffe输出.caffemodel里保存的参数
NetParameter proto; ReadProtoFromBinaryFile("path to your .caffemodel", &proto); WriteProtoToTextFile(proto, "path to output .caffemodel.txt");
4. caffe读取模型保存的参数并赋值给另一个网络的同名层
在已有模型基础上构建自己模型的时候,有些层的参数想直接复用原来的,有两种办法:第一种就直接修改由以上第三条得到的模型txt文件,将参数拷贝过去,数据量比较大,可以按照对应格式写个脚本拷贝(该方法还可以将其他如tensorflow等的模型参数转成caffe的,当然要注意的地方很多);第二种办法是调caffe的库去赋值,该办法很简单,只需要知道所需层的name即可,代码如下:
deploy_path="origin_model_deploy.prototxt" model_path="origin_model.caffemodel" new_deploy_path = "new_model_deploy.prototxt" new_model_path = "new_model.caffemodel" def transModel(): net = caffe.Net(deploy_path, model_path, caffe.TEST) new_net = caffe.Net(new_deploy_path, new_model_path, caffe.TEST) # 所需层的name,此处以卷积层为例 conv_params = ['conv1/7x7_s2','conv2/3x3_reduce','conv2/3x3'] # copy conv layers' params for pr in conv_params: new_net.params[pr][0].data[...] = net.params[pr][0].data[...]; #new_net.params[pr][1].data[...] = net.params[pr][1].data[...]; # 如果有多个data new_net.save('new_model_inherit.caffemodel') transModel()