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
Другие вопросы по тегам