2017-10-16 1 views
0

J'utilise keras==2.0.8 avec tensorflow==1.3.0 backend. Voici l'exemple que je suis confondu avec:Keras ne parvient pas à définir correctement la forme dynamique de la couche

from keras.layers import Input, Reshape, Conv2DTranspose 

x = Input((5000,)) 
y = Reshape((25, 25, 8))(x) 
y = Conv2DTranspose(10, 5, padding='same', strides=2)(y) 
print(y) 

Cela fait partie de mon modèle et après ces lignes, j'utiliser y dans certaines opérations de tensorflow, mais le code ci-dessus imprime noeud de forme (?, ?, ?, 10). Je ne sais pas pourquoi TF ne peut pas déduire statiquement la hauteur et la largeur du tenseur résultant. (Je sais que keras peut, mais je veux un nœud TF avec la forme appropriée)

+0

ce qui est exactement votre question et le résultat désiré? – desertnaut

+0

Je m'attends à ce que la forme du noeud de sortie soit comme '(?, 50, 50, 10)', comme la forme de la sortie du dernier calque keras. –

Répondre

0

Si vous avez l'intention d'utiliser ces opérations tensorflow dans un modèle keras, vous devez les utiliser dans les couches Lambda.

Dans la fonction que vous créez pour la couche lambda, vous pouvez utiliser normalement le tenseur donné. A moins que vous ayez une raison très spécifique pour que tensorflow ait cette taille fixe explicite, il n'y aura pas de problème. Y at-il un besoin particulier qui vous demande d'avoir le tenseur tensorflow avec une forme explicite?

Dans Keras, vous pouvez toujours utiliser K.shape() dans un tenseur keras pour obtenir sa forme. Beaucoup de fonctions keras backend peuvent prendre cette forme (principalement avec tensorflow) en entrée. Si vous pouvez utiliser les fonctions backend de keras au lieu de fonctions tensorflow pures, votre code peut être portable vers d'autres backends plus tard.

Exemple de fonction:

def tensorflowPart(x): 

    #do tensorflow operations with the tensor x 

    shape = K.shape(x) #use the shape of the tensor, as a tensor 

    #more tensorflow operations 

    return result 

Utilisez la couche lambda dans votre modèle:

y = Lambda(tensorflowPart)(y)