Cómo ingresar una lista de listas con diferentes tamaños en tf.data.Dataset

Tengo una larga lista de listas de enteros (que representan oraciones, cada una de diferentes tamaños) que deseo alimentar utilizando la biblioteca tf.data. Cada lista (de las listas de listas) tiene una longitud diferente, y recibo un error, que puedo reproducir aquí:

t = [[4,2], [3,4,5]] dataset = tf.data.Dataset.from_tensor_slices(t) 

El error que recibo es:

 ValueError: Argument must be a dense tensor: [[4, 2], [3, 4, 5]] - got shape [2], but wanted [2, 2]. 

¿Hay alguna forma de hacer esto?

EDIT 1: para que quede claro, no quiero rellenar la lista de entrada de listas (es una lista de oraciones que contiene más de un millón de elementos, con longitudes variables) Quiero usar la biblioteca tf.data para alimentar, en una forma adecuada, una lista de listas con longitud variable.

Puede usar tf.data.Dataset.from_generator() para convertir cualquier objeto de Python iterable (como una lista de listas) en un Dataset :

 t = [[4, 2], [3, 4, 5]] dataset = tf.data.Dataset.from_generator(lambda: t, tf.int32, output_shapes=[None]) iterator = dataset.make_one_shot_iterator() next_element = iterator.get_next() with tf.Session() as sess: print(sess.run(next_element)) # ==> '[4, 2]' print(sess.run(next_element)) # ==> '[3, 4, 5]' 

No creo que tensorflow sea compatible con tensores con un número variable de elementos a lo largo de una dimensión determinada.

Sin embargo, una solución simple es rellenar las listas anidadas con ceros finales (cuando sea necesario):

 t = [[4,2], [3,4,5]] max_length = max(len(lst) for lst in t) t_pad = [lst + [0] * (max_length - len(lst)) for lst in t] print(t_pad) dataset = tf.data.Dataset.from_tensor_slices(t_pad) print(dataset) 

Salidas:

 [[4, 2, 0], [3, 4, 5]]  

Los ceros no deberían ser un gran problema para el modelo: semánticamente son solo oraciones adicionales de tamaño cero al final de cada lista de oraciones reales.

Además de la respuesta de @mrry, el siguiente código también es posible si desea crear un par (imágenes, tags):

 import itertools data = tf.data.Dataset.from_generator(lambda: itertools.izip_longest(images, labels), output_types=(tf.float32, tf.float32), output_shapes=(tf.TensorShape([None, None, 3]), tf.TensorShape([None]))) iterator = dataset.make_one_shot_iterator() next_element = iterator.get_next() with tf.Session() as sess: image, label = sess.run(next_element) # ==> shape: [320, 420, 3], [20] image, label = sess.run(next_element) # ==> shape: [1280, 720, 3], [40]