如何实现全局k max池维护顺序?

时间:2019-02-20 01:51:33

标签: python keras

我使用keras,后端是tensorflow。

我想要这样的全局k maxpooling,

k = 2

[1,7,3,5] -> [7,5]

我想像这样使用GlobalKmaxPoolingLayer():

convs = Conv1D(filters = self.filter_size,\
                        kernel_size = self.window_size,strides = 1,\
                        padding='same')(embedding_layer)

convs = (GlobalKmaxPoolingLayer(k)(convs)

所以我从https://github.com/keras-team/keras/issues/373那里找到了很好的提示

class GlobalKmaxPoolingLayer(Layer):

    def __init__(self,k, **kwargs):
        super().__init__(**kwargs)
        self.k = k

    def compute_output_shape(self, input_shape):
        return (input_shape[0], self.k , input_shape[2])

    def call(self, inputs):
        inputs = tf.transpose(inputs, [0, 2, 1])
        inputs,indices = tf.nn.top_k(inputs,k = self.k, sorted = False)
        inputs = tf.transpose(inputs,[0,2,1])
        return inputs

但是我认为它对值进行升序或降序排序。我使用该层以及put input_shape[1] = 10k = 10来制作NN,但是当我不使用该层时,它会有所不同(结果比以前更糟)。

那么我该如何使该层保持在预定顺序之前?

def call(self, inputs):
    inputs = tf.transpose(inputs, [0, 2, 1])
    inputs,indices = tf.nn.top_k(inputs,k = self.k, sorted = False)#
    inputs = tf.gather_nd(inputs,indices)
    return inputs

我这样做了,但是发生了这个错误:

  

indices.shape [-1]必须为<= params.rank,但对于'global_kmax_pooling_1 / GatherNd',索引格式为[?,32,10],参数格式为[?,32,10](op:输入形状为[?,32,10],[?, 32,10]的'GatherNd'。

0 个答案:

没有答案