给定一个2D(M x N)矩阵和一个2D核(K x L),我如何返回一个矩阵,该矩阵是在图像上使用给定核的最大值或平均值合并的结果?
如果可能的话,我想用numpy。
注:M,N,K,L可以是偶数或奇数,它们不需要完全被对方整除,例如:7x5矩阵和2x2内核。
例如最大合并:
matrix:
array([[ 20, 200, -5, 23],
[ -13, 134, 119, 100],
[ 120, 32, 49, 25],
[-120, 12, 09, 23]])
kernel: 2 x 2
soln:
array([[ 200, 119],
[ 120, 49]])
8条答案
按热度按时间gxwragnw1#
你可以使用scikit-image block_reduce:
给出:
waxmsbnn2#
如果图像大小可以被内核大小整除,则可以调整数组的形状,并根据需要使用
max
或mean
如果内核数量不是偶数,则必须单独处理边界(如注解中所指出的,这会导致矩阵被复制,从而影响性能)。
kzipqqlq3#
我们可以不像艾略特的答案那样做“象限”,而是将其填充为可整除的,然后执行最大值池或平均值池。
由于CNN中经常使用池,所以输入数组通常是3D的,所以我做了一个函数,既可以对2D数组工作,也可以对3D数组工作。
有时候你可能想执行重叠池,步长不等于内核大小。下面是一个函数,它可以完成这个任务,不管有没有填充:
ie3xauqp4#
Another solution uses the little-known magic of
np.maximum.at
(or you can adapt this to mean-pooling using np.add.at and dividing)示例用法:
印刷品
不幸的是,它看起来有点慢,所以我仍然会去与mdh提供的解决方案
c3frrgcw5#
由于numpy文档要求“极其小心”地使用“numpy.lib.stride_tricks.as_strided”,这里有另一个不使用它的2D/3D池的解决方案。
如果跨距=1,它会导致使用相同的填充。对于跨距〉1,我不是100%确定如何定义相同的填充。
wz1wpwve6#
3 x 3
内核和方阵a
的最大池z3yyvxxp7#
这个函数可以在任何大小的内核上应用max pooling,只使用numpy函数。
2fjabf4q8#
你也可以使用numpy的
as_strided()
函数来做同样的事情,所以,我们的想法是使用给定的内核大小和跨距来创建输入的子矩阵,然后简单地沿着高度和宽度轴取最大值。的一个或多个字符
我们有我们需要的输出!