我使用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] = 10
和k = 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'。