¿Cómo manejar grandes cantidades de datos en tensorflow?

Para mi proyecto tengo grandes cantidades de datos, aproximadamente 60 GB distribuidos en archivos npy, cada uno con aproximadamente 1 GB, cada uno con aproximadamente 750.000 registros y tags.

Cada registro es un 345 float32 y las tags son 5 float32.

También leí la documentación del conjunto de datos de tensorflow y la documentación de colas / hilos, pero no puedo encontrar la mejor manera de manejar la entrada para el entrenamiento y luego cómo guardar el modelo y los pesos para futuras predicciones.

Mi modelo es bastante sencillo, se ve así:

x = tf.placeholder(tf.float32, [None, 345], name='x') y = tf.placeholder(tf.float32, [None, 5], name='y') wi, bi = weight_and_bias(345, 2048) hidden_fc = tf.nn.sigmoid(tf.matmul(x, wi) + bi) wo, bo = weight_and_bias(2048, 5) out_fc = tf.nn.sigmoid(tf.matmul(hidden_fc, wo) + bo) loss = tf.reduce_mean(tf.squared_difference(y, out_fc)) train_op = tf.train.AdamOptimizer().minimize(loss) 

La forma en que estaba entrenando mi neural network era leer los archivos uno a la vez en un orden aleatorio, luego usar una matriz de números aleatoriamente para indexar cada archivo y crear manualmente cada lote para alimentar el train_op usando feed_dict . Por todo lo que leo, esto es muy ineficiente y de alguna manera debería reemplazarlo con conjuntos de datos o cola y subprocesos, pero como dije, la documentación no fue de ninguna ayuda.

Entonces, ¿cuál es la mejor manera de manejar grandes cantidades de datos en tensorflow?

Además, como referencia, mis datos se guardaron en un archivo numpy en un paso de operación 2:

 with open('datafile1.npy', 'wb') as fp: np.save(data, fp) np.save(labels, fp) 

Las utilidades para archivos npy hecho asignan toda la matriz en la memoria. Le recomendaría que convierta todas sus matrices TFRecords formato TFRecords y use estos archivos en el entrenamiento. Esta es una de las formas más eficientes de leer grandes conjuntos de datos en tensorflow.

Convertir a TFRecords

 def array_to_tfrecords(X, y, output_file): feature = { 'X': tf.train.Feature(float_list=tf.train.FloatList(value=X.flatten())), 'y': tf.train.Feature(float_list=tf.train.FloatList(value=y.flatten())) } example = tf.train.Example(features=tf.train.Features(feature=feature)) serialized = example.SerializeToString() writer = tf.python_io.TFRecordWriter(output_file) writer.write(serialized) writer.close() 

Un ejemplo completo que trata con imágenes se puede encontrar aquí .

Leer TFRecordDataset

 def parse_proto(example_proto): features = { 'X': tf.FixedLenFeature((345,), tf.float32), 'y': tf.FixedLenFeature((5,), tf.float32), } parsed_features = tf.parse_single_example(example_proto, features) return parsed_features['X'], parsed_features['y'] def read_tfrecords(file_names=("file1.tfrecord", "file2.tfrecord", "file3.tfrecord"), buffer_size=10000, batch_size=100): dataset = tf.contrib.data.TFRecordDataset(file_names) dataset = dataset.map(parse_proto) dataset = dataset.shuffle(buffer_size) dataset = dataset.repeat() dataset = dataset.batch(batch_size) return tf.contrib.data.Iterator.from_structure(dataset.output_types, dataset.output_shapes) 

El manual de datos se puede encontrar aquí .