也可能是 numpy 或 tensorflow 等库的问题。
起因:tensorflow 训练出现 loss nan,一步步 debug 到一个 sigmoid 函数结果出现了负数,打印出来发现负数全是 -5.96046448e-08,这个数值正负都有
直接搜索了这个数字,大部分结果都是计算结果里出现了这个数字,计算的逻辑应该是等于 0 的(比如矩阵和逆矩阵相乘)
所以有了这个问题,搜索无果,求助一下
1
gowa 2019-12-17 21:28:18 +08:00 via Android
看一下 python 在 c 层面是如何表示浮点数的 不谢
|
2
gowa 2019-12-17 21:30:11 +08:00 via Android 2
|
3
jinliming2 2019-12-17 22:17:40 +08:00 via iPhone
double 和 float 没有办法准确表示部分小数的
|
4
yujincheng08 2019-12-17 22:25:32 +08:00
浮点数误差
|
5
skies457 2019-12-17 22:49:03 +08:00
试试 6e18 + 2000 - 6e18
|
6
Xs0ul 2019-12-17 22:51:58 +08:00
这个数是 2^-24, 是 half 能表示的最小正数
|
8
xjx0524 OP @gowa
@jinliming2 @yujincheng08 @skies457 看了一下 754 浮点数标准,再请问下 1、python 下为什么对一个浮点数 getsizeof 是 24 呢 2、怎么在 python 里方便的看一个浮点数的二进制表示 3、还是没有想明白,sigmoid 函数怎么溢出出来负数了 |
9
aloxaf 2019-12-18 19:09:15 +08:00 1
浮点数在计算机中的表示是不精确的, 很容易被坑到
5.96046448e-08 是半浮点类型能表示的最小的正值 可以执行 `print(f'{np.nextafter(np.float16(0), np.float16(1))}')` 验证一下 1. sys.getsizeof 是查看对象大小,Python 不是零成本抽象语言,对象还包含了其他元信息。还有请区分 float 和 np.float,前者是 Python 内置浮点类型,后者是 numpy 的默认浮点类型。你的语境里应该一直是指 numpy。 2. 没啥好方法,毕竟浮点数的二进制表示一般也没啥用。一般都是先强转成整数再查看整数的二进制表示,比如 `bin(ctypes.c_int32.from_buffer(ctypes.c_float(1.0)).value)` 3. 不, 这是 0. 或者说你当成 0 就行了... |