我正在尝试在Conv Networks中为MaxPooling层实现fprop,没有重叠和池区域2x2。为此,我需要将输入矩阵拆分为大小为2x2的矩阵,以便我可以提取最大值。然后我创建了一个掩码,我稍后可以在bprop
中使用它。为了执行分割,我首先垂直地然后水平地分割输入矩阵,然后分别使用vsplit
,hsplit
和amax
找到最大值。这会导致崩溃,但索引越界异常,我不确定错误在哪里。有没有更简单的方法将24 x 24输入矩阵分成144个2x2矩阵,以便我可以获得最大值。
我正在执行以下操作:
for i in range(inputs.shape[0]):
for j in range(inputs.shape[1]):
for k in range(inputs.shape[2] // 2):
for h in range(inputs.shape[3] // 2):
outputs[i,j,k,h] = np.amax(np.hsplit(np.vsplit(inputs[i,j], inputs.shape[2] // 2)[k], inputs.shape[1] // 2)[h])
max_ind = np.argmax(np.hsplit(np.vsplit(inputs[i,j], inputs.shape[2] // 2)[k], inputs.shape[1] // 2)[h])
max_ind_y = max_ind // inputs.shape[2]
if (max_ind_y == 0):
max_ind_x = max_ind
else:
max_ind_x = max_ind % inputs.shape[3]
self.mask[i,j,max_ind_y + 2 * k, max_ind_x + 2 * h] = outputs[i,j,k,h]
编辑:
这是reshape产生的输出:
我想要的是
[0 1
4 5]
[2 3
6 7]
依旧......
答案 0 :(得分:1)
第1步:获取max_ind_x
,max_ind_y
我们需要得到每个块的最大元素的行,列索引 -
m,n = inputs.shape
a = inputs.reshape(m//2,2,n//2,2).swapaxes(1,2)
row, col = np.unravel_index(a.reshape(a.shape[:-2] + (4,)).argmax(-1), (2,2))
步骤2:使用argmax设置输出数组来自输入
然后,查看代码,您似乎正在尝试创建一个输出数组,其中argmax
个位置设置了输入数组中的值。因此,我们可以做 -
out = np.zeros_like(a)
M,N = a.shape[:2]
indx_tuple = np.arange(M)[:,None],np.arange(N), row, col
out[indx_tuple] = a[indx_tuple]
最后,我们可以返回输出的2D形状,这对原始输入inputs
是一个很好的验证步骤 -
out2d = out.reshape(a.shape[:2]+(2,2)).swapaxes(1,2).reshape(m,n)
示例输入,输出 -
In [291]: np.random.seed(0)
...: inputs = np.random.randint(11,99,(6,4))
In [292]: inputs
Out[292]:
array([[55, 58, 75, 78],
[78, 20, 94, 32],
[47, 98, 81, 23],
[69, 76, 50, 98],
[57, 92, 48, 36],
[88, 83, 20, 31]])
In [286]: out2d
Out[286]:
array([[ 0, 0, 0, 0],
[78, 0, 94, 0],
[ 0, 98, 0, 0],
[ 0, 0, 0, 98],
[ 0, 92, 48, 0],
[ 0, 0, 0, 0]])
答案 1 :(得分:1)
这是skimage.util
中的view_as_blocks
实现的:
blocks = skimage.util.view_as_blocks(a,(2,2))
maxs = blocks.max((2,3))