【问题标题】:is there any difference in rescale 1./255 or 1/255 or 1/255. preprocess image data?重新缩放 1./255 或 1/255 或 1/255 是否有任何差异。预处理图像数据?
【发布时间】:2019-12-23 06:20:30
【问题描述】:

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

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


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


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

那么,它们的功能或返回值有什么不同

【问题讨论】:

    标签: python python-3.x keras tensorflow2.0 rescale


    【解决方案1】:

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

    这是我机器上三个表达式中每一个的dis.dis 的输出,在 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,分母先隐式转换为float,然后计算商。但是因为分母是一个小整数,所以到float 的转换是精确的,所以我们再次计算最接近精确商1/255 的可表示浮点数。第三种情况类似,但在这种情况下,分子被隐式转换为float,同样准确,因此计算的常数再次是最接近精确商的可表示float。简而言之,常数在所有三种情况下都是相同的。

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

    【讨论】:

      【解决方案2】:

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

      作为第二个和第三个,你被浮点数重新缩放,因为你要么除以浮点数,要么除以浮点数

      最好的解决办法是把整数除以浮点数

      【讨论】:

      • OP 用“python-3.x”标签标记了它,所以在第一种情况下,这不是整数重新缩放:1/255 的值是float。 (当然,在 Python 2 中,1/255 将是 0。)
      猜你喜欢
      • 1970-01-01
      • 2011-11-29
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      相关资源
      最近更新 更多