Saltar al contenido

tf.data.Dataset: ¿cómo obtener el tamaño del conjunto de datos (número de elementos en una época)?

Luego de de esta extensa búsqueda de información pudimos resolver este disgusto que tienen algunos de nuestros usuarios. Te regalamos la respuesta y nuestro objetivo es serte de mucha apoyo.

Solución:

len(list(dataset)) funciona en modo impaciente, aunque obviamente no es una buena solución general.

Echa un vistazo aquí: https://github.com/tensorflow/tensorflow/issues/26966

No funciona para conjuntos de datos TFRecord, pero funciona bien para otros tipos.

TL;RD:

num_elements = tf.data.experimental.cardinality(conjunto de datos).numpy()

tf.data.Dataset.list_files crea un tensor llamado MatchingFiles:0 (con el correspondiente prefix si es aplicable).

podrías evaluar

tf.shape(tf.get_default_graph().get_tensor_by_name('MatchingFiles:0'))[0]

para obtener el número de archivos.

Por supuesto, esto funcionaría solo en casos simples, y en particular si solo tiene una muestra (o un número conocido de muestras) por imagen.

En situaciones más complejas, por ejemplo, cuando no conoce la cantidad de muestras en cada archivo, solo puede observar la cantidad de muestras cuando finaliza una época.

Para hacer esto, puede ver el número de épocas que cuenta su Dataset. repeat() crea un miembro llamado _count, que cuenta el número de épocas. Al observarlo durante sus iteraciones, puede detectar cuándo cambia y calcular el tamaño de su conjunto de datos a partir de ahí.

Este contador puede estar enterrado en la jerarquía de Datasets que se crea al llamar a funciones miembro sucesivamente, por lo que tenemos que desenterrarlo así.

d = my_dataset
# RepeatDataset seems not to be exposed -- this is a possible workaround 
RepeatDataset = type(tf.data.Dataset().repeat())
try:
  while not isinstance(d, RepeatDataset):
    d = d._input_dataset
except AttributeError:
  warnings.warn('no epoch counter found')
  epoch_counter = None
else:
  epoch_counter = d._count

Tenga en cuenta que con esta técnica, el cálculo del tamaño de su conjunto de datos no es exacto, porque el lote durante el cual epoch_counter se incrementa normalmente mezcla muestras de dos épocas sucesivas. Por lo tanto, este cálculo es preciso hasta la longitud de su lote.

Acuérdate de que te brindamos la opción de añadir una estimación correcta si diste con el hallazgo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *