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

标签 python numpy floating-point user-defined-data-types

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

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

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

原因:

我正在尝试在定制硬件(FPGA)上优化神经网络。为此,我正在尝试各种 float 表示。我已经使用 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 位整数,然后将其转换回 float 组。请注意大端表示法转换回字节,因为我们希望 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)

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

关于python - 在 python-numpy 中定义自定义 float8 并从/到 float16 转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56962100/

相关文章:

python - 尝试将数据插入 MySQL 时出现此错误 ->"TypeError: not all arguments converted during string formatting"

python - 如何使用 `gevent.pywsgi.WSGIServer` 和 `WebSocketHandler` 启用 Flask 应用程序的日志记录?

python - 十六进制的正则表达式

c++ - 为什么 0.2f + 0.3f == 0.5f?

excel - Excel 的工作表比较运算符是否给出不一致的结果?

python - Python 的 sys.path 是从哪里初始化的?

python - 如何使用带有 boolean 数组的 np.infs 将数组的所有索引归零?

Pandas "isin"比 numpy "in1d"慢得多

python - 二维 numpy 数组搜索(相当于 Matlab 的 intersect 'rows' 选项)

math - float 学坏了吗?