Я хочу определить свой пользовательский слой пула, вместо того, чтобы возвращать максимальные значения, такие как слой MaxPooling, он вывел бы k максимальных значений и k минимальных значений.
Я использую Tensorflow в качестве бэкэнда.
Мне нужно, чтобы выходной вектор был отсортирован.
Я думал об этом:
from keras.layers.pooling import _Pooling1D
class MinMaxPooling1D(_Pooling1D):
def __init__(self, output_dim, **kwargs):
self.output_dim = output_dim
super(MinMaxPooling1D, self).__init__(**kwargs)
def _pooling_function(self, inputs, **kwargs):
sorted_ = tf.contrib.framework.sort(inputs, axis = -1)
print(sorted_)
return np.concatenate((sorted_[:,:,:self.output_dim/2], sorted_[:,:,-self.output_dim/2:]))
Но тогда я получаю:
Tensor("min_max_pooling1d_1/sort/Neg_1:0", shape=(?, 1, 1, ?), dtype=float32)
ValueError: zero-dimensional arrays cannot be concatenated
Слой MinMaxPooling1D применяется к выводу формы (Нет, 1, 10).
Тогда я думал о добавлении слоя Flatten перед слоем MinMaxPooling1D, но затем возникла проблема с размером:
ValueError: Input 0 is incompatible with layer min_max_pooling1d_5: expected ndim=3, found ndim=2