¿Cómo entender la forma estática y la forma dinámica en TensorFlow?


En TensorFlow FAQ , dice:

En TensorFlow, un tensor tiene tanto una forma estática (inferida) como una forma dinámica (verdadera). La forma estática se puede leer usando el tf.Tensor.método get_shape (): esta forma se infiere del operaciones que se utilizaron para crear el tensor, y pueden ser parcialmente completo. Si la forma estática no está completamente definida, la forma dinámica de un Tensor t se puede determinar mediante la evaluación de tf.forma(t).

Pero todavía no puedo comprender completamente la relación entre la forma estática y la forma dinámica. ¿Hay algún ejemplo que muestre sus diferencias? Gracias.

 31
Author: Harshiv, 2016-05-08

1 answers

A veces la forma de un tensor depende de un valor que se calcula en tiempo de ejecución. Tomemos el siguiente ejemplo, donde x se define como un tf.placeholder() vector con cuatro elementos:

x = tf.placeholder(tf.int32, shape=[4])
print x.get_shape()
# ==> '(4,)'

El valor de x.get_shape() es la forma estática de x, y el (4,) significa que es un vector de longitud 4. Ahora vamos a aplicar el tf.unique() op x

y, _ = tf.unique(x)
print y.get_shape()
# ==> '(?,)'

El (?,) significa que y es un vector de longitud desconocida. ¿Por qué se desconoce? tf.unique(x) devuelve el valores únicos de x, y los valores de x son desconocidos, porque es un tf.placeholder(), por lo que no tiene valor hasta que se alimentan. Veamos qué pasa si alimentas dos valores diferentes:

sess = tf.Session()
print sess.run(y, feed_dict={x: [0, 1, 2, 3]}).shape
# ==> '(4,)'
print sess.run(y, feed_dict={x: [0, 0, 0, 0]}).shape
# ==> '(1,)'

Esperemos que esto deje claro que un tensor puede tener una forma estática y dinámica diferente. La forma dinámica siempre está completamente definida-no tiene dimensiones ?-pero la forma estática puede ser menos específica. Esto es lo que permite a TensorFlow soportar operaciones como tf.unique() y tf.dynamic_partition(), que pueden tener salidas de tamaño variable, y se utilizan en aplicaciones avanzadas.

Finalmente, el tf.shape() op se puede usar para obtener la forma dinámica de un tensor y usarla en un cálculo de TensorFlow:

z = tf.shape(y)
print sess.run(z, feed_dict={x: [0, 1, 2, 3]})
# ==> [4]
print sess.run(z, feed_dict={x: [0, 0, 0, 0]})
# ==> [1]
 44
Author: mrry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-08 05:03:12