繁体   English   中英

在 python-numpy 中定义一个自定义的 float8 并从/到 float16 转换?

[英]Define a custom float8 in python-numpy and convert from/to float16?

我正在尝试定义一个自定义的 8 位浮点格式,如下所示:

  • 1 个符号位
  • 尾数 2 位
  • 指数 5 位

是否可以将其定义为 numpy 数据类型? 如果不是,将 dtype float16 的 numpy 数组转换为这种格式(用于存储)并将其转换回(用于 float16 中的计算)的最简单方法是什么,也许使用 numpy 的位操作?

为什么:

我正在尝试在自定义硬件 (FPGA) 上优化神经网络。 为此,我正在尝试各种浮动表示。 我已经用 numpy 为我的神经网络构建了一个前向传递框架,因此上面的内容将帮助我通过将值存储在我的自定义数据类型中来检查准确性的降低。

我绝不是 numpy 的专家,但我喜欢考虑 FP 表示问题。 您的数组的大小并不大,因此任何合理有效的方法都应该没问题。 看起来没有 8 位 FP 表示,我猜是因为精度不太好。

要转换为字节数组,每个字节包含一个 8 位 FP 值,对于一维数组,您只需要

float16 = np.array([6.3, 2.557])           # Here's some data in an array
float8s = array.tobytes()[1::2]
print(float8s)
>>> b'FAAF'

这只是通过删除低位部分从 16 位浮点数中获取高位字节,给出 1 位符号、5 位指数和 2 位有效数。 高位字节始终是小端机器上每对的第二个字节。 我已经在二维数组上尝试过它,它的工作原理是一样的。 这截断了。 十进制四舍五入将是另一类蠕虫。

回到 16 位只是插入零。 我通过实验发现了这种方法,并且无疑有更好的方法,但是这将字节数组读取为 8 位整数,并将新的字节数组写入为 16 位整数,然后将其转换回浮点数组。 注意大端表示转换回字节,因为我们希望 8 位值是整数的高位字节。

float16 = np.frombuffer(np.array(np.frombuffer(float8s, dtype='u1'), dtype='>u2').tobytes(), dtype='f2')
print(float16)
>>> array([6. , 2.5, 2.5, 6. ], dtype=float16)

你绝对可以看到精度的损失! 我希望这有帮助。 如果这足够了,请告诉我。 如果没有,我会准备更深入地研究它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM