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 evaluandotf.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.
tf.shape (input, name = None) devuelve un tensor entero 1-D que representa la forma de la entrada.
Estás buscando:
x.get_shape()
que devuelve el
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/