реализация уровня внимания keras - PullRequest
0 голосов
/ 28 января 2020

Я хотел бы реализовать слой внимания (для 2D-изображений) с использованием Keras и Tensorflow на основе этой статьи: https://arxiv.org/pdf/1804.02391.pdf. Мне удалось вычислить оценки внимания, но у меня возникли трудности с реализацией взвешенной суммы между этими показателями и локальным уровнем. Без учета размерности партии оценка внимания представляет собой вектор (a1, ..., an), где ai - скаляр, а слой - тензор (l1, ..., ln), где li - 2D-изображение (особенность карта). Взвешенная сумма равна a1 * l1 + ... + an * ln, но Keras (или Tensorflow) не позволяет умножать вектор на тензор. Я попытался изменить вектор к тензорному измерению и позволить Tensorflow транслировать вектор, но это не работает. Более того, я не знаю, выполняется ли это вещание подходящим образом (имеется в виду, что первым элементом полученного тензора вещания должна быть матрица, заполненная значением a1). Не могли бы вы помочь реализовать эту взвешенную сумму, это мой код ниже? В моем коде локальная особенность - x [0], а глобальная функция x [1].

class AttentionLayer(Layer):

    def _init_(self, **kwargs):

        super(AttentionLayer, self)._init_(**kwargs)
        self.output_dim = 1
        self.output_size

    def call(self, x, mask = None):

        # Compute the attention score
        x1 = tensorflow.multiply(x[0], x[1])
        compatibility_score = tensorflow.map_fn(lambda x: tensorflow.reduce_sum(x, [0, 1]), x1)
        attention_score = tensorflow.map_fn(lambda x: tensorflow.nn.softmax(x), compatibility_score)


        # Apply the attention score to each slice of the local feature
        attention_score = tensorflow.reshape(attention_score, x[0].get_shape())
        attention_map = attention_score * x[0]

        self.output_size = str(attention_map.get_shape().as_list())

        return attention_map


    def compute_output_shape(self, input_shape):
        shape = self.output_size
        return shape

    def get_config(self):

        config = {
            'output_dim': self.output_dim
        }

        base_config = super(AttentionLayer, self).get_config()

        return dict(list(base_config.items()) + list(config.items()))   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...