Как реализовать последовательность поддержания глобального пула k max? - PullRequest
0 голосов
/ 20 февраля 2019

Я использую keras, а backend - тензор потока.

Я хочу глобальное 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

Но я думаю, что он сортирует значения по возрастанию или убыванию.Я сделал NN, используя этот слой, и put input_shape[1] = 10, и k = 10, но он отличается (худший результат, чем прежде), когда я не использовал эти слои.

Так как я могу заставить этот слой сохранять прежниеorder?

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, но индекс индексов имеет вид:[?, 32,10] и форма параметров: [?, 32,10] для 'global_kmax_pooling_1 / GatherNd' (op: 'GatherNd') с входными фигурами: [?, 32,10], [?, 32,10]. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...