在 Keras 2.0 上使用合并层 (lambda/function)?

Use Merge layer (lambda/function) on Keras 2.0?

我试图将 this 模型移植到 Keras v2,但我在使用以下函数时遇到问题:

  def __call__(self, sent1, sent2):
        def _outer(AB):
            att_ji = K.batch_dot(AB[1], K.permute_dimensions(AB[0], (0, 2, 1)))
            return K.permute_dimensions(att_ji, (0, 2, 1))

        return merge([self.model(sent1), self.model(sent2)], mode=_outer,
                     output_shape=(self.max_length, self.max_length))

根据文档,mode 是:

String or lambda/function. If string, must be one of: 'sum', 'mul', 'concat', 'ave', 'cos', 'dot', 'max'. If lambda/function, it should take as input a list of tensors and return a single tensor.

Keras 版本中的等效函数(当模式为 function/lambda 时)是什么以避免以下警告:

UserWarning: The `merge` function is deprecated and will be removed after 08/2017. Use instead layers from `keras.layers.merge`, e.g. `add`, `concatenate`, etc.
  return merge([attention, sentence], mode=_normalize_attention, output_shape=(self.max_length, self.nr_hidden))

一种实现模型的奇怪方式....(至少在 keras 2 中...)

看来您应该只使用带有自定义函数的 lambda 层。

def __call__(self, sent1, sent2):
    def _outer(AB) #custom function
        att_ji = K.batch_dot(AB[1], K.permute_dimensions(AB[0], (0, 2, 1)))    
        return K.permute_dimensions(att_ji, (0, 2, 1))

    return Lambda(_outer, 
                  output_shape=(self.max_length,self.max_length))([
                                           self.model(sent1), 
                                           self.model(sent2)])

如果 self.model(sent) returns 由 keras 层制作的张量,这应该有效。


现在,对于实际的合并层,在 keras 2 中你有这些层:

  • 连接(轴=...)(张量列表)
  • 添加()(张量列表)
  • 乘法()(张量列表)
  • And others,包括一个 Dot 层,"might" 与该函数的作用相同。

如果使用点层:

return Dot()([self.model(sent1),self.model(sent2)])

这需要测试。 keras 中的 dot 和 batch dot 是令人困惑的事情。