计算批次的平均值和 STD [Python/Numpy]

Oli*_*row 3 python numpy channel batch-processing tensorflow

希望高效地计算批次中每个通道的平均值和标准差。


细节:

  • 批量大小:128
  • 图片:32x32
  • 3 通道(RGB)

因此每个批次的大小为 [128, 32, 32, 3]。

有很多批次(简单方法在所有批次上大约需要 4 分钟)。

我想输出2个数组:(meanR,meanG,meanB)和(stdR,stdG,stB)


(此外,如果在计算之后有一种有效的方法对批次执行算术运算,那么这将很有帮助。例如,从每个图像中减去整个数据集的平均值)

Max*_*axU 5

如果我理解正确并且您想计算所有图像的平均值和标准值:

\n\n

演示:2 个 (2,2,3) 形状的图像(为了简单起见):

\n\n
In [189]: a\nOut[189]:\narray([[[[ 1,  2,  3],\n         [ 4,  5,  6]],\n\n        [[ 7,  8,  9],\n         [10, 11, 12]]],\n\n\n       [[[13, 14, 15],\n         [16, 17, 18]],\n\n        [[19, 20, 21],\n         [22, 23, 24]]]])\n\nIn [190]: a.shape\nOut[190]: (2, 2, 2, 3)\n\nIn [191]: np.mean(a, axis=(0,1,2))\nOut[191]: array([ 11.5,  12.5,  13.5])\n\nIn [192]: np.einsum('ijkl->l', a)/float(np.prod(a.shape[:3]))\nOut[192]: array([ 11.5,  12.5,  13.5])\n
Run Code Online (Sandbox Code Playgroud)\n\n

速度测量:

\n\n
In [202]: a = np.random.randint(255, size=(128,32,32,3))\n\nIn [203]: %timeit np.mean(a, axis=(0,1,2))\n9.48 ms \xc2\xb1 822 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 100 loops each)\n\nIn [204]: %timeit np.einsum('ijkl->l', a)/float(np.prod(a.shape[:3]))\n1.82 ms \xc2\xb1 22.2 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 1000 loops each)\n
Run Code Online (Sandbox Code Playgroud)\n