重新缩放1./255或1/255或1/255有什么区别。预处理图像数据?

时间:2019-12-23 06:20:30

标签: 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.)

所以,它们的功能或返回值是否有差异

2 个答案:

答案 0 :(得分:2)

假设您使用的是Python 3.x或更高版本,则完全没有区别。在CPython下,所有三个表达式都编译为相同的字节码。您可以使用dis模块轻松看到这一点。

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

>>> 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,并且分母首先隐式转换为float,然后计算商。但是因为分母是一个小整数,所以向float的转换是精确的,因此我们再次计算出与精确商1/255最接近的可表示浮点数。第三种情况是类似的,但是在这种情况下,是分子被精确地隐式转换为float,因此计算的常数再次是最接近可商数的float。简而言之,这三种情况下的常数都相同。

因此,这三个版本的语义和性能都相同。您应该使用最容易阅读的内容。对我来说,这是第一个版本。

答案 1 :(得分:-1)

第一个是您用整数重新缩放,因为您用整数除以整数

作为第二个和第三个浮点数,您将按浮点数缩放比例,这是因为您将浮点数除以除法

最好的解决方案是将整数除以浮点数