2017-10-20 5 views
0

J'essaie de modèle de port this dans Keras v2 mais j'ai un problème avec la fonction suivante:Utiliser le calque Fusionner (lambda/function) sur Keras 2.0?

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)) 

Selon la documentation, mode est:

chaîne ou lambda/fonction. Si chaîne, doit être un de: 'somme', 'mul', 'concat', 'ave', 'cos', 'point', 'max'. Si lambda/fonction, il faut prendre en entrée une liste de tenseurs et renvoyer un seul tenseur.

Ce qui est fonction équivalente (lorsque le mode est fonction/lambda) dans la nouvelle version afin d'éviter Keras avertissement suivant:

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)) 

Répondre

1

Type d'une façon bizarre de mettre en œuvre un modèle .... (au moins dans keras 2 ...)

Il semble que vous devriez simplement utiliser une couche lambda avec une fonction personnalisée.

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)]) 

Cela devrait fonctionner si self.model(sent) retourne un tenseur faite par KERAS couches.


Maintenant, pour réelle fusion couches, dans keras 2 vous avez les couches:

  • Concatenate (axe = ...) (listOfTensors)
  • Add() (listOfTensors)
  • Multiply() (listOfTensors)
  • And others, y compris une couche Dot, qui "pourrait" faire la même chose que cette fonction.

Si vous utilisez la couche de points:

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

Ce test a besoin. Point et point de lot dans les keras sont des choses confuses.