web-dev-qa-db-fra.com

tf.shape () prend une mauvaise forme dans tensorflow

Je définis un tenseur comme ceci:

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

Mais quand j'essaye d'imprimer la forme du tenseur:

print( tf.shape(x) )

Je reçois Tenseur ("Forme: 0", forme = (1,), dtype = int32), pourquoi le résultat de la sortie ne devrait pas être forme = (100)

53
Nils Cao

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

Vous recherchez: x.get_shape() qui renvoie la 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- dynamique /

112
nessuno

Clarification:

tf.shape (x) crée un op et retourne un objet qui représente la sortie de l'op construit, qui 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]

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

11
Lazar Valkov

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)

Cela devrait également être utile: Comment comprendre la forme statique et la forme dynamique dans TensorFlow?

6
mrgloom

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

Dans TensorFlow, un tenseur a à la fois une forme statique (inférée) et dynamique (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 complète. Si la forme statique n'est pas complètement définie, la forme dynamique d'un Tenseur 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 pourra être calculé en 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 à l'aide de x.get_shape().as_list() et cela peut être calculé n'importe où.

3
Salvador Dali

Utilisez simplement tensor.shape pour obtenir le 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 le forme dynamique, utilisez tf.shape():

dynamic_shape = tf.shape(a)

Vous pouvez également obtenir la forme comme 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 evaluated.

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