很多图像处理程序,我们在对数据进行预处理之前先对其进行预处理,并对数据进行重新缩放以进行预处理
keras.preprocessing.image.ImageDataGenerator(rescale=1/255)
keras.preprocessing.image.ImageDataGenerator(rescale=1./255)
keras.preprocessing.image.ImageDataGenerator(rescale=1/255.)
所以,它们的功能或返回值是否有差异
答案 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)
第一个是您用整数重新缩放,因为您用整数除以整数
作为第二个和第三个浮点数,您将按浮点数缩放比例,这是因为您将浮点数除以除法
最好的解决方案是将整数除以浮点数