【问题标题】:Keras Average Layer with Masking带遮罩的 Keras 平均层
【发布时间】:2020-02-17 15:31:23
【问题描述】:

Keras 自带的 Average 层已经支持遮罩,但是,查看 Average Layer 的源代码,我不清楚如何以及是否应用了遮罩。

我有一个输入列表,每个输入都有自己的掩码(例如,来自嵌入层)。我想要的平均层应该取那些没有被屏蔽的输入的平均值。换句话说,如果输入被屏蔽,它在计算的平均值中不应该有任何发言权。如果所有输入都被屏蔽,则输出被屏蔽并传递到下一层。

一个相关的问题是,库附带的平均层仅支持输入列表的合并功能。是否有库支持沿特定维度合并张量?是否可以将张量切成输入列表以馈入平均层?如果不是,如何在存在掩蔽的情况下沿某个维度取张量的平均值?

我倾向于编写一个自定义平均层来计算掩码并在计算输出时消耗掩码,但是从文档中不清楚如何做到这一点?

非常感谢任何指针或代码示例。

【问题讨论】:

    标签: keras merge average masking


    【解决方案1】:

    如果你看Average层的源代码,它实际上是“_Merge”层的子类,因为Average层没有覆盖“compute_mask”函数,所以它会继承“_Merge”的“compute_mask”函数"层,如下:

      def compute_mask(self, inputs, mask=None):
        if mask is None:
          return None
        if not isinstance(mask, list):
          raise ValueError('`mask` should be a list.')
        if not isinstance(inputs, list):
          raise ValueError('`inputs` should be a list.')
        if len(mask) != len(inputs):
          raise ValueError('The lists `inputs` and `mask` '
                           'should have the same length.')
        if all(m is None for m in mask):
          return None
        masks = [array_ops.expand_dims(m, axis=0) for m in mask if m is not None]
        return K.all(K.concatenate(masks, axis=0), axis=0, keepdims=False)
    

    最后4行说:如果所有输入掩码都是None,则返回None。否则,输出掩码首先连接所有不是无的掩码,然后执行“全部”操作,这意味着如果输入掩码之一被掩码(假),则结果掩码被掩码(假),并且结果掩码为真(未屏蔽)仅当所有 input_mask 均未屏蔽时(真)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      相关资源
      最近更新 更多