keras注意层实现

时间:2020-01-28 15:14:45

标签: python tensorflow keras

我想根据此文章https://arxiv.org/pdf/1804.02391.pdf,使用Keras和Tensorflow实施关注层(用于2D图像)。 我成功地计算了注意力得分,但是我很难在这些得分和本地层之间实现加权和。在不考虑批处理维度的情况下,注意力得分是向量(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()))   

0 个答案:

没有答案