1

我有一个 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]]

我的窗口是 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。

4

2 回答 2

3

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 块,那么实际上建议不要进行第二次整形,因为与前两次操作相比,它的计算成本很高。

这是因为转置创建了一个不连续的数组。现在,连续数组和非连续数组之间的一个区别是重塑连续数组的成本几乎为零,而重塑非连续数组通常会强制复制。

于 2017-01-23T19:17:37.640 回答
1

重塑将两个轴中的每一个拆分为两个,以使拆分轴中的后者具有与块大小相同的长度。这会给我们一个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]])
于 2017-01-23T19:32:45.763 回答