python - que - Problema al alimentar una lista en feed_dict en TensorFlow
tensorflow java tutorial (2)
Aquí hay un ejemplo correcto:
batch_size, input_size, n = 2, 3, 2
# in your case n = 10
x = tf.placeholder(tf.types.float32, shape=(n, batch_size, input_size))
y = tf.add(x, x)
data = np.random.rand(n, batch_size, input_size)
sess = tf.Session()
print sess.run(y, feed_dict={x: data})
Y aquí hay cosas extrañas que veo en su enfoque. Por algún motivo, utiliza 10 * [tf.placeholder(...)]
, que crea 10 tensores de tamaño (batch_size, input_size)
. No tengo idea de por qué haces esto, si solo puedes crear en Tensor de rango 3 (donde la primera dimensión es 10).
Debido a que tiene una lista de tensores (y no un tensor), no puede alimentar sus datos a esta lista (pero en mi caso puedo alimentar mi tensor).
Estoy tratando de pasar una lista a feed_dict, sin embargo, tengo problemas para hacerlo. Digamos que tengo:
inputs = 10 * [tf.placeholder(tf.float32, shape=(batch_size, input_size))]
donde las entradas se alimentan en algunas funciones "salidas" que quiero calcular. Entonces, para ejecutar esto en tensorflow, creé una sesión y ejecuté lo siguiente:
sess.run(outputs, feed_dict = {inputs: data})
#data is my list of inputs, which is also of length 10
pero obtengo un error, TypeError: tipo insabrable: ''list''. Sin embargo, puedo pasar los datos en forma de elemento así:
sess.run(outputs, feed_dict = {inputs[0]: data[0], ..., inputs[9]: data[9]})
Entonces me pregunto si hay alguna forma de resolver este problema. También intenté construir un diccionario (utilizando un bucle for), sin embargo, esto da como resultado un diccionario con un solo elemento, donde la clave es: "tensorflow.python.framework.ops.Tensor at 0x107594a10"
Hay dos problemas que están causando problemas aquí:
El primer problema es que la llamada Session.run()
solo acepta un pequeño número de tipos como las claves del feed_dict
. En particular, las listas de tensores no son compatibles como claves, por lo que debe colocar cada tensor como una clave separada. * Una forma conveniente de hacer esto es usar una comprensión de diccionario:
inputs = [tf.placeholder(...), ...]
data = [np.array(...), ...]
sess.run(y, feed_dict={i: d for i, d in zip(inputs, data)})
El segundo problema es que la sintaxis 10 * [tf.placeholder(...)]
en Python crea una lista con diez elementos, donde cada elemento es el mismo objeto tensor (es decir, tiene la misma propiedad de name
, la misma propiedad de id
, y es idéntico a la referencia si compara dos elementos de la lista usando inputs[i] is inputs[j]
). Esto explica por qué, cuando trataste de crear un diccionario utilizando los elementos de la lista como claves, terminaste con un diccionario con un solo elemento, porque todos los elementos de la lista eran idénticos.
Para crear 10 diferentes tensores de marcador de posición, tal como lo desea, debería hacer lo siguiente:
inputs = [tf.placeholder(tf.float32, shape=(batch_size, input_size))
for _ in xrange(10)]
Si imprime los elementos de esta lista, verá que cada elemento es un tensor con un nombre diferente.
EDITAR: * Ahora puede pasar tuplas como las claves de un feed_dict
, porque pueden usarse como claves del diccionario.