重新缩放 1./255 或 1/255 或 1/255 有什么不同吗?预处理图像数据?
is there any difference in rescale 1./255 or 1/255 or 1/255. preprocess image data?
很多图像处理程序我们在数据进行处理之前对数据进行预处理,并对数据使用重新缩放进行预处理
keras.preprocessing.image.ImageDataGenerator(rescale=1/255)
keras.preprocessing.image.ImageDataGenerator(rescale=1./255)
keras.preprocessing.image.ImageDataGenerator(rescale=1/255.)
所以,它们的功能或return价值有什么不同吗
第一个是您按整数重新缩放,因为您将整数除以整数
作为第二个和第三个,你被 float 重新缩放,因为你要么除以 float,要么除以 float
最好的解决办法是除以整数并除以浮点数
绝对没有区别,假设(如您的标签所示)您使用的是 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
。简而言之,常数在所有三种情况下都是相同的。
因此所有三个版本都具有相同的语义和性能。您应该使用您认为最易读的内容。对我来说,这是第一个版本。
很多图像处理程序我们在数据进行处理之前对数据进行预处理,并对数据使用重新缩放进行预处理
keras.preprocessing.image.ImageDataGenerator(rescale=1/255)
keras.preprocessing.image.ImageDataGenerator(rescale=1./255)
keras.preprocessing.image.ImageDataGenerator(rescale=1/255.)
所以,它们的功能或return价值有什么不同吗
第一个是您按整数重新缩放,因为您将整数除以整数
作为第二个和第三个,你被 float 重新缩放,因为你要么除以 float,要么除以 float
最好的解决办法是除以整数并除以浮点数
绝对没有区别,假设(如您的标签所示)您使用的是 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
。简而言之,常数在所有三种情况下都是相同的。
因此所有三个版本都具有相同的语义和性能。您应该使用您认为最易读的内容。对我来说,这是第一个版本。