Я использую 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>