tf.shape () prend une forme incorrecte dans tensorflow

Je définis un tenseur comme celui-ci:

x = tf.get_variable("x", [100])

Mais quand j’essaie d’imprimer la forme du tenseur:

print( tf.shape(x) )

Je reçois le Tensor (“Shape: 0”, shape = (1,), dtype = int32) , pourquoi le résultat de la sortie ne devrait pas être shape = (100)

tf.shape (input, name = None) retourne un tenseur entier 1-D représentant la forme de l’entrée.

Vous recherchez: x.get_shape() qui renvoie la forme TensorShape de la variable x .

Clarification:

tf.shape (x) crée un op et renvoie un object qui représente la sortie de l’op construit, ce que vous imprimez actuellement. Pour obtenir la forme, exécutez l’opération dans une session:

 matA = tf.constant([[7, 8], [9, 10]]) shapeOp = tf.shape(matA) print(shapeOp) #Tensor("Shape:0", shape=(2,), dtype=int32) with tf.Session() as sess: print(sess.run(shapeOp)) #[2 2] 

credit: Après avoir examiné la réponse ci-dessus, j’ai vu la réponse à la fonction tf.rank dans Tensorflow que j’ai trouvé plus utile et j’ai essayé de la reformuler ici.

Juste un exemple rapide basé sur la réponse de @Salvador Dali.

 a = tf.Variable(tf.zeros(shape=(2, 3, 4))) print("a v1", tf.shape(a)) print("a v2", a.get_shape()) with tf.Session() as sess: print("a v3", sess.run(tf.shape(a))) 

La sortie sera:

 a v1 Tensor("Shape:0", shape=(3,), dtype=int32) a v2 (2, 3, 4) a v3 [2 3 4] 

Une question similaire est bien expliquée dans TF FAQ :

Dans TensorFlow, un tenseur a à la fois une forme statique (inférée) et une forme dynamic (vraie). La forme statique peut être lue à l’aide de la méthode tf.Tensor.get_shape : cette forme est déduite des opérations utilisées pour créer le tenseur et peut être partiellement terminée. Si la forme statique n’est pas entièrement définie, la forme dynamic d’un Tensor t peut être déterminée en évaluant tf.shape(t) .

Ainsi, tf.shape() vous renvoie un tenseur, aura toujours une taille de shape=(N,) et pourra être calculé dans une session:

 a = tf.Variable(tf.zeros(shape=(2, 3, 4))) with tf.Session() as sess: print sess.run(tf.shape(a)) 

D’autre part, vous pouvez extraire la forme statique en utilisant x.get_shape().as_list() et cela peut être calculé n’importe où.

Simplement, utilisez tensor.shape pour obtenir la forme statique :

 In [102]: a = tf.placeholder(tf.float32, [None, 128]) # returns [None, 128] In [103]: a.shape.as_list() Out[103]: [None, 128] 

Alors que pour obtenir la forme dynamic , utilisez tf.shape() :

 dynamic_shape = tf.shape(a) 

Vous pouvez également obtenir la forme comme vous le feriez dans NumPy avec your_tensor.shape comme dans l’exemple suivant.

 In [11]: tensr = tf.constant([[1, 2, 3, 4, 5], [2, 3, 4, 5, 6]]) In [12]: tensr.shape Out[12]: TensorShape([Dimension(2), Dimension(5)]) In [13]: list(tensr.shape) Out[13]: [Dimension(2), Dimension(5)] In [16]: print(tensr.shape) (2, 5) 

Aussi, cet exemple, pour les tenseurs qui peuvent être évalués.

 In [33]: tf.shape(tensr).eval().tolist() Out[33]: [2, 5]