文章目录

  • 背景
  • 任务
    • 浮点数是什么
    • 这里用的是定点数,咳咳
    • netron导出的卷积核数据处理为一列数据
      • 预处理浮点数的代码
    • 十进制浮点数预处理为二进制定点数
      • 补码+原码=2^n
      • 十进制浮点数预处理为二进制定点数代码
    • 关于CSDN直接复制粘贴会多回车

背景

前几天研究生学长给我了一个图像输入的txt,和LeNet的参数文件,让我写个卷积核。

LeNet.h5打开方式:
netron
netron网页版

目前是做的AI推断加速,并非AI训练。

对cnn不了解的可以看看这个:LeNet-5详解

任务

我第一件事情是将这两个数据从定点数转化为二进制数,然后将这两个数据作为 coe文件导入BRAM ip核中。

浮点数是什么

但是我发现我好像不会浮点数了,哭。十进制浮点数转成二进制(IEEE 754 在线计算器)

对于float单精度来说,32bit=1bit符号位+8bit(有符号指数位 -128-127)+23bit(数据)

我们需要将十进制的数转变为二进制的数,然后都表示成 1.xxx*2^n 的形式,只需要记录xxx即可,因此23bit可以表示24bit。

浮点数精度: 我们知道9的二进制表示为1001,所以4bit能精确十进制中的1位小数点,24bit就能使float能精确到十进制小数点后6位。

这里用的是定点数,咳咳

后来才知道定点数就可以了,定点数一共16bit(自己设定即可),1bit符号+15bit数据,小数点位置人为定义。

netron导出的卷积核数据处理为一列数据

从LeNet导出的数据里有[],\n等,需要修改为一列数据。

strip()函数只能对字符的首尾删减!

replace倒是蛮好用的。replace后要赋值给自己(s)才行!

s=s.replace('/n','').replace('[','').replace(']','').replace(' ','')

预处理浮点数的代码

因为卷积核参数是3x3x1x64(64个3x3的卷积核,但是直接去掉括号的话,得到的前64个数据为每个卷积核的第一个数据,所以需要转换才行。lenet_new_proc.txt是经过转换的文件,连续的9个数为一个卷积核的数据)


####### lenet数组转coe文件格式(一列),不包括定点数转二进制#################################################
import numpy as np
store_data = np.zeros( (64,9)) #9列,64行f = open('lenet.txt','r')
data = f.readlines()
# print(data)
new_data =[]
j = 0
for i in range(len(data)):row = int(j%64)#行column = int(j/64)#列j = j + 1# row = int(i % 64)  # 行# column = int(i / 64)  # 列new = str(data[i])new = new.replace('[','').replace(']','').replace(' ','').replace(',','').lstrip('\n')#先去除逗号if new == '':#某些行是空格,并没有处理掉j = j - 1# data.pop(i) #根据索引删除列表中的空格# i = i - 1print('空行')continuenew = new.replace('\n', ',\n') #恢复逗号,数组表示的时候,逗号位置和一列表示不对proc_new = new.strip(',\n')new_data.append(new)proc_new = float(proc_new)print(i,'行,列:',row,column,'data:',new,'proc_data',proc_new)store_data[row][column]= proc_new
# print(store_data)
# print(data)
# print(new_data)
np.savetxt("./store_data.v", store_data, fmt='%f', delimiter=',')p = open ('lenet_new.txt','w') #直接转换为一列,并不正确
for i in (new_data):p.write(i)fp = open('lenet_new_proc.txt', 'w')  # 正确的转换
for row in range(64):for column in range(9):data = store_data[row][column]data = str(data)+',\n'fp.write(data)
################################################################卷积核确定最大最小值,从而决定定点数 ################################################
p = open ('lenet_new.txt','r')
list=[]
for data in p.readlines():data=data.replace(',\n','')data=float(data) #str to floatlist.append(data)
# print(list)print('max',max(list))
print('min',min(list))

最后一段代码比较大小来确定位宽。一个数据的位宽取决于最大的数和要表示的最小的精度

十进制浮点数预处理为二进制定点数

补码+原码=2^n

一个n位数的补码加原码等于2的n次方 这个n包括符号位。 因此一个负数可以先加上2^n,表示补码。

十进制浮点数预处理为二进制定点数代码

bin()整型转二进制
rjust() 左边填充0到固定位数

ff = open('file_float.v','r')#待处理的数据
fc = open('file_binary.v','w')#处理完成的数据######定点数转二进制代码1  ##########################
def conInt(n):#整数部分s = bin( int(n) ).lstrip('0b')# print('整数', s)s = s.rjust(8, '0')  # 左补0s = str(s)[1:8]print('整数', s)return sdef conFra(n):#小数部分n = '0.'+str(n)n = (float(n)*2**8)#若取8bit小数print('小数', n)n = int(n) # 得到小数位,back =bin(n).lstrip('0b')back = back.rjust(8, '0')  # 左补0  这里必须左补0,因为整个小数左移了8bit,而整数部分多数没有8bit,所以需要补齐0# dec, less = str(n).split('.')  # 得到小数位,less表示剩下的,不用# back = bin(int(dec)).lstrip('0b')print('小数', back)# for _ in range(len(back), 8):#     back +='0'return backdef dec_bin(data):# n=eval(input())# data=6.06397055089473724# data = 6print('输入数据----------------------------------------',data)if data<0:sign_flag = '1'data = data + 2**8 #取补码等于+2^8次幂。8bit小数位  一个n位数的补码加原码等于2的n次方 这个n包括符号位else:sign_flag = '0'if type(data) == float:#小数a,b = str(data).split('.')# print('float!')else: #整数a = datab = '0'print('a',a,'b',b)out = sign_flag + str(conInt(a))+'.'+str(conFra(b))print('输出数据----------------------------------------',out)fc.write(sign_flag + str(conInt(a)) + str(conFra(b))+'\n')cnt=0
for data in ff.readlines():data_in = float(data.strip(',\n'))print(data_in)dec_bin(data_in)cnt += 1print('cnt',cnt)

关于CSDN直接复制粘贴会多回车

处理代码如下:

f = open('old.txt','r')
data = f.readlines()
print(data)
for i in (data):data.remove('\n')#remove删除list中与之匹配的第一个字符# print(data)p = open ('new.txt','w')
for i in (data):p.write(i)

AIIC学习日记-十进制浮点数预处理为二进制定点数相关推荐

  1. 十进制浮点数转成二进制(IEEE 754 在线计算器)

    IEEE 754 单精度浮点数转换 在线计算器 http://www.styb.cn/cms/ieee_754.php 十进制小数的二进制表示: 整数部分:除以2,取出余数,商继续除以2,直到得到0为 ...

  2. 十进制浮点数转化为二进制的Python代码

    十进制转化为二进制的逻辑: 1.整数部分: 如图所示,便是浮点数中十进制整数部分转化为二进制的逻辑 整数35,转化为二进制数为100011 2.小数部分 例如: 0.25的二进制: 0.252=0.5 ...

  3. 十进制浮点数转成二进制(IEEE 754 在线计算器)

    IEEE 754 单精度浮点数转换 在线计算器 http://www.styb.cn/cms/ieee_754.php 十进制小数的二进制表示: 整数部分:除以2,取出余数,商继续除以2,直到得到0为 ...

  4. 十进制浮点数的表示方法

    使用十进制浮点数,可以避免二进制浮点数与我们习惯的十进制数之间的表示误差.这个在金融领域是非常重要的.但是计算机基本都只能对二进制浮点数进行计算,也就是IEEE754格式表示的浮点数.很多程序都会自己 ...

  5. C语言十进制浮点数,十进制浮点数的表示方法

    使用十进制浮点数,可以避免二进制浮点数与我们习惯的十进制数之间的表示误差.这个在金融领域是非常重要的.但是计算机基本都只能对二进制浮点数进行计算,也就是IEEE754格式表示的浮点数.很多程序都会自己 ...

  6. matlab 二进制补码转十进制,MATLAB浮点数与定点二进制补码互转算法验证方案

    最近本人一直在学习ZYNQSOC的使用,目的是应对科研需要,做出通用的算法验证平台.大概思想是:ZYNQPS端负责与MATLAB等上位机数据分析与可视化软件交互:既可传输数据,也能通过上位机配置更新硬 ...

  7. CUMT学习日记——Verilog课程学习全记录

    CUMT学习日记--Verilog课程学习全记录 系列第一篇 计算机网络复习 系列第二篇 计算机组成原理复习 系列第三篇 微机原理与接口技术复习 系列第四篇 计算机操作系统复习 系列第五篇 数据库原理 ...

  8. RUST 学习日记 第8课 ——类型转换

    RUST 学习日记 第8课 --类型转换 0x00 回顾 上一节讲解了字面量和常见一些运算符,还记得上节课最后留了一个练习题吗. 小明有5块钱,小红有3块5,小明和小红总共有多少钱呢? 你们成功运行出 ...

  9. java浮点数数转二进制的数吗_都工作两年了,还不知道浮点数如何转二进制?...

    来吧,坐下聊 先前在前文 <老大说:谁要再用double定义商品金额,就自己收拾东西走> 中就已经痛彻心扉地聊过: 在处理诸如 订单交易.货币计算.以及商品金额慎用浮点数(double/f ...

最新文章

  1. OpenCV中的内存泄漏检测
  2. 用Transformer实现OCR字符识别!
  3. 1.2-shell结构以及执行
  4. BZOJ 2752: [HAOI2012]高速公路(road)
  5. 有关内存释放的一些问题
  6. centos 7 网络配置( 网关、dns、ip地址配置)
  7. mysql access 2017_如何把Access的数据导入到Mysql中
  8. VTK:PolyData之TransformPipeline
  9. hutool读取和导出excel_Java编程第44讲——非常好用的hutool工具介绍
  10. 2017-10-17 开源非英文关键词编程语言
  11. 【matlab函数】convn多维卷积
  12. Shift键关闭大小写
  13. php职业认证,如何用 PHP 进行 HTTP 认证
  14. 通过交互式命令从github拉取项目模板并创建新项目
  15. eclipse java混淆打包_Android Studio和eclipse混淆打包总结
  16. 《随机出题软件》《随机分队软件》源码(Windows API)
  17. 俄罗斯 IT 存储空间告急,未来 2 月或将耗尽?
  18. [Python] L1-040. 最佳情侣身高差 团体程序设计天梯赛GPLT
  19. Mysql按时间段分组查询来统计会员的个数
  20. 【Python】把excel文件中的数据转化为字典格式存起来

热门文章

  1. MC开服教程3:python提取日志中的聊天记录、登录信息、死亡信息、成就信息
  2. vue实现聊天记录向上加载上一页
  3. android 渠道包测试,Android快速批量多渠道包的“蛋生”
  4. 学计算机英语的意义,英语对计算机专业的重要性及如何提高英语水平
  5. 互联网养猪10年,网易们改变了什么?
  6. Windows注册表的那些事儿
  7. Java实现银行账户类(存款,取款,查余额)
  8. sql语句中的函数使用
  9. [个人经验] 双系统ubuntu分区经验
  10. 火狐浏览器韩国文字成方块显示 debian11