如何使用 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),
)
)
给定一个 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),
)
)