具有蒙版的Keras平均层

问题描述 投票:0回答:1

[Keras随附的平均层已经支持屏蔽,但是,从平均层的源代码来看,我不清楚如何以及是否应用屏蔽。

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

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

我倾向于编写一个自定义的平均层,该层可以计算遮罩并在计算输出时使用这些遮罩,但是从文档中,尚不清楚如何这样做?

高度赞赏任何指针或代码示例。

keras merge average masking
1个回答
0
投票

[如果您查看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。否则,输出掩码将首先连接所有非None的掩码,然后执行“全部”操作,这意味着如果input_mask之一被掩码(False),则结果掩码被掩码(False),并且结果掩码为True (未屏蔽),仅当所有input_masks没有被屏蔽(真)时。

© www.soinside.com 2019 - 2024. All rights reserved.