Python 重新缩放1/255或1/255或1/255是否有任何差异。预处理图像数据?

Python 重新缩放1/255或1/255或1/255是否有任何差异。预处理图像数据?,python,python-3.x,keras,tensorflow2.0,rescale,Python,Python 3.x,Keras,Tensorflow2.0,Rescale,在很多图像处理程序中,我们在进行处理之前对数据进行预处理,并对数据进行重缩放进行预处理 keras.preprocessing.image.ImageDataGenerator(rescale=1/255) keras.preprocessing.image.ImageDataGenerator(rescale=1./255) keras.preprocessing.image.ImageDataGenerator(rescale=1/255.) 那么,它们的函数或返回值有什么不同吗?

在很多图像处理程序中,我们在进行处理之前对数据进行预处理,并对数据进行重缩放进行预处理

keras.preprocessing.image.ImageDataGenerator(rescale=1/255)


keras.preprocessing.image.ImageDataGenerator(rescale=1./255)


keras.preprocessing.image.ImageDataGenerator(rescale=1/255.)

那么,它们的函数或返回值有什么不同吗?第一个是按整数重新缩放,因为是用整数除以整数

作为第二个和第三个,您将按浮点重新缩放,因为您可以按浮点除法或按浮点除法


最好的解决方案是将整型除法和浮点除法完全没有区别,假设(如标记所示)您使用的是Python 3.x或更高版本。在CPython下,所有三个表达式都编译为相同的字节码。使用该模块可以很容易地看到这一点

这是在Python 3.8.0下,我的机器上三个表达式的输出;您可以看到它是逐字节相同的,并且在每种情况下都预先计算了常量

>>> import dis
>>> dis.dis("keras.preprocessing.image.ImageDataGenerator(rescale=1/255)")
  1           0 LOAD_NAME                0 (keras)
              2 LOAD_ATTR                1 (preprocessing)
              4 LOAD_ATTR                2 (image)
              6 LOAD_ATTR                3 (ImageDataGenerator)
              8 LOAD_CONST               0 (0.00392156862745098)
             10 LOAD_CONST               1 (('rescale',))
             12 CALL_FUNCTION_KW         1
             14 RETURN_VALUE
>>> dis.dis("keras.preprocessing.image.ImageDataGenerator(rescale=1./255)")
  1           0 LOAD_NAME                0 (keras)
              2 LOAD_ATTR                1 (preprocessing)
              4 LOAD_ATTR                2 (image)
              6 LOAD_ATTR                3 (ImageDataGenerator)
              8 LOAD_CONST               0 (0.00392156862745098)
             10 LOAD_CONST               1 (('rescale',))
             12 CALL_FUNCTION_KW         1
             14 RETURN_VALUE
>>> dis.dis("keras.preprocessing.image.ImageDataGenerator(rescale=1/255.)")
  1           0 LOAD_NAME                0 (keras)
              2 LOAD_ATTR                1 (preprocessing)
              4 LOAD_ATTR                2 (image)
              6 LOAD_ATTR                3 (ImageDataGenerator)
              8 LOAD_CONST               0 (0.00392156862745098)
             10 LOAD_CONST               1 (('rescale',))
             12 CALL_FUNCTION_KW         1
             14 RETURN_VALUE
更详细地说:在CPython中,对于第一个常量
1/255
,我们执行整数的真除法,并计算与商的真值最接近的浮点值。在第二种情况下,
1./255
,分子已经是一个
浮点
,分母首先隐式转换为
浮点
,然后计算商。但是因为分母是一个小整数,所以到
float
的转换是精确的,因此我们再次计算出与精确商
1/255
最接近的可表示浮点。第三种情况类似,但在本例中,是分子隐式转换为
float
,同样精确,因此计算的常数也是最接近精确商的
float
。简言之,这三种情况下的常数都是相同的

因此,这三个版本都具有相同的语义和性能。你应该使用你觉得最容易阅读的东西。对我来说,这是第一个版本。

OP用“python-3.x”标记了它,因此在第一种情况下,这不是一个整数重缩放:
1/255
的值是一个
浮点值。(当然,在Python 2中,
1/255
将是
0