Theano max_pool_3d

Theano max_pool_3d,3d,max,pool,theano,pooling,3d,Max,Pool,Theano,Pooling,如何扩展theanos downsample.max_pool_2d_same_大小,以便不仅在要素地图内,而且在要素地图之间以高效的方式进行共享 假设我得到了3个特征图,每个尺寸为10x10,这将是一个4D张量(1,3,10,10)。首先允许最大池((2,2),不重叠)每个(10,10)特征映射。结果是3个稀疏特征映射,仍然是(10,10),但大多数值等于零:在(2,2)窗口中,最多有一个值大于零。这就是downsample.max\u pool\u 2d\u相同大小所做的 接下来,我想将某个

如何扩展theanos downsample.max_pool_2d_same_大小,以便不仅在要素地图内,而且在要素地图之间以高效的方式进行共享

假设我得到了3个特征图,每个尺寸为10x10,这将是一个4D张量(1,3,10,10)。首先允许最大池((2,2),不重叠)每个(10,10)特征映射。结果是3个稀疏特征映射,仍然是(10,10),但大多数值等于零:在(2,2)窗口中,最多有一个值大于零。这就是downsample.max\u pool\u 2d\u相同大小所做的

接下来,我想将某个(2,2)窗口的每个最大值与该窗口在同一位置的所有其他特征映射的所有其他最大值进行比较。 我只想在所有特征图中保持最大值。结果再次是3个特征映射(10,10),几乎所有值都为零

有没有快速的方法?
我不介意其他max_池函数,但我需要最大值的确切位置,以便池化/取消池化(但这是另一个主题)。

我使用cudnn的千层面解决了这个问题。下面是一些如何获取最大池操作(2d和3d)索引的最小示例。看

import numpy as np
import theano
import theano.tensor as T
from theano.tensor.type import TensorType
from theano.configparser import config
import lasagne

def tensor5(name=None, dtype=None):
    if dtype is None:
        dtype = config.floatX
    type = TensorType(dtype, (False, False, False, False, False))
    return type(name)

def max_pooling_2d():
    input_var = T.tensor4('input')
    input_layer = lasagne.layers.InputLayer(shape=(None, 2, 4, 4), input_var=input_var)
    max_pool_layer = lasagne.layers.MaxPool2DLayer(input_layer, pool_size=(2, 2))

    pool_in, pool_out = lasagne.layers.get_output([input_layer, max_pool_layer])
    indices = T.grad(None, wrt=pool_in, known_grads={pool_out: T.ones_like(pool_out)})
    get_indices_fn = theano.function([input_var], indices,allow_input_downcast=True)

    data = np.random.randint(low=0, high=9, size=32).reshape((1,2,4,4))
    indices = get_indices_fn(data)
    print data, "\n\n", indices

def max_pooling_3d():
    input_var = tensor5('input')
    input_layer = lasagne.layers.InputLayer(shape=(1, 1, 2, 4, 4), input_var=input_var)
    # 5 input dimensions: (batchsize, channels, 3 spatial dimensions)
    max_pool_layer = lasagne.layers.dnn.MaxPool3DDNNLayer(input_layer, pool_size=(2, 2, 2))

    pool_in, pool_out = lasagne.layers.get_output([input_layer, max_pool_layer])
    indices = T.grad(None, wrt=pool_in, known_grads={pool_out: T.ones_like(pool_out)})
    get_indices_fn = theano.function([input_var], indices,allow_input_downcast=True)

    data = np.random.randint(low=0, high=9, size=32).reshape((1,1,2,4,4))
    indices = get_indices_fn(data)
    print data, "\n\n", indices