1

我试图将此模型移植到Kerasv2 中,但以下功能存在问题:

  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是:

字符串或 lambda/函数。如果是字符串,则必须是以下之一:'sum'、'mul'、'concat'、'ave'、'cos'、'dot'、'max'。如果是 lambda/function,它应该将张量列表作为输入并返回单个张量。

什么是新Keras版本中的等效函数(当模式为函数/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))
4

1 回答 1

4

实现模型的一种奇怪方式......(至少在 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)返回由 keras 层制作的张量,这应该可以工作。


现在,对于实际的合并层,在 keras 2 中,您拥有以下层:

  • 连接(axis=...)(listOfTensors)
  • 添加()(张量列表)
  • Multiply()(listOfTensors)
  • 以及其他,包括一个Dot“可能”与该功能相同的层。

如果使用点图层:

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

这需要测试。keras 中的点和批处理点是令人困惑的事情。

于 2017-10-23T19:16:11.297 回答