如何使用 numpy 在二维数组上执行高斯池化

How to perform Gaussian pooling on a 2d array using numpy

给定一个 2D(M x N) 矩阵和一个 2D Gaussian Mask(K x K),我如何 return 一个矩阵,该矩阵是使用给定内核对图像进行高斯池化的结果?

我想尽可能使用 numpy(不使用 "for",只使用 numpy) 例如 2x2 高斯池:(可能是错误的答案)

matrix:
array([[  20,  200,   -5,   23,  10, -50],
       [ -13,  134,  119,  100,  45, -79],
       [ 120,   32,   49,   25,  13,   0],
       [  40,   12,   59,   23,  32,  -1],
       [  75,  121,   69,   67,  64,  -7],
       [  39,   12,   79,   -8,  16,  -9]])
kernel:
array([[ 1/16, 1/8, 1/16],
       [  1/8, 1/4,  1/8],
       [ 1/16, 1/8, 1/16]])
soln:
array([[   87.25,   16.625],
       [ 64.8125,  29.8125]])

首先将您的 M x N 矩阵转换为 (M//K) x K x (N//K) x K 数组, 然后逐点乘以第二和第四维的内核, 然后在第二个和第四个维度求和。

np.sum(
    matrix.reshape((
        matrix.shape[-2] // kernel.shape[-2], kernel.shape[-2],
        matrix.shape[-1] // kernel.shape[-1], kernel.shape[-1],
    ))
    * kernel[np.newaxis, :, np.newaxis, :],
    axis=(-3, -1),
)

您还可以通过 np.tensordot 调用替换逐点相乘然后求和。

np.tensordot(
    matrix.reshape((
        matrix.shape[-2] // kernel.shape[-2], kernel.shape[-2],
        matrix.shape[-1] // kernel.shape[-1], kernel.shape[-1],
    )),
    kernel,
    axes=(
        (-3, -1),
        (-2, -1),
    )
)