Numpy - 归一化 RGB 图像数据集
Numpy - Normalize RGB image dataset
我的数据集是一个 Numpy 数组,维度为 (N, W, H, C),其中 N 是图像的数量,H 和 W 分别是高度和宽度,C 是通道的数量。
我知道那里有很多工具,但我只想用 Numpy 对图像进行标准化。
我的计划是为三个通道中的每一个计算整个数据集的均值和标准差,然后减去均值并除以标准差。
假设数据集中有两张图片,这两张图片的第一个通道如下所示:
x=array([[[3., 4.],
[5., 6.]],
[[1., 2.],
[3., 4.]]])
计算平均值:
numpy.mean(x[:,:,:,0])
= 3.5
计算标准:
numpy.std(x[:,:,:,0])
= 1.5
标准化第一个通道:
x[:,:,:,0] = (x[:,:,:,0] - 3.5) / 1.5
这是正确的吗?
谢谢!
看起来不错,但 NumPy 做的一些事情可以让它变得更好。我假设您想分别标准化每个通道。
首先,注意 x
有一个方法 mean
,所以我们可以写 x[..., 0].mean()
而不是 np.mean(x[:, :, :, 0])
。此外,mean
方法采用关键字参数 axis
,我们可以按如下方式使用它:
means = x.mean(axis=(0, 1, 2)) # Take the mean over the N,H,W axes
means.shape # => will evaluate to (C,)
然后我们可以像这样从整个数据集中减去均值:
centered = x - x.mean(axis=(0,1,2), keepdims=True)
请注意,我们必须在此处使用 keepdims
。
还有一个 x.std
以相同的方式工作,因此我们可以在 1 行中完成整个规范化:
z = (x - x.mean(axis=(0,1,2), keepdims=True)) / x.std(axis=(0,1,2), keepdims=True)
查看 numpy.ndarray.mean and np.ndarray.std 的文档了解更多信息。 np.ndarray.method
方法是您在调用 x.method
而不是使用 np.method(x)
时点击的方法。
编辑:我后来了解到,当然还有一个 scipy.stats.zscore
。我不确定这是否是一种更易读的方式来获取每个通道的 zscores,但有些人可能更喜欢它:
z = zscore(x.reshape(-1, 3)).reshape(x.shape)
scipy 函数仅在一个轴上运行,因此我们必须先重新整形为 NHW x C
矩阵,然后再重新整形。
我的数据集是一个 Numpy 数组,维度为 (N, W, H, C),其中 N 是图像的数量,H 和 W 分别是高度和宽度,C 是通道的数量。
我知道那里有很多工具,但我只想用 Numpy 对图像进行标准化。
我的计划是为三个通道中的每一个计算整个数据集的均值和标准差,然后减去均值并除以标准差。
假设数据集中有两张图片,这两张图片的第一个通道如下所示:
x=array([[[3., 4.],
[5., 6.]],
[[1., 2.],
[3., 4.]]])
计算平均值:
numpy.mean(x[:,:,:,0])
= 3.5
计算标准:
numpy.std(x[:,:,:,0])
= 1.5
标准化第一个通道:
x[:,:,:,0] = (x[:,:,:,0] - 3.5) / 1.5
这是正确的吗?
谢谢!
看起来不错,但 NumPy 做的一些事情可以让它变得更好。我假设您想分别标准化每个通道。
首先,注意 x
有一个方法 mean
,所以我们可以写 x[..., 0].mean()
而不是 np.mean(x[:, :, :, 0])
。此外,mean
方法采用关键字参数 axis
,我们可以按如下方式使用它:
means = x.mean(axis=(0, 1, 2)) # Take the mean over the N,H,W axes
means.shape # => will evaluate to (C,)
然后我们可以像这样从整个数据集中减去均值:
centered = x - x.mean(axis=(0,1,2), keepdims=True)
请注意,我们必须在此处使用 keepdims
。
还有一个 x.std
以相同的方式工作,因此我们可以在 1 行中完成整个规范化:
z = (x - x.mean(axis=(0,1,2), keepdims=True)) / x.std(axis=(0,1,2), keepdims=True)
查看 numpy.ndarray.mean and np.ndarray.std 的文档了解更多信息。 np.ndarray.method
方法是您在调用 x.method
而不是使用 np.method(x)
时点击的方法。
编辑:我后来了解到,当然还有一个 scipy.stats.zscore
。我不确定这是否是一种更易读的方式来获取每个通道的 zscores,但有些人可能更喜欢它:
z = zscore(x.reshape(-1, 3)).reshape(x.shape)
scipy 函数仅在一个轴上运行,因此我们必须先重新整形为 NHW x C
矩阵,然后再重新整形。