Numpy - 将RGB像素数组归一化

9

我有一个形状为(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 函数会得到错误的结果?

我认为这是由于字节的环绕造成的。 - Willem Van Onsem
X_train.dtype 是什么? - P. Camilleri
@P.Camilleri uint8 - jetta
这解释了你观察到的行为,详细答案请参考提供的内容。 - P. Camilleri
它解决了我的问题。非常感谢。 - jetta
2个回答

7
我认为这些图片被加载为一个包含 uint8 字节的numpy数组,其值在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<b>.astype(float)</b> - 128) / 128

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


5

当前的代码实现中,如果x的数据类型为uint8(这似乎是它的数据类型),那么减法将以uint8进行计算,但除法会以float类型进行计算。

最简单的解决方式是通过将128定义为float类型,强制让减法使用float类型进行计算。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接