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?
Tensor.get_shape()
de ce post .
c = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
print(c.get_shape())
==> TensorShape([Dimension(2), Dimension(3)])
Je vois que la plupart des gens sont confus à propos de tf.shape(tensor)
et de tensor.get_shape()
. Soyons clairs:
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
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.
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)
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.
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)
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