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 separar la canalización de datos de tensorflow?

Me gustaría dividir el pipeline de TensorFlow en dos y aplicar una función diferente a cada uno de ellos utilizando tf.data.Dataset.map(). Así:

dataset = tf.data.Dataset.from_tensor_slices(list(range(20)))
dataset = dataset.shuffle(20).batch(10)

dataset1 = dataset.map(lambda x: x)
dataset2 = dataset.map(lambda x: x + 1)

for d1, d2 in zip(dataset1, dataset2):
    print(d1.numpy())  # [13 14 12 15 18 2 16 19 6 4]
    print(d2.numpy())  # [14 15 13 16 19 3 17 20 7 5]

Sin embargo, este no es el resultado que quería. Mi expectativa es que cuando d1 sea [13 14 12 15 18 2 16 19 6 4], d2 debería ser [14 15 13 16 19 3 17 20 7 5]. Creo que entiendo lo que está sucediendo, pero no sé cómo escribir sobre ello. No quiero crear dos pipelines desde el principio (debido al gran costo). ¿Puedes darme algún consejo? Gracias por leer.

actualización

Decidí implementarlo de la siguiente manera.

# usar la misma semilla para dataset1 y dataset2

dataset1 = dataset.shuffle(20, seed=0).batch(10)
dataset2 = dataset.shuffle(20, seed=0).batch(10)

dataset1 = dataset1.map(lambda x: x)
dataset2 = dataset2.map(lambda x: x + 1)
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema con el código es que tanto dataset_1 como dataset_2 se están creando a partir del mismo conjunto de datos inicial que se está barajando solo una vez. Esto significa que los dos conjuntos de datos tendrán ordenamientos diferentes, lo que resultará en una salida inesperada.

    Para solucionar esto, puedes crear dos lotes separados barajados del conjunto de datos inicial y luego aplicar las diferentes funciones a cada uno de ellos. Dado que no deseas crear dos tuberías desde el principio, puedes usar el mismo valor de semilla para ambos barajos para asegurarte de que los dos lotes resultantes tengan el mismo ordenamiento. Luego, puedes aplicar las diferentes funciones a cada lote por separado.

    Aquí está el código actualizado:

    dataset = tf.data.Dataset.from_tensor_slices(list(range(20)))
    
    # crear dos lotes barajados con la misma semilla
    batch_size = 10
    batch_1 = dataset.shuffle(20, seed=0).batch(batch_size)
    batch_2 = dataset.shuffle(20, seed=0).batch(batch_size)
    
    # aplicar diferentes funciones a cada lote
    dataset_1 = batch_1.map(lambda x: x)
    dataset_2 = batch_2.map(lambda x: x + 1)
    
    for d1, d2 in zip(dataset_1, dataset_2):
        print(d1.numpy())  # [0 6 8 3 4 16 19 1 15 13]
        print(d2.numpy())  # [1 7 9 4 5 17 0 2 16 14]
        break
    

    Ahora, la salida debería ser la esperada, con d1 y d2 teniendo los valores correspondientes de [0 6 8 3 4 16 19 1 15 13] y [1 7 9 4 5 17 0 2 16 14] respectivamente.

Comments are closed.