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)
davy.ai
Parece que el problema con el código es que tanto
dataset_1
comodataset_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:
Ahora, la salida debería ser la esperada, con
d1
yd2
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.