@@ -5,8 +5,9 @@ Clasificador de pistachos (Kirmizi vs Siirt) usando Deep Learning con PyTorch Li
55## Estructura del proyecto
66
77```
8+ .
89├── config/
9- │ └── configuracion.yaml # Hiperparametros externalizados
10+ │ └── configuracion.yaml # Hiperparametros externalizados (solo los del modelo)
1011├── src/
1112│ ├── main.py # Entrypoint CLI (train/sweep)
1213│ ├── train.py # Entrenamiento con W&B logging
@@ -17,11 +18,17 @@ Clasificador de pistachos (Kirmizi vs Siirt) usando Deep Learning con PyTorch Li
1718│ ├── utils.py # load_config, get_project_root
1819│ └── logging_config.py # Configuracion de logging
1920├── tests/ # Tests unitarios
20- ├── notebook/ # Notebook exploratorio original
21+ │ ├── test_api.py
22+ │ ├── test_data_module.py
23+ │ ├── test_model.py
24+ │ └── test_utils.py
25+ ├── notebook/
26+ │ └── pistachio.ipynb # Notebook exploratorio original
2127├── Dockerfile # Containerizacion (MODE=train|api)
2228├── entrypoint.sh # Entrypoint flexible
2329├── .github/workflows/ci.yml # CI/CD con GitHub Actions
24- └── requirements.txt # Dependencias
30+ ├── requirements.txt # Dependencias
31+ └── pytest.ini
2532```
2633
2734## Dataset
@@ -33,6 +40,7 @@ Clasificador de pistachos (Kirmizi vs Siirt) usando Deep Learning con PyTorch Li
3340Editar ` config/configuracion.yaml ` (solo hiperparametros del modelo):
3441
3542- ` model_type ` : ` cnn_batchnorm ` o ` cnn_dropout `
43+ - ` semilla ` : semilla para reproducibilidad
3644- ` learning_rate ` , ` batch_size ` , ` max_epochs ` , ` patience `
3745- ` dropout_rate `
3846- ` wandb_project ` : nombre del proyecto en W&B
@@ -44,13 +52,16 @@ El resto (`output_size=2`, `image_size=28`, splits, etc.) son constantes de arqu
4452``` bash
4553pip install -r requirements.txt
4654
55+ # Antes de usar W&B, hacer login una vez (o pasar --no-wandb)
56+ wandb login
57+
4758# Entrenamiento simple
4859python src/main.py configuracion.yaml
4960
5061# Sin W&B (offline)
5162python src/main.py configuracion.yaml --no-wandb
5263
53- # Smoke test (10% datos, 3 epocas )
64+ # Smoke test (10% datos)
5465python src/main.py configuracion.yaml --no-wandb --data-fraction 0.1
5566
5667# W&B Sweep (grid search)
@@ -71,17 +82,20 @@ pytest tests/ -v
7182``` bash
7283docker build -t pistachio-mlops .
7384
74- # Entrenamiento (por defecto, usa --no-wandb si no hay WANDB_API_KEY)
75- docker run --gpus all pistachio-mlops
85+ # Entrenamiento (auto --no-wandb si no hay WANDB_API_KEY)
86+ docker run --rm -- gpus all pistachio-mlops
7687
7788# Entrenamiento sin GPU
78- docker run pistachio-mlops
89+ docker run --rm pistachio-mlops
7990
8091# Entrenamiento con W&B
81- docker run -e WANDB_API_KEY=tu_key pistachio-mlops
92+ docker run --rm -e WANDB_API_KEY=tu_key pistachio-mlops
93+
94+ # Smoke test (10% datos)
95+ docker run --rm -e MODE=train pistachio-mlops --data-fraction 0.1
8296
8397# API de inferencia (el modelo debe estar en models/ al hacer build)
84- docker run -p 8000:8000 -e MODE=api pistachio-mlops
98+ docker run --rm - p 8000:8000 -e MODE=api pistachio-mlops
8599```
86100
87101## API Endpoints
@@ -95,13 +109,18 @@ Ejemplo:
95109curl -X POST http://localhost:8000/predict -F " file=@pistacho.jpg"
96110```
97111
112+ Respuesta:
113+
114+ ``` json
115+ {"class" :" Kirmizi_Pistachio" ,"confidence" :0.92 ,"probabilities" :{"Kirmizi_Pistachio" :0.92 ,"Siirt_Pistachio" :0.08 }}
116+ ```
117+
98118## W&B Report
99119
100- Sweep : https://wandb.ai/14farresa-/pistachio-mlops/sweeps/2147j105
101- Proyecto : https://wandb.ai/14farresa-/pistachio-mlops
120+ - Proyecto : https://wandb.ai/14farresa-/pistachio-mlops
121+ - Sweep : https://wandb.ai/14farresa-/pistachio-mlops/sweeps/2147j105
102122
103123El proyecto incluye un W&B Report con:
104-
105124- Resultados del sweep (learning rate, batch size, modelo)
106125- Comparacion de arquitecturas (BatchNorm vs Dropout)
107126- Metricas finales (accuracy, F1, matriz de confusion)
0 commit comments