近几年随着人工智能技术发展,深度学习技术日趋成熟。如果想把已经训练好的模型应用在终端,如手机、车载、耳机、音箱等设备,需要将Python训练的模型转为C语言。此处就不赘述如何把Python模型转C语言的步骤了(都是矩阵乘l累加操作)。

本文意在通俗讲解一下C语言的浮点版本转定点版本的步骤。让初次接触量化(定点化)操作的小白能够有个初步认识,都是个人经验,如有表述不对还请多多指正。

废话不多说,让我们开始吧!!!!

众所周知,C语言在使用变量前都要先定义其类型(float,double,char,int,long等),如果想表示两个浮点数相乘,可以如下操作:

#include<stdio.h>
int main(){float num1 = 3.141592;float num2 = 1.492;float num3 = 7.24;float result;result = num1 * num2 + num3;printf("%f * %f + %f = %f;\n",num1, num2, num3, result);return 0;
}

以上代码的输出是3.141592 * 1.492000 + 7.240000 = 11.927256;

但是两个浮点数操作会比较耗费时钟周期数,这就导致功耗变高,甚至有些低功耗芯片上不支持浮点操作,我们就需要将其转化为定点版本。那我们该如何下手呢,接下来就讲一下具体操作步骤。

一、确定使用多少位的操作数来表示浮点

C语言的整型表示有8位(char),16位(short),32位(int),64位(long)等,如何选择多少位来表示浮点数取决于你所需的精度是多少。一般来说16位是比较合适的。具体的误差在后续会讲到。

二、对操作数定标

所谓的定标就是将浮点数乘以2的多少次方才能让数据最大的同时还不超过数据的表示范围。比如short表示的范围是-32768~32767,以num1为例,

int(3.141592 * (2^13)) = 25735 //此处我们是直接截断取整,也可以四舍五入,向上、下取整

int(3.141592 * (2^14)) = 51471

51471超出了short的表示范围,但是25735却没有超过表示范围,所以num1的标值Q1就选择13最为合适。同理可得num2的标值Q2选择14,num3的标值Q3选择12。

这样我们就得到了定点的num1, num2和num3:

num1_fix = 25735, num2_fix = 24444, num3_fix = 29655;

三、对定点后的三个数进行乘、加操作

#include<stdio.h>
#include<stdint.h>
include<math.h>
int main(){
float num1 = 3.141592;float num2 = 1.492;float num3 = 7.24;short Q1 = 13, Q2 = 14, Q3 = 12;short num1_fix, num2_fix, num3_fix;int32_t result_fix;float result;result = num1 * num2 + num3;printf("%f * %f + %f = %f;\n",num1, num2, num3, result);num1_fix = (short)(num1 * pow(2,Q1));num2_fix = (short)(num2 * pow(2,Q2));num3_fix = (short)(num3 * pow(2,Q3));result_fix = (int32_t)num1_fix * (int32_t)num2_fix;//此时result_fix的标值是两个的数标值的和,即Q1+Q2result_fix = result_fix >> (Q1+Q2-Q3);//右移n位是除以2^n,为了让num1和num2成完以后的标值和num3对应result_fix = result_fix + (int32_t)num3_fix;printf("%d * %d + %d = %d;\n",num1_fix, num2_fix, num3_fix, result_fix);printf("%d / pow(2,%d) = %f\n",result_fix,Q3,(float)result_fix /pow(2,Q3));return 0;
}

以上代码的输出为:

3.141592 * 1.492000 + 7.240000 = 11.927256;
25735 * 24444 + 29655 = 48852;
48852 / pow(2,12) = 11.926758

此时对上述代码重点描述的是num1_fix*num2_fix后结果的Q值是Q1+Q2,相乘(相除)时两个数的标值不要求相同,但要记得乘完以后的结果的标值已改变,变为了Q1+Q2。但是两个定点数相加(相减)时的Q值必须要求一致,否则会出错。这就是为什么在加num3_fix之前要对result_fix进行移位的原因,为了将两个数的标值对其(标值只要一样就行,也可以不等于Q1,Q2,Q3任意一个,但是自己要清楚此时的标值),最终得到的结果是浮点结果*最终标值的数Q。将这个数除以对应的2^Q就是浮点的结果。

根据程序的输出结果可以看出,定点版本和浮点版本最终的结果误差为

abs(11.926758 - 11.927256)  = 0.000498 = 4.98*1e-4

误差可接受。到此浮点转定点的小实例已经讲解完毕,希望对你有用,谢谢~

