jet*_*tta 8 python numpy image-processing normalize numpy-broadcasting
我有一个带有形状的numpy数组(34799, 32, 32, 3),意思是(num examples, width, height, channels).
现在我使用以下代码规范化图像数据:
def normalize(x):
return (x - 128) / 128
X_train_norm = normalize(X_train)
Run Code Online (Sandbox Code Playgroud)
但结果似乎不对,价值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)
Run Code Online (Sandbox Code Playgroud)
输出:
[[[[-0.78125 -0.8046875 -0.8125 ]]]]
Run Code Online (Sandbox Code Playgroud)
为什么normalize函数得到错误的结果?
我认为这些图像是作为一个numpy数组加载的,其中填充了uint8字节值,其中的值介于0和之间255.
如果uint8在结果为负的情况下执行减法,则会发生环绕.喜欢123 - 128 == 251,然后你将它除以128.例如:
>>> np.array([28,25,24], dtype=np.uint8) - 128
array([156, 153, 152], dtype=uint8)
Run Code Online (Sandbox Code Playgroud)
然后,我们得到报告:
>>> (np.array([28,25,24], dtype=np.uint8) - 128)/128
array([1.21875 , 1.1953125, 1.1875 ])
Run Code Online (Sandbox Code Playgroud)
为了解决它,您可以使用.astype(..):
def normalize(x):
return (x.astype(float) - 128) / 128Run Code Online (Sandbox Code Playgroud)
请注意,这与您使用函数的事实无关,如果您将表达式与原始数组一起使用,则会得到相同的结果.
在当前编写代码时,如果x具有dtype uint8(似乎具有),则减法将在uint8中进行,但除法将在float中完成。
解决此问题的最简单方法是通过使128为浮点数来强制在浮点数中进行减法
def normalize(x):
return (x - 128.0) / 128Run Code Online (Sandbox Code Playgroud)