TensorFlow – Definir la forma de una variable dinámicamente, dependiendo de la forma de otra variable

Digamos que tengo un cierto Tensor x cuyas dimensiones no están definidas en la inicialización del gráfico.

Puedo obtener su forma usando:

 x_shape = tf.shape(input=x) 

Ahora si quiero crear una variable basada en los valores definidos en x_shape usando:

 y = tf.get_variable(variable_name="y", shape=[x_shape[0], 10]) 

Recibo un error, ya que los valores pasados ​​a la forma del argumento deben ser int y no Tensor . ¿Cómo puedo crear una variable de forma dinámica sin utilizar marcadores de posición?

Puedes usar x.get_shape() :

 y = tf.get_variable('y', shape=[x.get_shape()[0], 10]) 

Me estoy quedando sin tiempo, por lo que es rápido y sucio, pero tal vez le ayude a llegar a su solución … Se basa en esto (tamaño dynamic para tf.zeros) pero extiende la idea a tf.Variables. Como tu variable necesita inicializarse de todos modos, elijo 0s …

 import tensorflow as tf I1_ph = tf.placeholder(name = "I1",shape=(None,None,None),dtype=tf_dtype) zerofill = tf.fill(tf.shape(I1_ph), 0.0) myVar = tf.Variable(0.0) updateMyVar = tf.assign(myVar,zerofill,validate_shape=False) res, = sess.run([updateMyVar], { I1_ph:np.zeros((1,2,2)) } ) print ("dynamic variable shape",res.shape) res, = sess.run([updateMyVar], { I1_ph:np.zeros((3,5,2)) } ) print ("dynamic variable shape",res.shape) 
 import tensorflow as tf x = tf.zeros(shape=[10,20]) x_shape = x.get_shape().as_list() y = tf.get_variable(shape=x_shape, name = 'y') 

Actualizar

No puedes crear tf.Variable con un tamaño desconocido. Por ejemplo, este código no es válido:

 y = tf.get_variable(shape=[None, 10], name = 'y') 

El primer argumento es el nombre de la variable.

 x = tf.zeros(shape=[10,20]) x_shape = x.shape variable_name ='y' y = tf.get_variable(variable_name, shape=[x_shape[0], x_shape[1]])