通俗易懂的讲解一下量化操作(深度学习模型定点化)相关推荐

  1. 除了网络搜索(NAS),AutoML对深度学习模型优化还有哪些贡献?

    文/编辑 | 言有三 自从Google提出AutoML技术以来,已经过去了好几年了,如今在学术界和工业界都是热点.AutoML在网络结构的搜索上已经取得了非常多的突破,相关的文章,技术博客都已经广为流 ...

  2. 【小结】除了网络搜索(NAS),AutoML对深度学习模型优化还有哪些贡献?

    文/编辑 | 言有三 自从Google提出AutoML技术以来,已经过去了好几年了,如今在学术界和工业界都是热点.AutoML在网络结构的搜索上已经取得了非常多的突破,相关的文章,技术博客都已经广为流 ...

  3. 【金融量化】深度学习在金融中的研究热点以及应用

    写在前面 下面这篇文章的内容主要参考2020年最新发表的一篇综述论文:<Deep Learning for Financial Applications : A Survey>.这篇论文主 ...

  4. 深度学习模型实战-深度学习模型在各大公司实际生产环境的应用讲解文章

    仓库地址:https://github.com/DA-southampton/Tech_Aarticle/edit/master/README.md 建这个仓库的是因为工作之后发现生产环境中应用的模型 ...

  5. 深度学习模型压缩与加速技术(二):参数量化

    目录 总结 参数量化 参数量化定义 参数量化特点 1.二值化 二值化权重 二值化权重与激活函数 2.三值化 3.聚类量化 4.混合位宽 手工固定 自主确定 训练技巧 参考文献 深度学习模型的压缩和加速 ...

  6. 深度学习模型量化(低精度推理)大总结

    模型量化作为一种能够有效减少模型大小,加速深度学习推理的优化技术,已经得到了学术界和工业界的广泛研究和应用.模型量化有 8/4/2/1 bit等,本文主要讨论目前相对比较成熟的 8-bit 低精度推理 ...

  7. 判断深度学习模型的稳定性_人工智能干货|一线工程师带你学习深度学习模型量化理论+实践...

    2019年的最后一天,送给自己一份特殊的礼物. 模型量化作为一种能够有效减少模型大小,加速深度学习推理的优化技术,已经得到了学术界和工业界的广泛研究和应用.模型量化有 8/4/2/1 bit等,本文主 ...

  8. CUDA上深度学习模型量化的自动化优化

    CUDA上深度学习模型量化的自动化优化 深度学习已成功应用于各种任务.在诸如自动驾驶汽车推理之类的实时场景中,模型的推理速度至关重要.网络量化是加速深度学习模型的有效方法.在量化模型中,数据和模型参数 ...

  9. CUDA上的量化深度学习模型的自动化优化

    CUDA上的量化深度学习模型的自动化优化 深度学习已成功应用于各种任务.在诸如自动驾驶汽车推理之类的实时场景中,模型的推理速度至关重要.网络量化是加速深度学习模型的有效方法.在量化模型中,数据和模型参 ...

最新文章

  1. 版本信息文件、虚拟环境创建
  2. 使用HttpHandler实现图片防盗链
  3. Form学习入门系列(一)
  4. 【收藏备用】服务器基本故障及排查方法
  5. 数据存储之 SQLite 数据库操作(二)
  6. 组态王能直接读取仪表数据吗_液晶多功能网络电力仪表PD800H
  7. SGCheck:一个实验堆栈和全局数组溢出检测器
  8. python网页调用摄像头_Python调用摄像头
  9. 零基础编译ffmpeg到wasm
  10. 1.1.15 word调整文字与下划线之间的间距
  11. 条形码和二维码的原理简介
  12. vue 下载插件downloadjs
  13. 力扣(leetcode)67. 二进制求和——c语言新手入门
  14. mac教程:重置苹果Mac上的NVRAM或PRAM?
  15. *****DOS·FOR·语句·学习·指南*****
  16. 济南86公里综合管廊,CBD近万地下车位已建成
  17. 教程:GIMP中怎样移动选区
  18. Java基础第一讲:Java的故事和Java编程环境搭建
  19. Git详解之六:Git工具
  20. 视频监控客户端开发(IP Camera)总结

热门文章

  1. 计算机速录比赛主题,弘扬汉字,全国输入法表演赛电脑输入法比赛组速录表演组的报名...
  2. 会计里的借方和贷方是什么意思
  3. 基于阿里云的OSS文件上传和下载
  4. 如何测试网络最薄弱的环节-设备跳线
  5. 【课堂笔记】AE文字特效
  6. 文档词频矩阵_如何通过词向量技术来计算 2 个文档的相似度?
  7. 东南大学计算机硕士培养方案,东南大学计算机技术专业学位培养方案修改后.doc...
  8. OpenGL 关于平面树的一点点理解
  9. PMSG并网直流微网 外环采用电压环,稳定直流母线电压,电流采用电流环
  10. 英语口语233之每日十句口语