Numpy - нормализует массив пикселей RGB
У меня есть массив с формой (34799, 32, 32, 3)
что значит (num examples, width, height, channels)
,
Теперь я нормализую данные изображения с помощью следующего кода:
def normalize(x):
return (x - 128) / 128
X_train_norm = normalize(X_train)
Но результат кажется не правильным, ценность X_train[0][0][0]
является [28 25 24]
, но на выходе X_train_norm[0][0][0]
является [1.21875 1.1953125 1.1875]
,
Я использую следующий тестовый код:
test = np.array([[[[28, 25, 24]]]])
print ((test - 128) / 128)
выход:
[[[[-0.78125 -0.8046875 -0.8125 ]]]]
Почему normalize
функция получает неправильный результат?
2 ответа
Я думаю, что изображения загружаются в виде массива, заполненного uint8
байты со значениями между 0
а также 255
,
Если вы выполняете вычитание на uint8
таким образом, что результат отрицательный, происходит обратное. подобно 123 - 128 == 251
, а затем вы делите его на 128. Например:
>>> np.array([28,25,24], dtype=np.uint8) - 128
array([156, 153, 152], dtype=uint8)
и тогда мы получаем сообщение:
>>> (np.array([28,25,24], dtype=np.uint8) - 128)/128
array([1.21875 , 1.1953125, 1.1875 ])
Для ее решения вы можете использовать .astype(..)
:
def normalize(x):
return (x.astype(float) - 128) / 128
Обратите внимание, что это не имеет ничего общего с тем, что вы используете функцию: если бы вы использовали выражение с исходным массивом, вы бы получили тот же результат.
Как код написан в настоящее время, если x
имеет тип uint8
(что, кажется, имеет), вычитание будет происходить в uint8, но деление происходит в float.
Самый простой способ решить это - заставить вычитание произойти в поплавках, позволив 128 быть поплавком
def normalize(x):
return (x - 128.0) / 128