python python-3.x tensorflow tensor

python - tf.shape() tiene una forma incorrecta en tensorflow



python-3.x (5)

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 mirar la respuesta anterior, vi la respuesta a la función tf.rank en Tensorflow, que me pareció más útil y he intentado reformularla aquí.

Defino un tensor como este:

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

Pero cuando intento imprimir la forma del tensor:

print( tf.shape(x) )

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


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 , use 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)

Además, este ejemplo, para tensores que pueden evaluarse.

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


Solo un ejemplo rápido, para dejar las cosas claras:

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 esto debería ser útil: ¿Cómo entender la forma estática y la forma dinámica en TensorFlow?


Una pregunta similar se explica muy bien en TF FAQ :

En TensorFlow, un tensor tiene una forma estática (inferida) y una dinámica (verdadera). La forma estática se puede leer usando el método tf.Tensor.get_shape : esta forma se infiere 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) .

Entonces tf.shape() devuelve un tensor, siempre tendrá un tamaño de shape=(N,) y puede calcularse 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.