Я хотел бы реализовать слой внимания (для 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()))