¿Cómo creo lotes rellenados en Tensorflow para los datos tf.train.SequenceExample utilizando la API DataSet?

Para entrenar un modelo LSTM en Tensorflow , he estructurado mis datos en un formato tf.train.SequenceExample y los he almacenado en un archivo TFRecord . Ahora me gustaría usar la nueva API DataSet para generar lotes rellenados para la capacitación . En la documentación hay un ejemplo para usar padded_batch, pero para mis datos no puedo averiguar cuál debería ser el valor de padded_shapes .

Para leer el archivo TFrecord en los lotes, he escrito el siguiente código de Python:

import math import tensorflow as tf import numpy as np import struct import sys import array if(len(sys.argv) != 2): print "Usage: createbatches.py [RFRecord file]" sys.exit(0) vectorSize = 40 inFile = sys.argv[1] def parse_function_dataset(example_proto): sequence_features = { 'inputs': tf.FixedLenSequenceFeature(shape=[vectorSize], dtype=tf.float32), 'labels': tf.FixedLenSequenceFeature(shape=[], dtype=tf.int64)} _, sequence = tf.parse_single_sequence_example(example_proto, sequence_features=sequence_features) length = tf.shape(sequence['inputs'])[0] return sequence['inputs'], sequence['labels'] sess = tf.InteractiveSession() filenames = tf.placeholder(tf.string, shape=[None]) dataset = tf.contrib.data.TFRecordDataset(filenames) dataset = dataset.map(parse_function_dataset) # dataset = dataset.batch(1) dataset = dataset.padded_batch(4, padded_shapes=[None]) iterator = dataset.make_initializable_iterator() batch = iterator.get_next() # Initialize `iterator` with training data. training_filenames = [inFile] sess.run(iterator.initializer, feed_dict={filenames: training_filenames}) print(sess.run(batch)) 

El código funciona bien si uso dataset = dataset.batch(1) (no se necesita relleno en ese caso), pero cuando uso la variante padded_batch , padded_batch el siguiente error:

TypeError: si la estructura superficial es una secuencia, la entrada también debe ser una secuencia. La entrada tiene tipo:.

¿Me puede ayudar a averiguar qué debo pasar por el parámetro padded_shapes ?

(Sé que hay muchos códigos de ejemplo que usan subprocesos y colas para esto, pero prefiero usar la nueva API DataSet para este proyecto)

Necesitas pasar una tupla de formas. En tu caso deberías pasar.

 dataset = dataset.padded_batch(4, padded_shapes=([vectorSize],[None])) 

o tratar

 dataset = dataset.padded_batch(4, padded_shapes=([None],[None])) 

Compruebe este código para más detalles. Tuve que depurar este método para averiguar por qué no funcionaba para mí.

Si su objeto de Dataset actual contiene una tupla, también puede especificar la forma de cada elemento rellenado.

Por ejemplo, tengo un conjunto de datos (same_sized_images, Labels) y cada etiqueta tiene una longitud diferente pero el mismo rango.

 def process_label(resized_img, label): # Perfrom some tensor transformations # ...... return resized_img, label dataset = dataset.map(process_label) dataset = dataset.padded_batch(batch_size, padded_shapes=([None, None, 3], [None, None])) # my label has rank 2