2016-05-04 2 views
0

Système:Impossible de connecter Lambda Layer dans Keras directement à Couche aplatie sans exception. Pourquoi?

  • Keras 1.0.1
  • Théano 0.8.2

J'ai une fonction très simple:

from keras import backend as kback 

def ave_embed(xval): 
    return kback.mean(xval, axis=1) 

J'utilise cela dans un Keras Lambda Couche suivie d'un Flatten Couche:

model.add(Lambda(ave_embed, output_shape=(d, 1))) 
model.add(Flatten()) 

Cependant, quand je compile le modèle, je reçois l'erreur suivante:

Exception: Input 0 is incompatible with layer flatten_1: expected ndim >= 3, found ndim=2 

je résoudre ce problème en procédant comme suit:

model.add(Lambda(ave_embed, output_shape=(d, 1))) 
model.add(Reshape(d,1)) 
model.add(Flatten()) 

Quelqu'un peut-il expliquer la cause de l'exception? Il semble que j'applique reshape sur une sortie qui devrait déjà être cette forme.

Répondre

0

It looks like I'm applying reshape on an output that should already be that shape.

Vous avez raison!

Si vous avez une entrée 3D et prenez la moyenne à travers la deuxième dimension (kback.mean(xval, axis=1)) votre couche Lambda vous donnera un tenseur 2d.

Pour que votre combinaison de couches Lambda et Flatten fonctionne, vous devez disposer d'au moins une entrée 4D.

Il vous suffit de retirer votre couche Flatten pour le faire fonctionner. L'ajout d'un calque Reshape et d'une cote rend votre tenseur d'entrée de votre calque Flatten en 3D mais avec une dimension inutile que vous aplatissez juste après.