web-dev-qa-db-fra.com

Comment obtenir les dimensions d'un tenseur (dans TensorFlow) au moment de la construction du graphe?

J'essaie un Op qui ne se comporte pas comme prévu.

graph = tf.Graph()
with graph.as_default():
  train_dataset = tf.placeholder(tf.int32, shape=[128, 2])
  embeddings = tf.Variable(
    tf.random_uniform([50000, 64], -1.0, 1.0))
  embed = tf.nn.embedding_lookup(embeddings, train_dataset)
  embed = tf.reduce_sum(embed, reduction_indices=0)

J'ai donc besoin de connaître les dimensions du tenseur embed. Je sais que cela peut être fait au moment de l'exécution, mais c'est trop de travail pour une opération aussi simple. Quel est le moyen le plus facile de le faire?

33
Thoran

Tensor.get_shape() de ce post .

d'après la documentation :

c = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
print(c.get_shape())
==> TensorShape([Dimension(2), Dimension(3)])
42
Thoran

Je vois que la plupart des gens sont confus à propos de tf.shape(tensor) et de tensor.get_shape(). Soyons clairs:

  1. tf.shape

tf.shape est utilisé pour la forme dynamique. Si la forme de votre tenseur est modifiable, utilisez-la. Un exemple: une entrée est une image avec une largeur et une hauteur variables, nous voulons la redimensionner à la moitié de sa taille, nous pouvons alors écrire quelque chose comme:
new_height = tf.shape(image)[0] / 2

  1. tensor.get_shape

tensor.get_shape est utilisé pour les formes fixes, ce qui signifie que le tenseur la forme peut être déduite dans le graphique.

Conclusion: tf.shape peut être utilisé presque n'importe où, mais t.get_shape uniquement pour les formes peut être déduit du graphique.

43
Shang

Une fonction pour accès les valeurs:

def shape(tensor):
    s = tensor.get_shape()
    return Tuple([s[i].value for i in range(0, len(s))])

Exemple:

batch_size, num_feats = shape(logits)
9
Colin Swaney

Imprimez simplement le graphe après construction (ops) sans exécuter:

import tensorflow as tf

...

train_dataset = tf.placeholder(tf.int32, shape=[128, 2])
embeddings = tf.Variable(
    tf.random_uniform([50000, 64], -1.0, 1.0))
embed = tf.nn.embedding_lookup(embeddings, train_dataset)
print (embed)

Cela montrera la forme du tenseur intégré:

Tensor("embedding_lookup:0", shape=(128, 2, 64), dtype=float32)

En général, il est bon de vérifier la forme de tous les tenseurs avant de former vos modèles.

5
Sung Kim

Rendons les choses simples comme l'enfer. Si vous voulez un nombre unique pour le nombre de dimensions comme 2, 3, 4, etc.,, utilisez simplement tf.rank(). Mais si vous voulez la forme exacte du tenseur, utilisez tensor.get_shape()

with tf.Session() as sess:
   arr = tf.random_normal(shape=(10, 32, 32, 128))
   a = tf.random_gamma(shape=(3, 3, 1), alpha=0.1)
   print(sess.run([tf.rank(arr), tf.rank(a)]))
   print(arr.get_shape(), ", ", a.get_shape())     


# for tf.rank()    
[4, 3]

# for tf.get_shape()
Output: (10, 32, 32, 128) , (3, 3, 1)
3
kmario23

La méthode tf.shape est une méthode statique TensorFlow. Cependant, il existe également la méthode get_shape pour la classe Tensor. Voir

https://www.tensorflow.org/api_docs/python/tf/Tensor#get_shape

1
cliffberg