开启辅助访问
 找回密码
 立即注册

手把手指导实例 MobileNet 224 训练

时间:2020-06-04 阅读:117 回复:0
     

67

主题

72

帖子

332

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
332
1 mobilenet 224示例
数据集imagenet6_224
提取码:zbcd
下载解压后将lmdb文件夹复制到train目录下。
MDK默认使用lmdb格式的数据训练。原始数据压缩成lmdb格式参考caffe-1.0/examples/imagenet下的create_imagenet.sh脚本。
1.1 训练完整的浮点模型
训练浮点模型使用train文件夹下的2803_mobilenet_224_train.prototxt
1.1.1 不带权重训练(建议带权重训练,容易收敛,见1.1.2
1)修改两个Data层的data_paramsource分别为lmdb文件夹中的train_lmdb_6_224val_lmdb_6_224路径;
2)确认fc7层的num_output6(类别数);
3)确认solver.prototxtnet2803_mobilenet_224_train.prototxt,其他参数可自定义,详细说明见附录;
train/ 终端执行以下命令:
/home/xxx/caffe-1.0/build/tools/caffe \
train \
--solver=solver.prototxt \
-gpu 0 2>&1 | tee log_float_mobilenet.log
注:若有nvidia GPU,并且编译caffe时,打开了USE_CUDNN,则须有:-gpu 0
若是只有CPU,并且是编译cpucaffe,则去掉:-gpu 0
1.1.2 带权重训练
我们提供了一个mobilenet224.caffemodel预训练权重,从以下链接下载:
提取码:ejuf  
1)修改两个Data层的data_paramsource分别为lmdb文件夹中的train_lmdb_6_224val_lmdb_6_224路径;
2)修改fc7层的num_output6(类别数);
3)确认solver.prototxtnet2803_mobilenet_224_train.prototxt,其他参数可自定义,详细说明见附录,推荐base_lr设置为0.0001
train/ 终端执行以下命令:
/home/xxx/caffe-1.0/build/tools/caffe \
train \
--solver=solver.prototxt \
--weights=mobilenet224.caffemodel \
-gpu 0 2>&1 | tee log_float_mobilenet.log
注:--weights为上述下载到当前文件夹下的mobilenet224预训练权重。如果训练收敛不了,建议尝试再调低学习率。
1.2 使用GTI自定义量化卷积层进行微调
(假设snapshot_iter_20000.caffemodel为步骤7.1.1生成的最好精度的caffemodel
1)修改2803_mobilenet_224_train.prototxt每个Quantconvolution层中的coef_precisionDYNAMIC_FIXED_POINT,并重命名为2803_mobilenet_224_quantConv_train.prototxt
2)修改solver.prototxtnet2803_mobilenet_224_quantConv_train.prototxt,推荐base_lr设置为0.001
train/ 终端执行以下命令:
/home/xxx/caffe-1.0/build/tools/caffe \
train \
--solver=solver.prototxt \
--weights=./snapshot/snapshot_iter_20000.caffemodel \
-gpu 0 2>&1 | tee log_quantConv_mobilenet.log
1.3 使用GTI自定义量化激活层进行微调
(假设snapshot_iter_10000.caffemodel为步骤7.1.2生成的最好精度的caffemodel
若使用的是cpucaffe,则需要将CalibrateQuantReLU.py中的 caffe.set_mode_gpu()改为caffe.set_mode_cpu()
1) train/scripts/ 找到CalibrateQuantReLU.py,修改123行以及124行,如下:
123 prototxt=../2803_mobilenet_224_quantConv_train.prototxt
124 affemodel=../snapshot/snapshot_iter_10000.caffemodel
2)执行以下命令:
python CalibrateQuantReLU.py \
train目录下会生成2803_mobilenet_224_quantConv_train_QuantReLU.prototxt,在snapshot目录下生成snapshot_iter_10000_QuantReLU.caffemodel
2确保2803_mobilenet_224_quantConv_train_QuantReLU.prototxt每个QuantReLU层中的quant_enabletrue
3)修改solver.prototxtnet为上述生成的2803_mobilenet_224_quantConv_train_QuantReLU.prototxt推荐base_lr设置为0.0001
train/ 终端执行以下命令:
/home/xxx/caffe-1.0/build/tools/caffe \
train \
--solver=solver.prototxt \
--weights=./scripts/QuantReLU/snapshot_iter_10000_QuantReLU.caffemodel \
-gpu 0 2>&1 | tee log_QuantReLU_mobilenet.log
1.4 对步骤1.3执行线性变换后的模型进一步微调
(假设snapshot_iter_15000.caffemodel为步骤1.3生成的最好精度的caffemodel
若使用的是cpucaffe,则需要将RefineNetwork.py中的caffe.set_mode_gpu()改为caffe.set_mode_cpu()
1)在 train/scripts/ 找到CalibrateQuantReLU.py,修改251行以及252行,如下:
251 prototxt=../2803_mobilenet_224_quantConv_train_QuantReLU.prototxt
252 affemodel=../snapshot/snapshot_iter_15000.caffemodel
2)执行以下命令:
python RefineNetwork.py \
当前目录下会生成net_refined.prototxtnet_refined.caffemodel
3)确保net_refined.prototxt每个Quantconvolution层中的shift_enabletrue;
file:///C:/Users/yunch/AppData/Local/Temp/ksohtml/wpsA391.tmp.png注:如果芯片出来的结果需要继续传到后面非芯片计算层进行计算,需要在芯片出结果的层和下一层中间添加一个scale层,其值恒定为第三步训练出来的model中芯片出结果那一层对应relu层的值除以31
layer {
  name: "scale_conv12/dw"
  type: "Scale"
  bottom: "conv12/dw"
  top: "scale_conv12/dw"
  param {
    lr_mult: 0
    decay_mult: 0.0
  }
  scale_param {
    filler {
file:///C:/Users/yunch/AppData/Local/Temp/ksohtml/wpsA392.tmp.png      value: 1.0   # 1.0 is example, please use QuantReLU_Value_Of_conv12_dw/31.0
    }
    bias_term: false
  }
}
4)修改solver.prototxtnet为上述生成的net_refined.prototxt,推荐base_lr设置为0.00001
train/ 终端执行以下命令:
/home/xxx/caffe-1.0/build/tools/caffe \
train \
--solver=solver.prototxt \
--weights=../scripts/Refined/snapshot_iter_15000_refined.caffemodel \
-gpu 0 2>&1 | tee log_refined_mobilenet.log
1.5模型转换
(假设snapshot_iter_25000.caffemodel为步骤1.4生成的最好精度caffemodel
1)net_refined.prototxt头部的两个Data层删除,以及删除尾部的SoftmaxWithLoss层和Accuracy层。再将train目录下2803_mobilenet224_float_deploy.prototxtInput层以及Softmax层分别添加到头部和尾部,并另存为2803_mobilenet_224_quantConv_QuantReLU_refined_deploy.prototxt
           注:详细可参考mobilenet224_float_deploy.prototxt结构
2)修改conversion_tool/network_examples/2803/fullmodel_def2803_mnet_224_template.json”name” fcsoftmaxoutput channels6(类别数)
3)conversion_tool/目录下新建mobilenet224文件夹,并将1)中保存的2803_mobilenet224_quantConv_QuantReLU_refined_deploy.prototxtsnapshot_iter_25000.caffemodel,以及提供数据集中的labels.txt复制到mobilenet224文件夹中。
4)预先对conversion_tool文件夹赋权限,执行:
sudo chmod 777 -R conversion_tool/
conversion_tool/下终端执行以下命令:
python convert.py \
mobilenet224/2803_mobilenet224_quantConv_QuantReLU_refined_deploy.prototxt \
mobilenet224/snapshot_iter_25000.caffemodel \
network_examples/2803/network2803_mnet_224_template.json \
network_examples/2803/fullmodel_def2803_mnet_224_template.json \
mobilenet224/labels.txt
注:labels.txt为上述提供数据集对应的labels.txt, 不同数据集labels.txt不同。
最终在conversion_tool/下生成output文件夹,以及相关文件。如有错误请查看log.txt文件。

回复
使用道具 举报
快速回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

反馈意见:guohong.chen@searegal.com

客服电话:181-2986-7807

客服QQ:463716093

关注我们
登录 发布 快速回复 返回顶部 返回列表