我的数据集是一个尺寸为(N,W,H,C)的Numpy数组,其中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
这正确吗?
谢谢!
答案 0 :(得分:3)
看起来不错,但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和np.ndarray.std的文档以了解更多信息。调用np.ndarray.method
而不是使用x.method
时,您会遇到np.method(x)
方法。