Numpy - 归一化 RGB 像素阵列

Numpy - normalize RGB pixel array

我有一个形状为 (34799, 32, 32, 3) 的 numpy 数组,这意味着 (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 函数得到错误的结果?

我认为图像是作为一个 numpy 数组加载的,其中填充了 uint8 个字节,值在 0255 之间。

如果您对 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<b>.astype(float)</b> - 128) / 128

请注意,这与您使用函数这一事实无关,如果您将表达式与原始数组一起使用,您将得到 相同 结果。

按照当前编写的代码,如果 x 具有 dtype uint8(它似乎具有),减法将在 uint8 中进行,但除法在 float 中完成。

解决这个问题的最简单方法是通过让 128 成为浮点数来强制减法发生在浮点数中

def normalize(x):
    return (x - 128<b>.0</b>) / 128