Path: blob/master/site/es-419/datasets/common_gotchas.md
25115 views
Errores comunes de implementación
En esta página, se describen los errores de implementación comunes al implementar un conjunto de datos nuevo.
Se debe evitar el SplitGenerator
heredado
La API tfds.core.SplitGenerator
antigua está en desuso.
Se debe reemplazar con:
Justificación: la nueva API es menos detallada y más explícita. La antigua API se eliminará en las versiones futuras.
Los nuevos conjuntos de datos deben estar autónomos en una carpeta
Al agregar un conjunto de datos adentro del repositorio tensorflow_datasets/
, asegúrese de seguir la estructura del conjunto de datos como carpeta (todas las sumas de comprobación, los datos ficticios, el código de implementación autónomo en una carpeta).
Conjuntos de datos antiguos (malos):
<category>/<ds_name>.py
Conjuntos de datos nuevos (buenos):
<category>/<ds_name>/<ds_name>.py
Use la CLI de TFDS ( tfds new
o gtfds new
para trabajadores de Google) para generar la plantilla.
Justificación: la estructura antigua requería rutas absolutas para las sumas de comprobación, datos falsos y distribuía los archivos del conjunto de datos en muchos lugares. Dificultaba la implementación de conjuntos de datos fuera del repositorio TFDS. Para mantener la coherencia, ahora la nueva estructura debería usarse en todas partes.
Las listas de descripciones deben tener formato de Markdown
El str
de DatasetInfo.description
tiene el formato Markdown. Las listas Markdown requieren una línea vacía antes del primer elemento:
Justificación: La descripción mal formateada crea artefactos visuales en la documentación de nuestro catálogo. Sin las líneas vacías, el texto anterior se representaría así:
Algún texto. 1. Elemento 1 2. Elemento 1 3. Elemento 1 Algún otro texto
Olvidarse los nombres de ClassLabel
Cuando use tfds.features.ClassLabel
, intente proporcionar las etiquetas str
que puedan leer por humanos con names=
o names_file=
(en lugar de num_classes=10
).
Justificación: Las etiquetas que pueden leer los humanos se usan en muchos lugares:
Permiten generar el
str
directamente en_generate_examples
:yield {'label': 'dog'}
Se exponen en los usuarios como
info.features['label'].names
(método de conversión.str2int('dog')
,... también disponible)Se usan en las utilidades de visualización
tfds.show_examples
,tfds.as_dataframe
Olvidarse la forma de la imagen
Cuando se usan tfds.features.Image
, tfds.features.Video
, si las imágenes tienen forma estática, se deben especificar explícitamente:
Justificación: permite la inferencia de formas estáticas (por ejemplo, ds.element_spec['image'].shape
), que es necesaria para el procesamiento por lotes (el procesamiento por lotes de imágenes de forma desconocida requeriría que primero se cambie su tamaño).
Mejor un tipo más específico que tfds.features.Tensor
Cuando sea posible, elija los tipos más específicos tfds.features.ClassLabel
, tfds.features.BBoxFeatures
,... en lugar del tfds.features.Tensor
genérico.
Justificación: además de ser semánticamente más correctas, las funciones específicas proporcionan metadatos adicionales a los usuarios y las herramientas pueden detectarlas.
Importaciones perezosas en el espacio global
Las importaciones perezosas no deberían llamarse desde el espacio global. Por ejemplo, lo siguiente es incorrecto:
Justificación: el uso de importaciones diferidas en el espacio global importaría el módulo para todos los usuarios de tfds y anularía el propósito de las importaciones diferidas.
Cálculo dinámico de divisiones en el entrenamiento/la prueba
Si el conjunto de datos no proporciona divisiones oficiales, TFDS tampoco debería hacerlo. Se debe evitar lo siguiente:
Justificación: el TFDS intenta proporcionar conjuntos de datos que sean lo más parecidos a los datos originales. En su lugar, se debe usar la API de subdivisión para permitir a los usuarios crear dinámicamente las subdivisiones que deseen:
Guía de estilo de Python
Mejor usar la API pathlib
En lugar de la API tf.io.gfile
, es mejor usar la API pathlib. Todos los métodos dl_manager
devuelven objetos similares a pathlib compatibles con GCS, S3,...
Justificación: la API pathlib es una API de archivos moderna orientada a objetos que elimina el texto repetitivo. El uso de .read_text()
/ .read_bytes()
también garantiza que los archivos se cierren correctamente.
Si el método no usa self
, debería ser una función.
Si un método de clase no usa self
, debería ser una función simple (definida fuera de la clase).
Justificación: queda explícito para el lector que la función no tiene efectos secundarios ni entradas/salidas ocultas:
Importaciones diferidas en Python
Importamos de forma diferida los módulos grandes como TensorFlow. Las importaciones diferidas difieren la importación real del módulo hasta el primer uso del módulo. Por lo tanto, los usuarios que no necesiten este módulo grande nunca lo importarán.
En el fondo, la clase LazyModule
actúa como una fábrica, que solo importará el módulo cuando se acceda a un atributo (__getattr__
).
También se puede usar de forma conveniente con un administrador de contexto: