есть ли разница в масштабировании 1./255 или 1/255 или 1/255. предварительная обработка данных изображения? - PullRequest
0 голосов
/ 23 декабря 2019

много программ обработки изображений, которые мы используем для предварительной обработки данных перед их обработкой и используем масштабирование данных для предварительной обработки

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


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


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

так, есть ли разница в их функционировании или возвращаемом значении

Ответы [ 2 ]

2 голосов
/ 23 декабря 2019

Нет абсолютно никакой разницы, если предположить, что (как показывают ваши теги) вы используете Python 3.x или более поздней версии. Под CPython все три выражения компилируются в один и тот же байт-код. Вы можете легко убедиться в этом, используя модуль dis.

Вот вывод dis.dis для каждого из трех выражений на моем компьютере в Python 3.8+0,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 является точным, и поэтому мы снова вычисляем ближайший представимый тип float до точного частного 1/255. Третий случай аналогичен, но в данном случае это числитель, который неявно преобразуется в float, опять же точно, и поэтому вычисленная константа снова является наиболее близким представимым float к точному частному. Короче говоря, константа одинакова во всех трех случаях.

Таким образом, все три версии имеют одинаковую семантику и производительность. Вы должны использовать то, что кажется вам наиболее читаемым. Для меня это первая версия.

0 голосов
/ 23 декабря 2019

во-первых, вы перемасштабируете по целому числу, потому что вы делите целое число на целое число

, так как второе и третье, которое вы перепрограммировали с помощью float, вы либо делите, либо делите на float

лучшее решение - делить целое число и делить на число с плавающей точкой

...