【发布时间】:2017-06-12 09:46:02
【问题描述】:
简而言之:我正在寻找一个简单的numpy(可能是oneliner)实现Maxpool - 在numpy.narray 上的一个窗口上的最大值,用于跨维度的窗口的所有位置。
更多细节:我正在实现一个卷积神经网络(“CNN”),这种网络中的典型层之一是MaxPool 层(例如here)。写作
y = MaxPool(x, S)、x 是输入 narray 和 S 是参数,使用伪代码,MaxPool 的输出由以下公式给出:
y[b,h,w,c] = max(x[b, s*h + i, s*w + j, c]) over i = 0,..., S-1; j = 0,...,S-1.
也就是说,y 是narray,其中索引b,h,w,c 处的值等于沿输入x 的第二和第三维的大小为S x S 的窗口所占用的最大值,窗口“角落”放置在索引b,h,w,c。
一些额外的细节:网络是使用numpy 实现的。 CNN 有许多“层”,其中一层的输出是下一层的输入。层的输入是numpy.narrays,称为“张量”。在我的例子中,张量是 4 维的 numpy.narray's、x。那就是x.shape 是一个元组(B,H,W,C)。层处理张量后,每个维度的大小都会发生变化,例如层i= 4 的输入可以有大小B = 10, H = 24, W = 24, C = 3,而输出,也就是i+1 层的输入有B = 10, H = 12, W = 12, C = 5。如 cmets 所示,应用MaxPool 后的大小为(B, H - S + 1, W - S + 1, C)。
具体来说:如果我使用
import numpy as np
y = np.amax(x, axis = (1,2))
其中x.shape 是(2,3,3,4) 这将给我我想要的,但对于我最大化的窗口大小为3 x 3 的退化情况,@987654355 的第二和第三维度的大小@,这不是我想要的。
【问题讨论】:
-
所以,输出的形状是:
(B,H-S+1,W-S+1,C),对吧? -
@Divakar 是的,你是对的,输出取决于你能在滑动窗口中放多少次
-
scipy.ndimage.maximum_filter1d实现 O(n) 算法(与窗口大小无关)
标签: python numpy neural-network conv-neural-network array-broadcasting