Как выбрать топ-k элементов плотного слоя керас? - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь выполнить k-max pooling, чтобы выбрать top-k элементы плотной формы (None, 30).Я пробовал слой MaxPooling1D, но он не работает, так как для пула слоев keras требуется как минимум 2-мерная форма ввода.Я использую следующий Lambda слой, но я получил следующую ошибку:

layer_1.shape
(None, 30)
layer_2 = Lambda(lambda x: tf.nn.top_k(x, k=int(int(x.shape[-1])/2),
                                                sorted=True, 
                                                name="Top_k_final"))(layer_1)

Ошибка: файл "/usr/local/lib/python3.5/dist-packages/keras/engine/base_layer.py ", строка 474, в вызов output_shape = self.compute_output_shape (input_shape) Файл" /usr/local/lib/python3.5/dist-packages/keras/layers/core.py ", строка 652, в compute_output_shape возвращает файл K.int_shape (x)" /usr/local/lib/python3.5/dist-packages/keras/backend/tensorflow_backend.py ", строка 591, в int_shape возвращает кортеж (x.get_shape (). as_list ()) AttributeError: у объекта 'TopKV2' нет атрибута 'get_shape'

1 Ответ

0 голосов
/ 31 января 2019

Исходя из этого примера , я решил проблему.Фактически, я решил проблему, добавив .values, чтобы получить значения тензора из tf.nn.top_k, следующим образом.Но я не уверен, что мое решение правильное или нет.

layer_2 = Lambda(lambda x: tf.nn.top_k(x, k=int(int(x.shape[-1])/2),
                                                sorted=True, 
                                                name="Top_k_final").values)(layer_1)
...