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
个字节,值在 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
请注意,这与您使用函数这一事实无关,如果您将表达式与原始数组一起使用,您将得到 相同 结果。
按照当前编写的代码,如果 x
具有 dtype uint8
(它似乎具有),减法将在 uint8 中进行,但除法在 float 中完成。
解决这个问题的最简单方法是通过让 128 成为浮点数来强制减法发生在浮点数中
def normalize(x):
return (x - 128<b>.0</b>) / 128
我有一个形状为 (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
个字节,值在 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
请注意,这与您使用函数这一事实无关,如果您将表达式与原始数组一起使用,您将得到 相同 结果。
按照当前编写的代码,如果 x
具有 dtype uint8
(它似乎具有),减法将在 uint8 中进行,但除法在 float 中完成。
解决这个问题的最简单方法是通过让 128 成为浮点数来强制减法发生在浮点数中
def normalize(x):
return (x - 128<b>.0</b>) / 128