65 votes

Tf.shape() obtient une forme incorrecte dans tensorflow

Je définis un tenseur de cette manière:

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

Mais quand j'essaie d'afficher la forme du tenseur:

print( tf.shape(x) )

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

0 votes

J'ai trouvé cette réponse très utile pour analyser la forme d'un tenseur, même si ce n'est pas celle acceptée.

131voto

nessuno Points 12786

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

Vous recherchez : x.get_shape() qui retourne le TensorShape de la variable x.

Mise à jour : J'ai écrit un article pour clarifier les formes dynamiques/statiques dans Tensorflow à cause de cette réponse : https://pgaleone.eu/tensorflow/2018/07/28/understanding-tensorflow-tensors-shape-static-dynamic/

48 votes

x.get_shape().as_list() est une forme souvent utilisée pour convertir la forme en une liste python standard. Ajouté ici pour référence.

13voto

Lazar Valkov Points 98

Clarification :

tf.shape(x) crée une opération et renvoie un objet qui représente la sortie de l'opération construite, c'est 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]

crédit : 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ée plus utile et que j'ai essayé de reformuler ici.

10voto

mrgloom Points 1026

Juste un exemple rapide, pour clarifier les choses :

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

La sortie sera :

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

Aussi, cela devrait être utile : Comment comprendre la forme statique et la forme dynamique dans TensorFlow?

3voto

Salvador Dali Points 11667

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

En TensorFlow, un tenseur a à la fois une forme statique (inférée) et une forme dynamique (réelle). La forme statique peut être lue en utilisant la méthode tf.Tensor.get_shape : cette forme est inférée à partir des opérations qui ont été utilisées pour créer le tenseur et peut être partiellement complète. Si la forme statique n'est pas entièrement définie, la forme dynamique d'un tenseur t peut être déterminée en évaluant tf.shape(t).

Donc tf.shape() vous renvoie un tenseur, aura toujours une taille de shape=(N,), et peut ê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))

En revanche, vous pouvez extraire la forme statique en utilisant x.get_shape().as_list() et ceci peut être calculé n'importe où.

0 votes

Qu'est-ce que shape = (N,) représente? Pouvez-vous montrer un exemple lorsque la forme statique et la forme dynamique diffèrent?

0 votes

@mrgloom shape = (n,) représente un vecteur de taille n. Il n'est pas facile de montrer un tel exemple car vous devez confondre TF assez pour perdre le contrôle de la forme

2voto

mario23 Points 322

Tout simplement, utilisez tensor.shape pour obtenir la forme statique:

In [102]: a = tf.placeholder(tf.float32, [None, 128])

# retourne [None, 128]
In [103]: a.shape.as_list()
Out[103]: [None, 128]

Alors que pour obtenir la forme dynamique, 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 evalués.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X