Hace bastante tiempo que experimenté combinando dos de mis intereses: la ciencia de datos y los videojuegos. Para un pequeño proyecto personal, extraje imágenes de dos de mis juegos favoritos de GameBoy ( Super Mario Land 2: 6 Golden Coins y Wario Land: Super Mario Land 3 ) y construí un clasificador de imágenes que detecta de qué juego proviene una imagen. ¡Fue muy divertido!
Pero este proyecto prácticamente nunca dejó un Jupyter Notebook 🙈 Y aunque personalmente me gustan los Notebooks como una herramienta de narración para una narrativa estructurada (y algo de experimentación ad-hoc), tal configuración tiene bastantes limitaciones. Para empezar, construir cualquier proyecto ML/DL es un proceso iterativo, a menudo con docenas o cientos de experimentos. Cada uno de ellos preprocesa los datos de forma ligeramente diferente, agrega algunas funciones nuevas, utiliza un modelo diferente y sus hiperparámetros, etc.
¿Cómo rastrear todo eso? Podríamos crear una hoja de cálculo y anotar manualmente todos los detalles. Pero estoy seguro de que se volvería muy molesto y engorroso después de unas pocas iteraciones. Y si bien esto podría funcionar para algunos de los puntos que he mencionado, no resolvería el problema con los datos. Simplemente no podemos rastrear datos y sus transformaciones tan fácilmente en una hoja de cálculo.
Es por eso que esta vez me gustaría abordar este proyecto de manera diferente, es decir, usar las herramientas disponibles para tener un proyecto debidamente versionado (que incluya datos) con seguimiento de experimentos y algunas verificaciones de cordura de los datos. Suena mucho mejor que el seguimiento de experimentos en una hoja de cálculo, ¿verdad?
En este artículo, le mostraré cómo usar herramientas como DagsHub, DVC, MLFlow y GitHub Actions para crear un proyecto ML/DL completo. Cubriremos los siguientes temas:
¡Vamos a saltar directamente a eso!
Como ya mencioné en la introducción, intentaremos resolver un problema de clasificación de imágenes binarias. Cuando trabajé anteriormente en este proyecto, comparé el rendimiento de un modelo de regresión logística con el de una red neuronal convolucional. En este proyecto, implementaremos este último usando keras
.
A continuación puede encontrar un ejemplo de las imágenes con las que trabajaremos.
No entraré en muchos detalles en términos de obtener los datos, procesarlos, construir la CNN o incluso evaluar los modelos, ya que ya los he cubierto bastante en el pasado. Si está interesado en esas partes, consulte mis artículos anteriores:
keras
,
Para el enfoque v2 de esta tarea de clasificación de imágenes, utilizamos la siguiente estructura de proyecto:
. ├── README.md ├── .github │ └── workflows │ └── data_validation.yml ├── data │ ├── processed │ │ ├── test │ │ │ ├── mario │ │ │ ── wario │ │ └── train │ │ ├── mario │ │ └── wario │ ├── raw │ │ ├── mario │ │ └── wario │ └── videos ├── data_validation.html ├── dvc.lock ├── dvc.yaml ├── metrics.csv ├── models ├── notebooks │ ├── 1_downloading_data.ipynb │ ├── 2_extracting_images.ipynb │ ├── 3_train_test_split.ipynb │ ├── 4_cnn_classifier.ipynb │ ├── 5_deepchecks.ipynb │ └── README.md ├── params.yml ├── requirements.txt └── src ├── config.py ├── create_train_test_split.py ├── extract_frames.py ├── get_videos.py ├── train.py ├── utils.py └── validate_data.py
Cubriremos todos los elementos a lo largo del artículo, pero por ahora podemos mencionar brevemente los siguientes:
data
y cada subdirectorio almacena datos de diferentes etapas..github
es responsable de los flujos de trabajo de las acciones de GitHub.notebooks
contiene cuadernos utilizados para la exploración, que no son relevantes para las funcionalidades del proyecto.src
contiene el código base completo del proyecto. Cada script cubre una parte diferente de la canalización.requiremets.txt
contiene la lista de bibliotecas necesarias para ejecutar el proyecto. la poetry
podría funcionar igual de bien.
Definir una estructura de proyecto clara es definitivamente útil para mantener todo organizado y facilita la ejecución de experimentos que modifican solo partes de la tubería completa. Todavía hay bastantes cosas que podríamos agregar a la estructura, pero hagámoslo simple y concentrémonos en los otros elementos de la configuración del proyecto. Mencionaremos algunas posibles extensiones al final del artículo.
Como primer bloque de construcción de nuestro proyecto, usaremos DagsHub . En pocas palabras, es algo así como GitHub, pero hecho a medida para científicos de datos e ingenieros de ML (a diferencia de los ingenieros de software). En DagsHub podemos alojar y versionar fácilmente no solo nuestro código sino también nuestros datos, modelos, experimentos, etc.
Puede que estés pensando ahora "suena genial, pero tenemos que registrarnos en un servicio más y, además de eso, todo nuestro código base ya está en GitHub". Afortunadamente, eso no es un problema. Podemos migrar completamente un repositorio o, lo que es aún más conveniente, duplicar uno existente. De esta forma, podemos seguir trabajando con el repositorio de GitHub existente y se reflejará en tiempo real en DagsHub. Para este proyecto, utilizaremos la opción de creación de reflejo del repositorio: el repositorio principal de GitHub se reflejará en este en DagsHub .
Como puede ver en la imagen a continuación, la interfaz de usuario de DagsHub es muy similar a la de GitHub. De esta forma, no tenemos que aprender otra herramienta más desde cero, ya que todo parece muy familiar desde el principio. En la imagen a continuación, ya puede ver que hay algunas pestañas nuevas disponibles (experimentos, anotaciones) y las cubriremos más adelante. En la imagen, mostramos todos los archivos en el repositorio, pero podemos filtrarlos fácilmente, por ejemplo, para mostrar solo Notebooks o archivos rastreados con DVC.
No cubriremos todas las funcionalidades de DagsHub, pero también vale la pena mencionar que ofrece lo siguiente:
Seguro que ya estás familiarizado con el concepto de versionar el código con Git. Desafortunadamente, GitHub no funciona tan bien con los datos, ya que tiene un límite de archivos de 100 MB. Esto significa que cargar un archivo binario (o un archivo de video en nuestro caso) ya puede exceder este límite. Además de eso, comparar diferentes versiones de conjuntos de datos de cualquier tipo tampoco es la experiencia más agradable. Es por eso que necesitamos otra herramienta para el trabajo.
DVC (control de versión de datos) es una biblioteca Python de código abierto que esencialmente tiene el mismo propósito que Git (incluso con la misma sintaxis), pero para datos en lugar de código. La idea de DVC es que mantenemos la información sobre diferentes versiones de nuestros datos en Git, mientras que los datos originales se almacenan en otro lugar (almacenamiento en la nube como AWS, GCS, Google Drive, etc.).
Tal configuración requiere un poco de conocimiento de DevOps. Afortunadamente, DagsHub puede ahorrarnos bastantes problemas, ya que cada cuenta de DagsHub viene con 10 GB de almacenamiento gratuito para DVC.
Primero, necesitamos instalar la biblioteca:
pip install dvc
Luego, necesitamos instanciar un repositorio DVC:
dvc init
Ejecutar este comando crea 3 archivos: .dvc/.gitignore
, .dvc/config
y .dvcignore
. Puedes encontrar más información sobre lo que contienen aquí . Luego, necesitamos conectar nuestro repositorio DVC recién creado a DagsHub. Como hemos mencionado antes, al usar DagsHub no tenemos que configurar manualmente la conexión al almacenamiento en la nube. Lo único que tenemos que hacer es ejecutar los siguientes comandos en la terminal:
dvc remote add origin https://dagshub.com/eryk.lewinson/mario_vs_wario_v2.dvc dvc remote modify origin --local auth basic dvc remote modify origin --local user XXXX dvc remote modify origin --local password XXXX
Para hacerlo aún más fácil, DagsHub nos proporciona todos aquellos en la pestaña Remoto . Solo tenemos que copiarlos y pegarlos en la terminal.
Habiéndonos conectado al control remoto DVC, asignamos los archivos mencionados anteriormente a Git:
git add. git commit -m "Initialized DVC" git push
Gracias a la funcionalidad de duplicación, solo necesitamos enviar nuestros archivos a GitHub, ya que DagsHub sincronizará automáticamente todos los cambios desde allí.
Ahora es el momento de construir una canalización completa, donde DVC realiza un seguimiento de las salidas de datos intermedias. Para facilitar el proceso, creamos un archivo .py
independiente para cada paso de la canalización. En nuestro caso, los pasos son los siguientes:
get_videos.py
: descarga los videos de los dos juegos (juegos completos, de principio a fin) de YouTube. Los videos descargados se almacenan en el directorio de data/videos
.extract_frames.py
: extrae las imágenes de los archivos de video mp4. La salida se almacena en el directorio data/raw
.create_train_test_split.py
: divide las imágenes extraídas en conjuntos de entrenamiento y prueba. Las salidas de esta etapa se almacenan en el directorio data/processed
.train.py
— entrena a la CNN para clasificar las imágenes. Envía el modelo entrenado al directorio de models
y algunos otros archivos ( metrics.csv
y params.yml
) al directorio raíz.
En base a esos pasos, podemos crear una canalización usando el dvc run
. Para facilitar la lectura, los pasos se dividen en 4 partes, cada una de las cuales corresponde a una etapa separada de la canalización. En la práctica, no tiene que comprometerse y empujar después de cada paso. Lo hicimos por total transparencia y manejabilidad.
dvc run -n get_videos -d src/config.py -o data/videos python src/get_videos.py git add data/.gitignore dvc.lock dvc.yaml git commit -m "added get_videos step" git push dvc push -r origin dvc run -n extract_frames -d src/config.py -d src/utils.py -d data/videos -o data/raw python src/extract_frames.py git add dvc.yaml dvc.lock data/.gitignore git commit -m "added extract_frames step" git push dvc push -r origin dvc run -n create_train_test_split -d src/config.py -d data/raw -o data/processed python src/create_train_test_split.py git add dvc.lock data/.gitignore dvc.yaml git commit -m "executed train_test_split stage" git push dvc push -r origin dvc run -n train -d src/config.py -d data/processed/ -o models -o metrics.csv -o params.yml python src/train.py git add dvc.lock data/.gitignore dvc.yaml git commit -m "executed train step" git push dvc push -r origin
Como puede ver en los archivos comprometidos, DVC guarda las etapas de canalización en dos archivos: dvc.yaml
(almacenado en un formato legible por humanos) y un dvc.lock
(prácticamente ilegible). Al crear la tubería, usamos los siguientes comandos de DVC:
-n
- el nombre del escenario,-d
- la dependencia del escenario,-o
- la salida del escenario.A continuación, puede ver cómo se ve la canalización en el archivo YAML.
stages: get_videos: cmd: python src/get_videos.py deps: - src/config.py outs: - data/videos extract_frames: cmd: python src/extract_frames.py deps: - data/videos - src/config.py - src/utils.py outs: - data/raw create_train_test_split: cmd: python src/create_train_test_split.py deps: - data/raw - src/config.py outs: - data/processed train: cmd: python src/train.py deps: - data/processed/ - src/config.py outs: - metrics.csv - models - params.yml
DVC rastreará automáticamente todos los directorios y archivos bajo las outs
.
Además de eso, DagsHub ofrece una vista previa visual de la canalización de DVC. Puede encontrarlo en la lista de archivos del repositorio. Como puede ver a continuación, hace que sea mucho más fácil comprender toda la canalización que leer el archivo dvc.yml
.
Habiendo definido toda la canalización de DVC, podemos usar el comando dvc repro
para reproducir la canalización completa o parcial mediante la ejecución de las etapas definidas en dvc.yml
.
Por último, vale la pena mencionar que podemos acceder e inspeccionar todos los datos almacenados con DVC en DagsHub, incluidos algunos metadatos. Puedes ver un ejemplo a continuación.
El siguiente punto en nuestra lista de deseos para este proyecto es el seguimiento de experimentos. Para hacerlo, utilizaremos otra biblioteca de código abierto: MLFlow (MLFlow Tracking, para ser precisos). Con las funcionalidades de MLFlow registraremos bastantes detalles sobre nuestros experimentos, comenzando con el nombre pasando por los hiperparámetros del modelo y terminando con las puntuaciones correspondientes.
Similar a DVC, también necesitamos un servidor para alojar MFLow. Y al igual que antes, eso también lo facilita DagsHub. Podemos encontrar los detalles necesarios para la autenticación en la pestaña Remoto en nuestro repositorio de DagsHub. Después de configurar el control remoto MLFlow, todos nuestros experimentos se registrarán en la pestaña Experimentos en nuestro repositorio de DagsHub.
En el siguiente script, puede ver cómo implementar el seguimiento con MLFlow. Es una versión abreviada del script de entrenamiento completo, que excluye algunos elementos no estrictamente relevantes (creación de generadores de datos, definición de la arquitectura de las NN, etc.). Sin embargo, mencionaremos algunas cosas sobre la implementación de MLFlow:
with
).
from config import PROCESSED_IMAGES_DIR, MODELS_DIR import os import tensorflow.keras import mlflow from dagshub import dagshub_logger mlflow.set_tracking_uri("https://dagshub.com/eryk.lewinson/mario_vs_wario_v2.mlflow") os.environ['MLFLOW_TRACKING_USERNAME'] = USER_NAME os.environ['MLFLOW_TRACKING_PASSWORD'] = PASSWORD if __name__ == "__main__": mlflow.tensorflow.autolog() IMG_SIZE = 128 LR = 0.001 EPOCHS = 10 with mlflow.start_run(): training_set, valid_set, test_set = get_datasets(validation_ratio=0.2, target_img_size=IMG_SIZE, batch_size=32) model = get_model(IMG_SIZE, LR) print("Training the model...") model.fit(training_set, validation_data=valid_set, epochs = EPOCHS) print("Training completed.") print("Evaluating the model...") test_loss, test_accuracy = model.evaluate(test_set) print("Evaluating completed.") # dagshub logger with dagshub_logger() as logger: logger.log_metrics(loss=test_loss, accuracy=test_accuracy) logger.log_hyperparams({ "img_size": IMG_SIZE, "learning_rate": LR, "epochs": EPOCHS }) # mlflow logger mlflow.log_params({ "img_size": IMG_SIZE, "learning_rate": LR, "epochs": EPOCHS }) mlflow.log_metrics({ "test_set_loss": test_loss, "test_set_accuracy": test_accuracy, }) print("Saving the model...") model.save(MODELS_DIR) print("done.")
Como una pequeña ventaja, vale la pena mencionar que existe una forma alternativa y más liviana de rastrear experimentos: usar Git y DagsHub. Para hacerlo, tenemos que usar la biblioteca dagshub
. En las líneas 36 a 43, mostramos cómo registrar algunas métricas e hiperparámetros usando la biblioteca dagshub
.
El registrador dagshub
crea dos archivos en el directorio raíz del proyecto (a menos que se especifique lo contrario): metrics.csv
y params.yml
. Estos son los dos archivos que indicamos en el último paso de nuestra tubería DVC como salidas del script train.py
. Cuando enviamos esos dos archivos a git, DagsHub los reconocerá automáticamente y colocará sus valores en la pestaña Experimentos . Podemos ubicarlos claramente cuando observamos los experimentos marcados con la etiqueta Git en la columna de origen.
La mayor ventaja de usar el cliente dagshub
es que esos experimentos son completamente reproducibles: siempre que usemos DVC para rastrear datos, podemos cambiar al estado del proyecto al momento de terminar un experimento con un solo git checkout
. Tal cosa también es posible con MLFlow, pero no tan simple.
También puede escribir su propio registrador personalizado que combine lo mejor de los dos enfoques para el seguimiento de experimentos. Puede encontrar un ejemplo aquí .
Eso sería todo con respecto a los detalles de la implementación del seguimiento de experimentos. Pasando a inspeccionar algunos resultados, la siguiente imagen presenta el estado en el que aún se estaba ejecutando un experimento llamado anquilostomiasis del sueño : vemos la precisión y la pérdida actualizadas a medida que se entrena el modelo.
En la pestaña Experimentos , podemos marcar las variantes que queremos comparar y pulsar el botón comparar .
En la siguiente imagen, vemos algunos de los hiperparámetros rastreados por MLFlow. Como habrás adivinado, vemos muchos hiperparámetros porque estamos usando el registrador automático TensorFlow de MLFlow. Al final de la lista, también puede ver el hiperparámetro que agregamos manualmente: img_size
. Después de eso, podemos ver las métricas relevantes.
Los dos experimentos analizados difieren en dos hiperparámetros: el número de épocas y el tamaño de imagen considerado (el tamaño de la imagen cuadrada que se pasa a la primera capa de la NN). También puede ver los valores de los hiperparámetros y las precisiones del conjunto de entrenamiento correspondiente en el siguiente gráfico de coordenadas paralelas.
Por último, podemos profundizar aún más en el análisis de varias métricas de rendimiento de los experimentos.
Como el objetivo de esta parte era solo mostrar las funcionalidades del seguimiento de MLFlow, no dedicaremos más tiempo a analizar los resultados de los experimentos.
Como último paso de nuestro proyecto, nos gustaría crear verificaciones de cordura automatizadas para nuestros datos. Ilustremos eso con un ejemplo hipotético que podría aplicarse a nuestro proyecto. En un videojuego como los considerados (el género de los plataformas de desplazamiento lateral), la gran mayoría del tiempo se dedica a intentar terminar algún nivel o simplemente a explorar. Vemos a nuestro personaje principal corriendo y haciendo cosas (principalmente saltando).
Sin embargo, como en todos los juegos, también hay otras pantallas (menús, transición en blanco y negro o pantallas de carga, créditos finales, etc.). Podríamos argumentar que no deberían incluirse en los datos. Así que imaginemos que revisamos manualmente las imágenes y eliminamos las que consideramos inadecuadas para nuestra muestra de datos. Esto podría generar una pregunta: ¿nuestras acciones cambiaron significativamente algo en los datos, por ejemplo, el equilibrio de clases? ¿O tal vez introdujimos algún otro sesgo?
Eso también podría ser muy relevante cuando algunas de nuestras transformaciones de datos implican recortar las imágenes: podríamos cortar algunos HUD (jerga de juegos, pantalla de visualización frontal o simplemente la barra de estado *) * de una clase y mantenerlos allí para la otra. Esto llevaría a crear un clasificador que simplemente verifica si ese píxel en particular tiene un valor de X y luego decide con confianza de qué juego proviene la imagen.
Para exactamente ese escenario, sería genial tener algunos controles de cordura de datos automatizados. Mostraremos cómo crearlos usando GitHub Actions y Deepchecks. Pero primero, necesitamos responder algunas preguntas de ayuda.
GitHub Actions es una herramienta utilizada para automatizar flujos de trabajo de software. Por ejemplo, los ingenieros de software usan GitHub Actions para automatizar acciones como fusionar sucursales, manejar problemas, ejecutar pruebas de aplicaciones o unidades, etc.
Sin embargo, eso no significa que sean inútiles para los científicos de datos. Podemos usar GitHub Actions para muchas cosas, que incluyen:
Algunas cosas a tener en cuenta sobre las acciones de GitHub:
En resumen, deepchecks
es una biblioteca Python de código abierto para probar modelos y datos de ML/DL. La biblioteca puede ayudarnos con diversas necesidades de prueba y validación a lo largo de nuestros proyectos: podemos verificar la integridad de los datos, inspeccionar las distribuciones, confirmar divisiones de datos válidas (por ejemplo, la división de entrenamiento/prueba) y evaluar el rendimiento de nuestro modelo. ¡y más!
En este punto, es hora de combinar los dos componentes básicos para generar automáticamente un informe de validez de datos cada vez que implementamos algunos cambios en el código base.
Primero, creamos un script que genera el informe de validez de datos con deepchecks
. Usaremos la suite predeterminada de la biblioteca (en la jerga de deepchecks
, esto corresponde a una colección de comprobaciones) utilizada para verificar la corrección de la división de tren/prueba. Actualmente, deepchecks
proporciona suites para tareas tabulares y de visión por computadora, sin embargo, la compañía también está trabajando en una variante de NLP.
from deepchecks.vision.simple_classification_data import load_dataset from deepchecks.vision.suites import train_test_validation from config import PROCESSED_IMAGES_DIR train_ds = load_dataset(PROCESSED_IMAGES_DIR, train=True, object_type="VisionData", image_extension="jpg") test_ds = load_dataset(PROCESSED_IMAGES_DIR, train=False, object_type="VisionData", image_extension="jpg") suite = train_test_validation() result = suite.run(train_ds, test_ds) result.save_as_html("data_validation.html")
Además, podríamos haber especificado una instancia de un modelo ajustado mientras usamos el método de run
. Sin embargo, en el momento de escribir este artículo, deepchecks
admite los modelos scikit-learn
y PyTorch ajustados. Desafortunadamente, esto significa que nuestro keras
CNN no funcionará. Pero esto probablemente cambiará en un futuro próximo, ya que deepchecks
sigue siendo una biblioteca relativamente nueva y en constante desarrollo. Ejecutar el script dará como resultado la generación de un informe HTML en el directorio raíz.
Ahora es el momento de programar la ejecución de las comprobaciones de cordura. Afortunadamente, usar GitHub Actions es muy fácil. Solo tenemos que agregar un archivo .yaml
al directorio .github/workflows
. En este archivo .yaml
, especificamos cosas como:
name: Data validation with deepchecks on: push: branches: [ main ] pull_request: branches: [ main ] permissions: write-all jobs: run_data_checks: runs-on: ubuntu-latest env: DVC_USERNAME: ${{ secrets.DVC_USERNAME }} DVC_PASSWORD: ${{ secrets.DVC_PASSWORD }} steps: - uses: actions/checkout@v3 - name: Set up Python 3.10 uses: actions/setup-python@v3 with: python-version: "3.10" - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt - name: Get data run: | # dvc remote add origin https://dagshub.com/eryk.lewinson/mario_vs_wario_v2.dvc dvc remote modify origin --local auth basic dvc remote modify origin --local user $DVC_USERNAME dvc remote modify origin --local password $DVC_PASSWORD dvc pull create_train_test_split -r origin - name: Remove the old validation report run: rm -f data_validation.html - name: Validate data with deepchecks run: | python src/validate_data.py - name: Commit the validation report file uses: stefanzweifel/git-auto-commit-action@v4 with: commit_message: Added the data validation file - name: Create a comment uses: peter-evans/commit-comment@v1 with: body: | Please check the data_validation.html file for a full validation report.
El script ejecuta los siguientes pasos:
requirements.txt
.stefanzweifel/git-auto-commit-action@v4
).peter-evans/commit-comment@v1
).
Después de enviar este archivo a GitHub, veremos nuestro nuevo flujo de trabajo en la pestaña Acciones .
Podemos profundizar más para ver todos los pasos del flujo de trabajo, junto con registros detallados. Esos definitivamente son útiles cuando algo sale mal y necesitamos depurar la canalización.
Una vez que finaliza el flujo de trabajo, podemos ver que el bot de GitHub publicó un comentario en nuestra confirmación.
Y ahora, la parte más interesante: podemos encontrar el informe data_validation.html
en nuestro repositorio. Fue agregado y confirmado automáticamente por el bot de GitHub. Para tenerlo también localmente, solo tenemos que extraerlo del repositorio.
Por brevedad, presentamos solo algunas partes del informe de validación de datos. Afortunadamente para nosotros, la biblioteca también genera comentarios útiles sobre los cheques: qué son y qué buscar.
En la primera imagen podemos ver que las clases están perfectamente equilibradas. Esto no debería sorprendernos, dado que así fue exactamente como definimos las divisiones.
En la segunda imagen, podemos ver el diagrama de distribución del brillo de las imágenes sobre el tren y los conjuntos de prueba. Parece que la división fue exitosa, ya que son muy similares. Según la documentación, sería alarmante que la puntuación de Deriva (Distancia del motor de la tierra) fuera superior a 0,1.
Por último, nos fijamos en el Predictive Power Score del área de las imágenes. Como puede ver en los comentarios, la diferencia en el PPS no debe ser mayor a 0.2. Esa condición se cumple, ya que tenemos un PPS perfecto de 1 para todas las clases y conjuntos de datos. ¿Porqué es eso? Simplemente las imágenes de los dos videojuegos son de diferentes tamaños. Las imágenes del juego de Mario son de 160x144, mientras que las de Wario son de 320x288 (el doble de tamaño). Esto probablemente se deba al hecho de que los videos se grabaron con diferentes configuraciones de emulador (originalmente, los juegos eran para la misma consola, por lo que tenían el mismo tamaño de salida). Si bien esto significa que podemos usar el área de la imagen para predecir perfectamente la clase, ese no es el caso en el modelo real, ya que remodelamos las imágenes mientras las cargamos usando ImageDataGenerator
.
Ya hemos cubierto bastante en este artículo. Desde todo lo que reside en un solo Jupyter Notebook hasta un proyecto totalmente reproducible con control de versiones de datos y seguimiento de experimentos. Habiendo dicho eso, todavía hay algunas cosas que podríamos agregar a nuestro proyecto. Los que me vienen a la mente son:
En este artículo, demostramos un enfoque moderno para la creación de proyectos ML/DL con control de versiones de código y datos, seguimiento de experimentos y automatización de partes de las actividades, como la creación de informes de verificación del estado de los datos. Definitivamente requiere más trabajo que tener un solo Jupyter Notebook para todo, pero el esfuerzo extra vale la pena rápidamente.
En este punto*,* quería agradecer al soporte de DAGsHub por ayudarme con algunas preguntas.
Puede encontrar el código utilizado para este artículo en mi GitHub o DagsHub . Además, cualquier comentario constructivo es bienvenido. Puedes comunicarte conmigo en Twitter .