华为的海思平台有一套自己的深度学习推理框架nnie,可实现在边缘端硬件实现深度学习模型的部署,一般的部署套路是从训练框架的模型转到onnx模型,再转到caffe模型,然后由caffe模型转到nnie的wk模型。由于nnie所支持的算子列表有限,经常会发生caffe->nnie转换过程中报错的现象。笔者在此整理了在转换过程中遇到的一些不支持的op的情况,以及解决方案。
1.关于全局平均(最大)池化操作,nnie中对池化层的核尺寸有一个限制,kernel<2048/(w/(16*stride_w)stride_w)。
解决办法:采用多次平均池化的方法,代替全局平均池化。
例如:我想实现一个234310尺寸的特征图的全局池化
正常的caffe中的prototxt:
layer {
name: "GlobalAveragePool_12"
type: "Pooling"
bottom: "107"
top: "108"
pooling_param {
pool: AVE
global_pooling: true
}
}
修改后的prototxt:
layer {
name: "GlobalAveragePool_12"
type: "Pooling"
bottom: "107"
top: "107_pool"
pooling_param {
pool: AVE
kernel_h:13
stride_h:13
kernel_w:31
stride_w:31
}
}
layer {
name: "GlobalAveragePool_12_1"
type: "Pooling"
bottom: "107_pool"
top: "108"
pooling_param {
pool: AVE
kernel_h:18
stride_h:1
kernel_w:10
stride_w:1
}
}
然后重新保存caffemodel,在进行caffe->nnie就能执行推理。
码字不易,如果觉得文章有用的话,请赞赏支持下!