Adding Lab2.
This commit is contained in:
Executable
+135
@@ -0,0 +1,135 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Inferencia configurable\n",
|
||||
"\n",
|
||||
"Este notebook recibe un CSV con las columnas id, x1, x2, x3 y x4. Carga los pesos desde un diccionario que declara explícitamente la ruta y arquitectura, estandariza con los valores guardados y produce un CSV de predicciones.\n",
|
||||
"\n",
|
||||
"La ruta configurada por defecto es un artefacto del instructor. Para inferencia de estudiante, cambie ruta_pesos a su propio modelo exportado y mantenga una arquitectura coincidente.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"name": "stdout",
|
||||
"text": [
|
||||
"Raíz del laboratorio: /home/aleleba/projects/cursos/Universidad/Procesamiento de Imagenes y Vision por Computadora/Labs/Lab2\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from pathlib import Path\n",
|
||||
"import sys\n",
|
||||
"import numpy as np\n",
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"\n",
|
||||
"candidatos = [Path.cwd().resolve(), Path.cwd().resolve() / 'dist' / 'laboratorio_clasificacion', Path.cwd().resolve().parent]\n",
|
||||
"RAIZ = next((ruta for ruta in candidatos if (ruta / 'lib_modelos.py').exists()), None)\n",
|
||||
"if RAIZ is None:\n",
|
||||
" raise FileNotFoundError('No se encontró la carpeta laboratorio_clasificacion.')\n",
|
||||
"sys.path.insert(0, str(RAIZ))\n",
|
||||
"print('Raíz del laboratorio:', RAIZ)\n",
|
||||
"from lib_modelos import cargar_csv, cargar_modelo, transformar\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"CONFIG_MODELOS = {\n",
|
||||
" 'referencia_instructor': {\n",
|
||||
" 'ruta_pesos': RAIZ / 'instructor_privado' / 'artefactos' / 'modelo_mejor.npz',\n",
|
||||
" 'arquitectura': {'tipo': 'mlp', 'entrada': 4, 'ocultas': [32, 16]},\n",
|
||||
" 'umbral': 0.405,\n",
|
||||
" },\n",
|
||||
" # Modelo propio, exportado en la sección 6 de laboratorio_estudiante.ipynb:\n",
|
||||
" 'mi_modelo': {\n",
|
||||
" 'ruta_pesos': RAIZ / 'entrega' / 'modelo_elegido.npz',\n",
|
||||
" 'arquitectura': {'tipo': 'mlp', 'entrada': 4, 'ocultas': [48, 24]},\n",
|
||||
" 'umbral': 0.315,\n",
|
||||
" },\n",
|
||||
"}\n",
|
||||
"NOMBRE_MODELO = 'mi_modelo'\n",
|
||||
"RUTA_ARCHIVO = RAIZ / 'datos_publicos' / 'ejemplo_entrada_inferencia.csv'\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Ejecución\n",
|
||||
"\n",
|
||||
"Cambie RUTA_ARCHIVO por el CSV recibido. No incluya la columna etiqueta: inferencia no requiere ni debe leer etiquetas.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"output_type": "stream",
|
||||
"name": "stdout",
|
||||
"text": [
|
||||
"Predicciones guardadas en: /home/aleleba/projects/cursos/Universidad/Procesamiento de Imagenes y Vision por Computadora/Labs/Lab2/datos_publicos/ejemplo_entrada_inferencia_predicciones.csv\n",
|
||||
"Filas procesadas: 12\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import csv\n",
|
||||
"\n",
|
||||
"config = CONFIG_MODELOS[NOMBRE_MODELO]\n",
|
||||
"if not config['ruta_pesos'].exists():\n",
|
||||
" raise FileNotFoundError(f\"No se encontraron los pesos: {config['ruta_pesos']}\")\n",
|
||||
"if not RUTA_ARCHIVO.exists():\n",
|
||||
" raise FileNotFoundError('Actualice RUTA_ARCHIVO con el archivo de entrada.')\n",
|
||||
"\n",
|
||||
"modelo, media, desviacion = cargar_modelo(config['ruta_pesos'], config['arquitectura'])\n",
|
||||
"x, ids = cargar_csv(RUTA_ARCHIVO, con_etiqueta=False)\n",
|
||||
"probabilidades = modelo.probabilidad(transformar(x, media, desviacion))\n",
|
||||
"predicciones = (probabilidades >= config['umbral']).astype(int)\n",
|
||||
"\n",
|
||||
"salida = RUTA_ARCHIVO.with_name(RUTA_ARCHIVO.stem + '_predicciones.csv')\n",
|
||||
"with salida.open('w', encoding='utf-8', newline='') as archivo:\n",
|
||||
" escritor = csv.writer(archivo)\n",
|
||||
" escritor.writerow(['id', 'probabilidad_clase_1', 'prediccion', 'umbral'])\n",
|
||||
" for ident, p, pred in zip(ids, probabilidades, predicciones):\n",
|
||||
" escritor.writerow([ident, f'{p:.8f}', int(pred), config['umbral']])\n",
|
||||
"print('Predicciones guardadas en:', salida)\n",
|
||||
"print('Filas procesadas:', len(ids))\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Verificación de arquitectura\n",
|
||||
"\n",
|
||||
"Si se cambia el archivo de pesos, la entrada arquitectura debe coincidir exactamente con el modelo usado al guardarlo: tipo mlp y lista ocultas, o tipo mlp_residual_bn y ancho. El notebook falla de forma visible si las dimensiones son incompatibles.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"name": "python",
|
||||
"version": "3.x"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
||||
Reference in New Issue
Block a user