为什么tf.reduce_sum()
不适用于uint8
?
考虑这个例子:
>>> tf.reduce_sum(tf.ones((4, 10, 10), dtype=tf.uint8))
<tf.Tensor: shape=(), dtype=uint8, numpy=144>
>>> tf.reduce_sum(tf.ones((4, 10, 10), dtype=tf.uint16))
<tf.Tensor: shape=(), dtype=uint16, numpy=400>
有人知道这是为什么吗?
docs没有提到与 uint8
的任何不兼容性。
最佳答案
uint8
代表无符号整数,它使用 8 位来保存值。
通过8位,只能保存[0, 255]范围内的正数(无符号)(如果是int8
则可以保存[-127,+127]范围内的有符号数) .
如果你想保留一个高于255的值,它只保留该数字的前8位,例如256 的二进制为 0000 0000 1
,前 8 位为 0000 0000
。因此,对于 256,您将得到 0
结果:
>>> tf.reduce_sum(tf.ones((1, 255), dtype=tf.uint8))
<tf.Tensor: shape=(), dtype=uint8, numpy=255>
>>> tf.reduce_sum(tf.ones((1, 256), dtype=tf.uint8))
<tf.Tensor: shape=(), dtype=uint8, numpy=0>
在您的例子中,预期结果是 400,但由于 uint8
无法保持高于 255 的值,因此当总和达到 256 时它将从 0 开始。因此,您看到的结果为 144实际上是 400-256=144
。
因此,它不在 tf.reduce_sum()
上,而是在 uint8
上,并注意使用任何数据类型。
关于python - tf.reduce_sum() uint8 出现意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68291540/