本系列为华为海思海思AI芯片(Hi3519A/3559A)方案学习系列之二十五,系列文章请关注海思AI芯片方案学习。
作者:ltshan139
前言
当模型量化出现错误或警告时,在排除掉Ruyistudio(一般没有问题)后,可能要检查下caffe model本身的权值参数有什么问题没。
检查caffe model权值的方式
在转换wk前,需要选择log level为Function level,如下所示。
这样,转换wk结束后 就会在xx\HiSVP_PC_Vxxx\software\sample_simulator下面产生两个文件夹目录:
浅析mapper_param
svp开发指南说的很清楚,mapper_param里面内容就是caffe model本身的参数。如下所示
这里只贴出两个卷积层的参数的部分。看到没,它将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的选项在控制,如下所示。
训练的prototxt中要设置use_global_stats为false来对均值和方差进行迭代更新;而推理时则要设成true来使用caffe model里面带的最终值。
layer1-conv_blob0_weight.float则是卷积层的权值,其个数等于 filters_numfilter_widthfilter_height*channels,显然其权值类型为32位浮点数。
layer1-scale_blob0_weight.float则是bn层的scale参数。
layer1-scale_blob1_bias.float为bn层的shift参数。
了解完这些概念后,大家就可以对那些有疑问的层去看其对应的参数值有什么异样? 比如说,如果全为0,那么可能就不正确。
初步认识mapper_quant
该目录内容如上图例所示,没有bn层的信息,只有每个卷积层的输入值(反量化、量化两种类型) ,输出量化值以及权值(量化和反量化值)。 关于卷积层的输入输出值使用后续的文章会介绍到。 这里重点谈谈权值。
我们可以将卷积层的反量化值和mapper_quant里面对应卷积层的浮点权值进行比较,正常来讲,两者应该不大。如果相差较大,那说明量化工具有问题。一般地,这种情况很少见。
小结
上面介绍关于mapper_quant和mapper_param的使用,一般适合已经明显直到哪些层在量化时有问题,需要进一步检查这些层的权值参数有什么特点,有必要的话还可能要检查模型训练方面是否有问题。 最后提醒一点,由于深度神经网络一般有几十甚至上百层,所以如果事先不知道哪些层可能有问题的话,逐层逐层去比较的话可能效率不高,这时该怎么办,下篇博客再讲。
海思AI芯片系列文章
- 海思AI芯片(Hi3519A/3559A)方案学习(二十四)如何直接对yuv图片进行目标检测
- 海思AI芯片方案学习(二十三)nnie上进行图像数据预处理(Normalize)的五种方式
- 海思AI芯片方案学习(二十二)如何在ubuntu18.0.4上跑通nnie mapper
更多海思AI芯片方案学习笔记欢迎关注海思AI芯片方案学习。