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)
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 /
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.
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?
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 évaluanttf.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ù.
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 eval
uated.
In [33]: tf.shape(tensr).eval().tolist()
Out[33]: [2, 5]