我将int32类型的张量除以int32类型的张量,结果是float64。我找不到关于为什么发生这种情况的答案,也找不到关于Tensorflow如何做到这一点的隐含规则。我没有为任何张量明确定义dtype,但是我已经检查了所有张量,并且在除法之后,它们都没有64位类型。
我尝试使用不同的除法公式,例如tf.divide,它们都给出相同的结果。
我的代码如下:
a_cdf = a / tf.size(a)
类型为tf.int32。
我想要得到的结果是float32,所以我可以编写函数而无需显式强制转换。
答案 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位浮点数会下溢。
但是,这再次只是猜测,更是一种思想练习。