NumPy Array Reshaped 但如何更改轴以进行池化?
NumPy Array Reshaped but how to change axis for pooling?
我有一个 8x8 矩阵如下:
[[ 0.3 0.3 0.3 0.3 0.3 0.5 0.1 -0.1]
[ 0.1 0.1 -0.1 0.3 0.3 -0.1 -0.1 -0.5]
[-0.1 0.1 0.3 -0.1 0.3 -0.1 -0.1 -0.1]
[-0.1 0.1 0.5 0.3 -0.3 -0.1 -0.3 -0.1]
[ 0.5 0.1 -0.1 0.1 -0.1 -0.1 -0.3 -0.5]
[ 0.1 -0.1 -0.3 -0.5 -0.5 -0.1 -0.1 -0.3]
[-0.5 -0.3 -0.3 -0.3 -0.1 -0.5 -0.1 -0.3]
[-0.3 -0.3 -0.3 -0.3 -0.1 -0.1 -0.5 -0.3]]
我的 window 是 2x2。我想要做的是将四个数字(向上和向下数字)放在一起进行汇集。示例输出如下所示:
[[0.3 0.3
0.1 0.1]
[0.3 0.3
-0.1 0.3]
.......
.......
[-0.1 -0.3
-0.5 -0.3]]
我用的是print arr.reshape(16,2,2)
我不明白的是如何为这个要求设置轴。我的输出是:
[[[ 0.3 0.3]
[ 0.3 0.3]]
[[ 0.3 0.1]
[ 0.5 -0.1]]
[[ 0.1 -0.1]
[ 0.1 0.3]]
[[ 0.3 -0.1]
[-0.1 -0.5]]
[[-0.1 0.3]
[ 0.1 -0.1]]
[[ 0.3 -0.1]
[-0.1 -0.1]]
[[-0.1 0.5]
[ 0.1 0.3]]
[[-0.3 -0.3]
[-0.1 -0.1]]
[[ 0.5 -0.1]
[ 0.1 0.1]]
[[-0.1 -0.3]
[-0.1 -0.5]]
[[ 0.1 -0.3]
[-0.1 -0.5]]
[[-0.5 -0.1]
[-0.1 -0.3]]
[[-0.5 -0.3]
[-0.3 -0.3]]
[[-0.1 -0.1]
[-0.5 -0.3]]
[[-0.3 -0.3]
[-0.3 -0.3]]
[[-0.1 -0.5]
[-0.1 -0.3]]]
请解释在这种情况下如何应用坐标轴。或者,如果他们是获得最大池化的更好方法,请提及。
注意:所有这些都是为了最大池化。我在 python.
上使用 NumPy,SciPy
有
arr.reshape((4, 2, 4, 2)).transpose((0, 2, 1, 3)).reshape((16, 2, 2))
做你想做的事?
编辑:一点解释:第一个重塑将 x 轴和 y 轴分别分成 4 个块,每块 2 个。这几乎就是您要的,只有块在轴 1 和轴 3 上,而不是在轴上最后两个。这就是转置的用武之地。它是数学中矩阵转置(交换轴 0 和 1)到任意维度的直接概括。参数 (0, 2, 1, 3) 要求它保留第 0 个和最后一个轴并交换轴 1 和 2。
此时形状为(4, 4, 2, 2)。所以最后的重塑使前两个轴变平。如果您可以使用 2 x 2 的 4 x 4 块,那么实际上建议不要进行第二次重塑,因为与前两个操作相比,它的计算量很大。
这是因为转置创建了一个 non-contiguous 数组。现在连续数组和 non-contiguous 数组之间的一个区别是重塑连续数组的成本几乎为零,而重塑 non-contiguous 数组通常会强制复制。
将两个轴中的每一个拆分为两个轴,使拆分后的轴的长度与块大小相同。这会给我们一个 4D
数组。然后,沿着后面的轴执行最大值查找,这将是 4D
数组中的第二个和第四个轴。
因此,只需执行 -
m,n = a.shape
out = a.reshape(m//2,2,n//2,2).max(axis=(1,3))
样本运行-
In [50]: a
Out[50]:
array([[87, 96, 46, 97, 25, 22, 13, 16],
[65, 62, 68, 87, 52, 80, 26, 82],
[27, 82, 50, 20, 11, 14, 94, 23],
[86, 44, 17, 97, 17, 57, 76, 42],
[47, 85, 30, 61, 55, 87, 11, 35],
[36, 11, 29, 45, 16, 54, 40, 77],
[38, 87, 94, 77, 53, 20, 46, 18],
[86, 50, 17, 23, 91, 23, 25, 11]])
In [51]: m,n = a.shape
In [52]: a.reshape(m//2,2,n//2,2).max(axis=(1,3))
Out[52]:
array([[96, 97, 80, 82],
[86, 97, 57, 94],
[85, 61, 87, 77],
[87, 94, 91, 46]])
我有一个 8x8 矩阵如下:
[[ 0.3 0.3 0.3 0.3 0.3 0.5 0.1 -0.1]
[ 0.1 0.1 -0.1 0.3 0.3 -0.1 -0.1 -0.5]
[-0.1 0.1 0.3 -0.1 0.3 -0.1 -0.1 -0.1]
[-0.1 0.1 0.5 0.3 -0.3 -0.1 -0.3 -0.1]
[ 0.5 0.1 -0.1 0.1 -0.1 -0.1 -0.3 -0.5]
[ 0.1 -0.1 -0.3 -0.5 -0.5 -0.1 -0.1 -0.3]
[-0.5 -0.3 -0.3 -0.3 -0.1 -0.5 -0.1 -0.3]
[-0.3 -0.3 -0.3 -0.3 -0.1 -0.1 -0.5 -0.3]]
我的 window 是 2x2。我想要做的是将四个数字(向上和向下数字)放在一起进行汇集。示例输出如下所示:
[[0.3 0.3
0.1 0.1]
[0.3 0.3
-0.1 0.3]
.......
.......
[-0.1 -0.3
-0.5 -0.3]]
我用的是print arr.reshape(16,2,2)
我不明白的是如何为这个要求设置轴。我的输出是:
[[[ 0.3 0.3]
[ 0.3 0.3]]
[[ 0.3 0.1]
[ 0.5 -0.1]]
[[ 0.1 -0.1]
[ 0.1 0.3]]
[[ 0.3 -0.1]
[-0.1 -0.5]]
[[-0.1 0.3]
[ 0.1 -0.1]]
[[ 0.3 -0.1]
[-0.1 -0.1]]
[[-0.1 0.5]
[ 0.1 0.3]]
[[-0.3 -0.3]
[-0.1 -0.1]]
[[ 0.5 -0.1]
[ 0.1 0.1]]
[[-0.1 -0.3]
[-0.1 -0.5]]
[[ 0.1 -0.3]
[-0.1 -0.5]]
[[-0.5 -0.1]
[-0.1 -0.3]]
[[-0.5 -0.3]
[-0.3 -0.3]]
[[-0.1 -0.1]
[-0.5 -0.3]]
[[-0.3 -0.3]
[-0.3 -0.3]]
[[-0.1 -0.5]
[-0.1 -0.3]]]
请解释在这种情况下如何应用坐标轴。或者,如果他们是获得最大池化的更好方法,请提及。
注意:所有这些都是为了最大池化。我在 python.
上使用 NumPy,SciPy有
arr.reshape((4, 2, 4, 2)).transpose((0, 2, 1, 3)).reshape((16, 2, 2))
做你想做的事?
编辑:一点解释:第一个重塑将 x 轴和 y 轴分别分成 4 个块,每块 2 个。这几乎就是您要的,只有块在轴 1 和轴 3 上,而不是在轴上最后两个。这就是转置的用武之地。它是数学中矩阵转置(交换轴 0 和 1)到任意维度的直接概括。参数 (0, 2, 1, 3) 要求它保留第 0 个和最后一个轴并交换轴 1 和 2。
此时形状为(4, 4, 2, 2)。所以最后的重塑使前两个轴变平。如果您可以使用 2 x 2 的 4 x 4 块,那么实际上建议不要进行第二次重塑,因为与前两个操作相比,它的计算量很大。
这是因为转置创建了一个 non-contiguous 数组。现在连续数组和 non-contiguous 数组之间的一个区别是重塑连续数组的成本几乎为零,而重塑 non-contiguous 数组通常会强制复制。
将两个轴中的每一个拆分为两个轴,使拆分后的轴的长度与块大小相同。这会给我们一个 4D
数组。然后,沿着后面的轴执行最大值查找,这将是 4D
数组中的第二个和第四个轴。
因此,只需执行 -
m,n = a.shape
out = a.reshape(m//2,2,n//2,2).max(axis=(1,3))
样本运行-
In [50]: a
Out[50]:
array([[87, 96, 46, 97, 25, 22, 13, 16],
[65, 62, 68, 87, 52, 80, 26, 82],
[27, 82, 50, 20, 11, 14, 94, 23],
[86, 44, 17, 97, 17, 57, 76, 42],
[47, 85, 30, 61, 55, 87, 11, 35],
[36, 11, 29, 45, 16, 54, 40, 77],
[38, 87, 94, 77, 53, 20, 46, 18],
[86, 50, 17, 23, 91, 23, 25, 11]])
In [51]: m,n = a.shape
In [52]: a.reshape(m//2,2,n//2,2).max(axis=(1,3))
Out[52]:
array([[96, 97, 80, 82],
[86, 97, 57, 94],
[85, 61, 87, 77],
[87, 94, 91, 46]])