繁体   English   中英

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

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

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

如果可能,我想使用 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调用替换 pointwise-multiply-then-sum。

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),
    )
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM