tf.shape () obtiene una forma incorrecta en tensorflow

Yo defino un tensor como este:

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

Pero cuando bash imprimir la forma del tensor:

print( tf.shape(x) )

Obtengo Tensor (“Forma: 0”, forma = (1,), dtype = int32) , por qué el resultado de la salida no debe ser shape = (100)

tf.shape (input, name = None) devuelve un tensor entero en 1-D que representa la forma de la entrada.

Está buscando: x.get_shape() que devuelve la TensorShape de la variable x .

Actualización: escribí un artículo para aclarar las formas dinámicas / estáticas en Tensorflow debido a esta respuesta: https://pgaleone.eu/tensorflow/2018/07/28/understanding-tensorflow-tensors-shape-static-dynamic/

Aclaración:

tf.shape (x) crea una operación y devuelve un objeto que representa la salida de la operación construida, que es lo que está imprimiendo actualmente. Para obtener la forma, ejecute la operación en una sesión:

 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édito: Después de ver la respuesta anterior, vi la respuesta a la función tf.rank en Tensorflow que me resultó más útil y he intentado reformularla aquí.

Sólo un ejemplo rápido, para aclarar las cosas:

 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 salida será:

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

También debería ser útil: ¿Cómo entender la forma estática y la forma dinámica en TensorFlow?

Una pregunta similar está bien explicada en las preguntas frecuentes de TF :

En TensorFlow, un tensor tiene una forma estática (inferida) y una forma dinámica (verdadera). La forma estática se puede leer utilizando el método tf.Tensor.get_shape : esta forma se deduce de las operaciones que se usaron para crear el tensor, y puede estar parcialmente completa. Si la forma estática no está completamente definida, la forma dinámica de un Tensor t puede determinarse evaluando tf.shape(t) .

Así que tf.shape() te devuelve un tensor, siempre tendrá un tamaño de shape=(N,) y se puede calcular en una sesión:

 a = tf.Variable(tf.zeros(shape=(2, 3, 4))) with tf.Session() as sess: print sess.run(tf.shape(a)) 

Por otro lado, puede extraer la forma estática utilizando x.get_shape().as_list() y esto se puede calcular en cualquier lugar.

Simplemente, use tensor.shape para obtener la forma estática :

 In [102]: a = tf.placeholder(tf.float32, [None, 128]) # returns [None, 128] In [103]: a.shape.as_list() Out[103]: [None, 128] 

Mientras que para obtener la forma dinámica , usa tf.shape() :

 dynamic_shape = tf.shape(a) 

También puede obtener la forma como lo haría en NumPy con your_tensor.shape como en el siguiente ejemplo.

 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) 

También, este ejemplo, para tensores que pueden ser evaluados.

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