海思AI芯片(Hi3519A/3559A)方案学习(二十五)初识 mapper_quant 和mapper_param

前言

当模型量化出现错误或警告时,在排除掉Ruyistudio(一般没有问题)后,可能要检查下caffe model本身的权值参数有什么问题没。

检查caffe model权值的方式

在转换wk前,需要选择log level为Function level,如下所示。

海思AI芯片(Hi3519A/3559A)方案学习(二十五)初识 mapper_quant 和mapper_param_第1张图片

这样,转换wk结束后 就会在xx\HiSVP_PC_Vxxx\software\sample_simulator下面产生两个文件夹目录:

浅析mapper_param 

svp开发指南说的很清楚,mapper_param里面内容就是caffe model本身的参数。如下所示

海思AI芯片(Hi3519A/3559A)方案学习(二十五)初识 mapper_quant 和mapper_param_第2张图片

这里只贴出两个卷积层的参数的部分。看到没,它将caffe model这么一个上百兆的binary文件提取到各个层上来。这样的话,就有利于我们能逐层的查看每一层的权值。

当然要看懂这些,需要些caffe框架和多层通道卷积操作等知识。 我们就以layer1为例来逐个解释下每个文件的内容。

layer1-bn_blob0是指卷积层输出值的均值,每一个filter对应一个值,换句话说,多少个filters对应就有多少个均值。

layer1-bn_blob1是指卷积层输出值的方差,也是每一个filter对应一个值。

layer1-bn_blob2里面只含一个等于1值。所有层的bn_blob2都如此。

在batch normalization这一层,每训练一个batch,都要update一次上面的均值和方差。训练结束后最终的均值和方差就保存下来了。 然后在推理时,就直接用这些均值和方差进行计算。 在caffe的prototxt中,有一个叫use_global_stats的选项在控制,如下所示。

海思AI芯片(Hi3519A/3559A)方案学习(二十五)初识 mapper_quant 和mapper_param_第3张图片

训练的prototxt中要设置use_global_stats为false来对均值和方差进行迭代更新;而推理时则要设成true来使用caffe model里面带的最终值。

layer1-conv_blob0_weight.float则是卷积层的权值,其个数等于 filters_num*filter_width*filter_height*channels,显然其权值类型为32位浮点数。

layer1-scale_blob0_weight.float则是bn层的scale参数。

layer1-scale_blob1_bias.float为bn层的shift参数。

了解完这些概念后,大家就可以对那些有疑问的层去看其对应的参数值有什么异样? 比如说,如果全为0,那么可能就不正确。

初步认识mapper_quant

海思AI芯片(Hi3519A/3559A)方案学习(二十五)初识 mapper_quant 和mapper_param_第4张图片

该目录内容如上图例所示,没有bn层的信息,只有每个卷积层的输入值(反量化、量化两种类型) ,输出量化值以及权值(量化和反量化值)。 关于卷积层的输入输出值使用后续的文章会介绍到。 这里重点谈谈权值。

我们可以将卷积层的反量化值和mapper_quant里面对应卷积层的浮点权值进行比较,正常来讲,两者应该不大。如果相差较大,那说明量化工具有问题。一般地,这种情况很少见。

小结

上面介绍关于mapper_quant和mapper_param的使用,一般适合已经明显直到哪些层在量化时有问题,需要进一步检查这些层的权值参数有什么特点,有必要的话还可能要检查模型训练方面是否有问题。  最后提醒一点,由于深度神经网络一般有几十甚至上百层,所以如果事先不知道哪些层可能有问题的话,逐层逐层去比较的话可能效率不高,这时该怎么办,下篇博客再讲。

 

你可能感兴趣的:(嵌入式AI,nnie,mapper,量化,卷积,BN)