Caffe 转SNPE dlc格式之Flatten、Reshape、Permute层的使用
snpe1.4.0中支持了flatten,reshape和permute的实现。但是snpe和caffe之间的数据存储次序不同,导致这些层不能直接应用。snpe为支持这部分的操作,增加了隐含层(implicit layer)。当网络中需要隐含层时将自动添加隐含层使网络输入输出维数对应。接下来说明flatten、reshape和permute在snpe中的实现。
permute层需要更改一个小问题
在编译permute层时报错:没有ssd_permute_params这个选项。
解决方法:查看文档~/snpe-1.4.0/lib/python/snpe/snpe_caffe_to_dlc.py
, 找到这一句:permute_param = layer.ssd_permute_param
, 原因是与caffe prototxt中名称不对应。将其改为:permute_param = layer.permute_param
,编译就可以通过了。
Flatten,Reshape和permute单层使用
1. Flatten在snpe中的网络结构变化:
在进行flateen之前,调用了一层隐含permute层。
—->4×4×50—-pool2_permute(permute_order[2, 0, 1])—->50×4×4—-flat—>800
2. Reshape在snpe中的网络结构变化:
在调用reshape之前和之后各调用了一层隐含permute层。前面添加一个permute: [2, 0, 1], 后面添加一个permute: [1, 2, 0].
3. Permute在snpe中的网络结构变化:
permute层前后没有调用隐含层,将对数据通道的改变集成在了一层。有时候,permute层会在后面加一层隐含层。但是对于数据的计算是相同的。
perm:[0 2 3 1], 只有这种情况没有添加[1 2 0]这一层。但是结果是相同的
perm:[0 3 2 1], 后面自动添加一层[1 2 0]
perm: [0 3 2 1] —->permute_order: [1 0 2] + [1 2 0]
perm: [0 3 1 2] —->permute_order: [1 2 0] + [1 2 0]
perm: [0 2 1 3] —->permute_order: [0 2 1] + [1 2 0]
perm: [0 2 3 1] —->permute_order: [1 2 0]
perm: [0 1 2 3] —->permute_order: [2 0 1] + [1 2 0]
perm: [0 1 3 2] —->permute_order: [2 1 0] + [1 2 0]
Flatten,Reshape和permute组合使用
1. permute+reshape
通过在最上层添加一个自动permute层([2, 0, 1])与定义permute层合为一层最终为[1, 0, 2],reshape层后面添加一层permute层[1, 2, 0]。 实现与caffe相同的功能。
2. reshape+permute或者 reshape+permute+permute
这里定义permute层的隐含permute层融为一层。reshape之后的permute层不调用隐含层,但是输出结果有问题。permute层的order为[0, 3, 1, 2],结果不对应. 并且改变permute的oder,结果不变均为[1 2 0]
reshape:50×4×4—->permute :[0, 3, 2, 1]—>permute: [0, 2, 3, 1], 输出是 4×4*50?
3.mnist: permute+flatten
perm之后不返回原 h w n的格式
perm: [0 3 2 1] —->permute_order: [1 0 2] + flat
perm: [0 3 1 2] —->permute_order: [1 2 0] + flat
perm: [0 2 1 3] —->permute_order: [0 2 1] + flat
perm: [0 1 2 3] —->permute_order: [2 0 1] + flat
perm: [0 1 3 2] —->permute_order: [2 1 0] + flat
perm: [0 3 2 1]
perm:[0 2 1 3]
perm: [0 2 3 1] —->没有permute层
验证了一个事实: caffe perm + flat之后的结果:caffe 与snpe相同
4. SSD: permute+flatten+reshape+flat
与caffe实现功能相同,在不需要permute时会自动消除
网络结构如下:
分析fc7,loc–>loc_perm–>loc_flat过程, caffe_perm: [0 2 3 1] 。 其他层与之类似
分析fc7_conf, conf–>conf_perm–>conf_flat–>conf(concat)–>conf_reshape–>softmax–>conf_flat
编译的一个bug:
RuntimeWarning: error_code=802; error_message=Layer parameter value is invalid in GPU. Layer conv4_3_norm_mbox_conf_flat: output width (packed) = 22743 exceeds maximum image width 16384 for Adreno A530; error_component=GPU Runtime; line_no=311; thread_id=139801178887936
需要减少数据输出个数