7.6 KiB
7.6 KiB
ResNet50 Transfer Learning para Nocciola - Documentación
🚀 Implementación Completa de ResNet50
Este proyecto implementa transfer learning con ResNet50 para clasificación de fases fenológicas de nocciola, basado en la estructura exitosa de MobileNetV1.py pero optimizado específicamente para ResNet50.
📁 Estructura de Archivos
Code/Supervised_learning/
├── ResNET.py # Script principal ResNet50 ✅ NUEVO
├── train_resnet50.py # Script facilitado de entrenamiento ✅ NUEVO
├── MobileNetV1.py # Script MobileNetV2 (referencia exitosa)
└── README_ResNet50.md # Esta documentación ✅ NUEVO
🔧 Características Específicas de ResNet50
Arquitectura Optimizada:
# Modelo base ResNet50
base_model = ResNet50(
weights='imagenet',
include_top=False,
input_shape=(224, 224, 3)
)
# Capas personalizadas optimizadas para ResNet50
model = Sequential([
base_model,
GlobalAveragePooling2D(),
BatchNormalization(), # ✅ Importante para ResNet50
Dropout(0.5), # ✅ Dropout más alto
Dense(256, activation='relu'), # ✅ Más neuronas
BatchNormalization(),
Dropout(0.3),
Dense(num_classes, activation='softmax')
])
Optimizaciones Específicas:
-
Learning Rate Conservador:
- Inicial:
5e-4(vs1e-3en MobileNet) - Fine-tuning:
1e-6(muy bajo para estabilidad)
- Inicial:
-
Data Augmentation Reducido:
- Rotación: 15° (vs 20° en MobileNet)
- Shifts/Zoom: 0.08 (vs 0.1 en MobileNet)
- Más conservador para evitar overfitting
-
Fine-tuning Selectivo:
- Solo últimas capas residuales (conv5_x)
- Punto de corte: capa 140 (de 175 total)
- Preserva features básicas, adapta características específicas
-
Callbacks Adaptados:
- Paciencia EarlyStopping: 10 (vs 7 en MobileNet)
- Más épocas de fine-tuning: 15 (vs 10)
- Factor ReduceLR: 0.3 (más agresivo)
📊 Comparación ResNet50 vs MobileNetV2
| Característica | ResNet50 | MobileNetV2 |
|---|---|---|
| Parámetros | ~25M | ~3.4M |
| Memoria | Alta | Baja |
| Velocidad | Lenta | Rápida |
| Precisión | Alta | Media-Alta |
| Overfitting | Más propenso | Menos propenso |
| Dataset ideal | Grande/Complejo | Pequeño/Mediano |
🎯 Casos de Uso Recomendados
Usar ResNet50 cuando:
- ✅ Dataset tiene suficientes muestras (>1000)
- ✅ Patrones complejos en imágenes
- ✅ Precisión es más importante que velocidad
- ✅ Hardware robusto disponible
- ✅ Investigación/análisis detallado
Usar MobileNetV2 cuando:
- ✅ Dataset pequeño (<500 muestras)
- ✅ Velocidad es importante
- ✅ Recursos limitados
- ✅ Producción/móvil
- ✅ Prototipado rápido
🚀 Ejecución
Opción 1: Script Facilitado (Recomendado)
# Entrenar solo ResNet50
python train_resnet50.py --model resnet50 --epochs 25
# Comparar ambos modelos
python train_resnet50.py --model both --epochs 20
# Ver comparación detallada
python train_resnet50.py --compare
Opción 2: Ejecución Directa
# ResNet50 básico
python ResNET.py --epochs 25 --force_split
# ResNet50 con dataset específico
python ResNET.py --csv_path "assignments.csv" --epochs 30
Parámetros Disponibles:
--csv_path: Ruta al CSV (default: assignments.csv)--images_dir: Directorio de imágenes--output_dir: Directorio de resultados (default: results_resnet50_faseV)--epochs: Épocas de entrenamiento (default: 25)--force_split: Recrear división de datos
📈 Proceso de Entrenamiento ResNet50
Fase 1: Entrenamiento Inicial
- Base model congelado (ImageNet weights)
- Solo entrenar capas personalizadas
- Learning rate conservador (5e-4)
- Callbacks con paciencia aumentada
Fase 2: Fine-tuning Selectivo
- Descongelar solo conv5_x layers (últimas capas residuales)
- Learning rate muy bajo (1e-6)
- 15 épocas adicionales
- Monitoreo estricto de overfitting
Evaluación Robusta:
- Manejo automático de clases desbalanceadas
- Métricas específicas para ResNet50
- Visualizaciones diferenciadas
📂 Resultados Generados
Modelos:
best_resnet50_model.keras: Mejor modelo durante entrenamientofinal_resnet50_model.keras: Modelo final completo
Reportes:
classification_report.txt: Reporte detallado con marcador ResNet50confusion_matrix.csv: Matriz numérica
Visualizaciones:
resnet50_training_history.png: Gráficos de entrenamientoresnet50_confusion_matrix.png: Matriz visualresnet50_prediction_examples.png: Ejemplos de predicciones
Data Splits:
train_split.csv,val_split.csv,test_split.csvclass_indices.json: Mapeo de clases
⚙️ Configuración Técnica
Requisitos del Sistema:
- RAM: Mínimo 8GB (recomendado 16GB)
- GPU: Opcional pero muy recomendada
- Espacio: ~3GB para resultados completos
Dependencias:
tensorflow>=2.8.0
scikit-learn
pandas
numpy
matplotlib
seaborn
Configuración Interna:
IMG_SIZE = (224, 224) # Estándar ImageNet
BATCH_SIZE = 16 # Reducido para ResNet50
SPLIT = {'train': 0.7, 'val': 0.15, 'test': 0.15}
🔍 Diferencias Implementadas vs MobileNet
1. Arquitectura:
- BatchNormalization adicional
- Dropout más agresivo (0.5 vs 0.3)
- Dense layer mayor (256 vs 128)
2. Entrenamiento:
- Learning rates más conservadores
- Fine-tuning más selectivo
- Más épocas de fine-tuning
3. Data Augmentation:
- Rotaciones menores (15° vs 20°)
- Shifts reducidos (0.08 vs 0.1)
- Menos agresivo para ResNet50
4. Callbacks:
- Paciencia aumentada (10 vs 7)
- Factor ReduceLR más agresivo (0.3 vs 0.2)
- Monitoreo específico para ResNet
5. Outputs:
- Nombres diferenciados (
resnet50_*) - Reportes marcados con modelo
- Métricas específicas
🎯 Recomendaciones de Uso
Para Dataset Nocciola Actual:
Dado que el dataset es relativamente pequeño (~500 muestras):
- Primera opción: MobileNetV2 (más adecuado)
- Segunda opción: ResNet50 con regularización fuerte
- Comparación: Entrenar ambos y comparar resultados
Comando Recomendado:
# Comparar ambos modelos con pocas épocas
python train_resnet50.py --model both --epochs 15
# Analizar resultados y elegir el mejor
🚨 Solución de Problemas
Overfitting en ResNet50:
- Reducir épocas de entrenamiento
- Aumentar dropout
- Usar dataset filtrado
- Más data augmentation
Underfitting:
- Aumentar épocas
- Reducir regularización
- Learning rate más alto
- Descongelar más capas
Problemas de memoria:
- Reducir BATCH_SIZE a 8 o 4
- Usar gradient checkpointing
- Cerrar otras aplicaciones
📊 Interpretación de Resultados
Métricas Esperadas:
- ResNet50: Mayor precision, posible overfitting
- MobileNetV2: Más generalizable, menos overfitting
Comparación Visual:
- Training curves más suaves en MobileNet
- Posible gap train/val en ResNet50
- Matriz de confusión similar o mejor en ResNet50
Decisión Final:
Elegir modelo basado en:
- Accuracy en test set
- Diferencia train/validation
- Requisitos de producción
- Interpretabilidad de errores
🎉 ¡ResNet50 Implementado Exitosamente!
El modelo ResNet50 está completamente implementado usando la misma estructura robusta que MobileNetV1.py, con optimizaciones específicas para ResNet50 y manejo automático de clases desbalanceadas.
Para comenzar: python train_resnet50.py --model resnet50 --epochs 20