A project that tries to leverage overlap and grouping functions inside CNNs. Documentation available in English and Spanish.
Coming soon...
-
El punto de entrada del proceso de entrenamiento es el script /src/runs/run_test.py
Este script lleva a cabo los siguientes procesos:
-
Lee múltiples parámetros de entrada mediante el método argparse() que especifican las características de la prueba a realizar. Se parsean y se guardan sus valores como variables.
Nota: En la carpeta /runs se provee un bash script de muestra sobre un posible uso del proyecto.
-
Se llama a la función full_test(), enviándole los parámetros leídos previamente. El resto de pasos se realizan en la función full_test().
-
Se leen el resto de parámetros necesarios a partir de una archivo .json situado en la carpeta /config. Los parámetros de la prueba se almacenan en un diccionario "info_data" que se usará posteriormente.
-
Se crean carpetas para los resultados del test en las carpetas /reports/models, /reports/results y /reports/runs.
Nota:
/reports/models: Almacena los parámetros de los modelos ya entrenados para su posterior carga (si fuera necesario). /reports/results: Almacena los resultados de métricas de los distintos modelos entrenados, medidos sobre la partición de test (en ficheros de nombre test_metrics.txt). /reports/runs: Almacena logs generados usando la herramienta Tensorboard para su posterior carga con dicha herramienta. -
Se entra en el bucle principal del programa: Cada iteración del bucle entrena un modelo distinto y repite los siguientes pasos:
- Se genera una nueva carpeta dentro de la carpeta de test creada previamente con nombre "test0", "test1", etc.
- Se genera un nuevo modelo a partir de los parámetros cargados. Se generan los objetos optimizer, scheduler y criterion necesarios para el entrenamiento.
- Se llama al método train() del script /src/model_tools/train.py -> Ver parte 2
- Tras la ejecución del método train(), se obtiene un objeto "model" que incluirá el modelo entrenado sobre la partición de train del dataset indicado.
- Se llama al método get_prediction_metrics() del script /src/model_tools/evaluate.py con el objeto "model" y la partición de test, y posteriormente al método log_eval_metrics() del script /src/data/save_results.py para generar un fichero de nombre "test_metrics.txt" con los resultados de la evaluación.
- Se llama al método save_model() del script /src/model_tools/save_model.py con el objeto "model" y el diccionario de valores "info_data", que facilitará la carga de datos posteriormente.
-
-
Proceso de entrenamiento de train()
Este método es el encargado de llevar a cabo el entrenamiento de un modelo dado.
Recibe como entrada los siguientes parámetros (Nota: no todos los parámetros son obligatorios):
* name: Nombre del test (generado en la función full_test()) * model: Modelo a entrenar. * optimizer, criterion, scheduler: Objetos que guían el proceso de aprendizaje del modelo. * train_loader, val_loader: Dataloaders que cargan los datos de entrenamiento y validación, respectivamente * using_tensorboard: Si es True, genera logs que posteriormente permitirán visualizar el entrenamiento usando la herramienta Tensorboard. NOTA: De aquí en adelante asumimos que es True * otros- Se comienza consultando si se dispone de un dispositivo CUDA desde el que llevar a cabo la ejecución de las pruebas.
- Se genera un archivo de log en la carpeta /reports/runs/name (donde "name" hace referencia al nombre de nuestro test) para ser leído usando la herramienta Tensorboard. Se genera un objeto "SummaryWriter" que será el encargado de escribir este log.
- Se realiza una primera escritura de los atributos a ser guardados por el modelo mediante el objeto "SummaryWriter".
- Se entra en el bucle de entrenamiento (se repetirá tantas veces como establezca el atributo "num_epochs"):
- Se inicia un nuevo bucle que recorre todos los batches de la partición de entrenamiento (se repetirá tantas veces como batches haya en train_val)
- El entrenamiento del modelo se lleva a cabo aquí.
- Cada "iters_per_log" iteraciones se loggean nuevos resultados mediante el objeto "SummaryWriter" (referentes a la partición de entrenamiento)
- Tras el bucle de entrenamiento se loggean nuevos resultados mediante el objeto "SummaryWriter" (referentes a la partición de validación)
- Se inicia un nuevo bucle que recorre todos los batches de la partición de entrenamiento (se repetirá tantas veces como batches haya en train_val)
- Se devuelve el modelo entrenado
Nota: Requiere haber almacenado los resultados de la evaluación de distintos modelos en una carpeta "group_of_tests" con la estructura:
/reports
/results
/group_of_tests
/test_name0
/test0
test_metrics.txt
/test1
test_metrics.txt
...
/test_name1
/test0
test_metrics.txt
/test1
test_metrics.txt
...
...
Donde "test_name1", "test_name2", etc. son nombres de ejemplo para una serie de tests ejecutado mediante el script /src/runs/run_test.py y "group_of_tests" es el nombre de una carpeta que los contiene a todos ellos (generada manualmente por el usuario).
Basta con ejecutar el script /src/data/summarize_excel.py indicando como parámetro el nombre de la carpeta padre (en el ejemplo, "group_of_tests").
- Se cargan los parámetros de entrada mediante la función argparse() y se almacenan en variables.
- Se llama a la función summarize_experiments() enviándole los parámetros cargados previamente. El resto de pasos se realizan en la función summarize_experiments().
- Se obtiene el nombre de todas las carpetas presentes dentro de la carpeta /reports/results/group_of_tests
- Se obtiene el nombre de todas las carpetas presentes dentro de la carpeta de cada test
- Se recorren todas las carpetas "test0", "test1", etc. leyendo el contenido de los ficheros "test_metrics.txt" de cada una de ellas (Nota: Solo se lee la información referente a la accuracy obtenida).
- Se obtiene el nombre de todas las carpetas presentes dentro de la carpeta de cada test
- Se genera un DataFrame de pandas con las métricas leídas. Se calculan la media y desviación estándar de cada prueba "test_name0", "test_name1", etc.
- Se escribe el contenido del DataFrame a un archivo .xlsx.
Nota: Requiere haber almacenado los logs del entrenamiento de distintos modelos en una carpeta "group_of_tests" con la estructura:
/reports
/results
/group_of_tests
/test_name0
/test0
events.out.tfevents.XXX
/test1
events.out.tfevents.XXX
...
/test_name1
/test0
events.out.tfevents.XXX
/test1
events.out.tfevents.XXX
...
...
Donde "test_name1", "test_name2", etc. son nombres de ejemplo para una serie de tests ejecutado mediante el script /src/runs/run_test.py y "group_of_tests" es el nombre de una carpeta que los contiene a todos ellos (generada manualmente por el usuario).
Basta con ejecutar el script /src/data/organize_runs.py indicando como parámetro el nombre de la carpeta padre (en el ejemplo, "group_of_tests").
- Se cargan los parámetros de entrada mediante la función argparse() y se almacenan en variables.
- Se llama a la función organize_experiments() enviándole los parámetros cargados previamente. El resto de pasos se realizan en la función organize_experiments().
- Se crea una nueva carpeta /reports/results/group_of_tests/tests
- Se obtiene el nombre de todas las carpetas presentes dentro de la carpeta /reports/results/group_of_tests
- Se obtiene el nombre de todas las carpetas presentes dentro de la carpeta de cada test
- Se recorren todas las carpetas "test0", "test1", etc. copiándolas, junto con sus contenidos, a nuevas carpetas con nombre "/reports/results/group_of_tests/tests/test_name0_test_0", etc.
- Se obtiene el nombre de todas las carpetas presentes dentro de la carpeta de cada test
Posteriormente, puede ejecutarse la herramienta tensorboard, desde la carpeta /reports/results/group_of_tests mediante el comando "tensorboard --logdir tests".