我有一个形状(N, H, W, C)
的numpy数组图像,其中N
是图像数量,H
图像高度,W
图像宽度和{{1 RGB通道。
我想通过频道标准化我的图像,因此对于每个图像,我想通过通道方式减去图像通道的平均值并除以其标准偏差。
我在一个循环中完成了这个工作,但效率非常低,因为它复制了我的RAM太满了。
C
如何更有效地利用numpy的功能?
答案 0 :(得分:4)
沿着第二和第三轴执行ufunc缩减(mean,std),同时保持dim完好无损,以便稍后使用除法步骤帮助broadcasting
-
mean = np.mean(rgb_images, axis=(1,2), keepdims=True)
std = np.std(rgb_images, axis=(1,2), keepdims=True)
standardized_images_out = (rgb_images - mean) / std
通过重新使用平均值来计算标准差,从而进一步提升性能,根据其公式,因此受到this solution
的启发,如此 -
std = np.sqrt(((rgb_images - mean)**2).mean((1,2), keepdims=True))
打包到具有减少轴的函数作为参数,我们将 -
from __future__ import division
def normalize_meanstd(a, axis=None):
# axis param denotes axes along which mean & std reductions are to be performed
mean = np.mean(a, axis=axis, keepdims=True)
std = np.sqrt(((a - mean)**2).mean(axis=axis, keepdims=True))
return (a - mean) / std
standardized_images = normalize_meanstd(rgb_images, axis=(1,2))