Caffe 转SNPE dlc格式之Flatten、Reshape、Permute层的使用

来源:互联网 发布:java管理系统有哪些 编辑:程序博客网 时间:2024/06/07 22:32

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
5 6层为flat层的实现

2. Reshape在snpe中的网络结构变化:

在调用reshape之前和之后各调用了一层隐含permute层。前面添加一个permute: [2, 0, 1], 后面添加一个permute: [1, 2, 0].
5 6 7层为reshape的实现

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

需要减少数据输出个数

原创粉丝点击