es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo transmitir datos en forma de múltiples archivos (b, t, f) en un conjunto de datos de Tensorflow.

Tengo una gran cantidad de datos que quiero cargar en un Dataset de Tensorflow para entrenar una red LSTM. Quiero utilizar funcionalidad de transmisión en lugar de leer todos los datos en memoria debido al tamaño de mis datos. Me está costando trabajo leer mis datos para que cada muestra i tenga la forma adecuada como (ti, m).

Código de muestra para replicar:

Cien muestras, cada una con tres características

La segunda dimensión es la cantidad de pasos temporales para cada muestra. Lo randomizaré en un paso posterior

x = np.random.randn(100,10,3)

Cien etiquetas {0,1}

y = (np.random.rand(100)>0.5)*1
y=y.reshape((-1,1))

Guardar cada muestra en su propio archivo

for i in range(len(x)):
cat = y[i][0]
data = x[i]
# Simular longitud aleatoria para cada muestra
data = data[:np.random.randint(4,10),:]
fname = 'tmp_csv/{:.0f}/{:03.0f}.csv'.format(cat,i)
np.savetxt(fname, data, delimiter=',')

Ahora tengo cien archivos csv, cada uno con una sola muestra de tamaño (ti, 3). ¿Cómo puedo leer estos archivos de vuelta en un Dataset de Tensorflow manteniendo la forma para cada muestra?

Intenté la serialización (pero no supe cómo hacerlo correctamente), aplanar para que cada muestra esté en una fila (pero no supe cómo manejar el tamaño variable de fila y cómo remodelar), e intenté con make_csv_dataset. Aquí está mi intento con make_csv_dataset:

ds = tf.data.experimental.make_csv_dataset(
file_pattern = "tmp_csv//.csv",
batch_size=10, num_epochs=1,
num_parallel_reads=5,
shuffle_buffer_size=10,
header=False,
column_names=['a','b','c']
)

for i in ds.take(1):
print(i)

… pero esto da como resultado que cada muestra tenga la forma (1,3).

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para dar forma adecuada a cada muestra (ti, m) al leer los datos de los archivos CSV en un Dataset de TensorFlow, es necesario utilizar la clase TextLineDataset para leer cada archivo línea por línea y luego dar forma al tensor resultante. Aquí está el código para hacerlo:

    import tensorflow as tf
    import numpy as np
    
    # Definir función para leer cada archivo línea por línea y dar forma al resultado
    def parse_csv_file(file_path):
        record_defaults = [tf.constant([], dtype=tf.float64)] * 3
        dataset = tf.data.TextLineDataset(file_path)
        dataset = dataset.map(lambda line: tf.io.decode_csv(line, record_defaults))
        dataset = dataset.batch(tf.shape(dataset)[0])
        return tf.reshape(dataset, [-1, tf.shape(dataset)[-1]])
    
    # Definir una función para procesar cada muestra, incluyendo la reestructuración
    def preprocess_sample(file_path):
        data = parse_csv_file(file_path)
        label = tf.strings.split(file_path, '/')[-2]
        return (data, label)
    
    # Crear un Dataset de TensorFlow usando las rutas de los archivos y la función de preprocesamiento
    ds = tf.data.Dataset.list_files("tmp_csv/*/*.csv")
    ds = ds.map(preprocess_sample)
    
    for data, label in ds.take(1):
        print("Forma de los datos:", data.shape) # Salida esperada: (t_i, m)
        print("Etiqueta:", label)
    

    Este código define una función parse_csv_file que lee cada archivo CSV línea por línea, luego utiliza TextLineDataset, decode_csv y batch para crear la forma deseada del tensor para cada muestra. La función preprocess_sample utiliza esta función para preprocesar los datos y agrega código para extraer la etiqueta de la ruta del archivo. Finalmente, se crea un Dataset de TensorFlow utilizando list_files para leer las rutas de los archivos y map para aplicar la función de preprocesamiento a cada archivo.

    Ahora el Dataset de TensorFlow resultante tendrá muestras con forma adecuada de (ti, m).

Comments are closed.