Tensorflow为什么将int32 / int32强制转换为float64以及如何将其停止?

时间:2019-06-05 09:26:07

标签: tensorflow implicit-conversion

我将int32类型的张量除以int32类型的张量,结果是float64。我找不到关于为什么发生这种情况的答案,也找不到关于Tensorflow如何做到这一点的隐含规则。我没有为任何张量明确定义dtype,但是我已经检查了所有张量,并且在除法之后,它们都没有64位类型。

我尝试使用不同的除法公式,例如tf.divide,它们都给出相同的结果。

我的代码如下:

a_cdf = a / tf.size(a)

类型为tf.int32。

我想要得到的结果是float32,所以我可以编写函数而无需显式强制转换。

1 个答案:

答案 0 :(得分:0)

这是设计使然。 TensorFlow中的“ True”除法(即实数除法)使用_TRUEDIV_TABLE来指定每种类型的转换规则,并且当前显示为:

# Conversion table for __truediv__.  None entries mean no conversion required.
_TRUEDIV_TABLE = {
    dtypes.uint8: dtypes.float32,
    dtypes.int8: dtypes.float32,
    dtypes.uint16: dtypes.float32,
    dtypes.int16: dtypes.float32,
    dtypes.int32: dtypes.float64,
    dtypes.int64: dtypes.float64,
    dtypes.bfloat16: None,
    dtypes.float16: None,
    dtypes.float32: None,
    dtypes.float64: None,
    dtypes.complex64: None,
    dtypes.complex128: None,
}

意味着int32张量将转换为float64。如果要获取float32作为输出,请使用较小的int类型或将输入转换为float32

这是另一回事。如果我不得不猜测,一方面,我会说如果您使用8位或16位整数,那么您可能会担心内存,因此较小的结果类型将是有意义的。而且,您可以提供以下参数:

import numpy as np

# Compute smallest positive divisions with 16 and 32 bits
smallest_16bit_fraction = 1 / ((1 << 16) - 1)
smallest_32bit_fraction = 1 / (-(1 << 31))  # 31 bits because int32 is signed
# Compute one plus the smallest fractions with 32 and 64 bit floats
print(np.float32(1) + np.float32(smallest_16bit_fraction))
# 1.0000153
print(np.float64(1) + np.float64(smallest_16bit_fraction))
# 1.0000152590218967
print(np.float32(1) + np.float32(smallest_32bit_fraction))
# 1.0
print(np.float64(1) + np.float64(smallest_32bit_fraction))
# 0.9999999995343387

因此,您可能会认为,作为两个整数值的除法,您可能希望将结果与整数混合,但是如您所见,对于32位整数,在某些情况下32位浮点数会下溢。

但是,这再次只是猜测,更是一种思想练习。