Red neuronal convolucional para clasificar radiografías de tórax COVID-19
Diseñé, entrené y optimicé una red neuronal convolucional (CNN) para distinguir radiografías de tórax normales de casos COVID-19. El foco no fue solo lograr buena exactitud, sino elegir bien las métricas, aplicar regularización y proponer un ajuste sistemático de hiperparámetros para que el modelo generalice.
- Tipo
- Ensayo académico · Visión por computador
- Dataset
- COVID-19 X-ray (Kaggle) · ~2.100 imágenes
- Stack
- TensorFlow · Keras · scikit-learn
- Resultado
- 92,86% exactitud · 94,29% recall COVID
01 El problema
Durante la pandemia, clasificar rápido una radiografía de tórax era un cuello de botella. Las CNN son especialmente buenas en imágenes porque aprenden solas qué características importan, sin que uno tenga que programarlas a mano. Pero un buen modelo no es solo la arquitectura: depende de las métricas que eliges, de la regularización y del ajuste de hiperparámetros. Ese fue el eje del trabajo.
02 Datos y preprocesamiento
El dataset trae radiografías en dos clases (COVID-19 y normal). Antes de entrenar, preparé las imágenes:
- Redimensioné a 224×224 px, el tamaño estándar de estas arquitecturas.
- Normalicé los píxeles al rango
[0, 1]dividiendo entre 255. - Apliqué data augmentation (rotación ±15°, zoom 10%, volteo horizontal) para ampliar el dataset y reducir sobreajuste.
- Dividí en 80% entrenamiento / 10% validación / 10% prueba.
from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(
rescale=1./255, # normaliza a [0,1]
rotation_range=15, # rotación ±15°
zoom_range=0.1, # zoom 10%
horizontal_flip=True, # volteo horizontal
validation_split=0.2
)
03 Arquitectura de la CNN
Diseñé una red con tres bloques convolucionales (32 → 64 → 128 filtros), incorporando desde el inicio BatchNormalization y Dropout como regularización, no como parche al final.
model = models.Sequential([
# Bloque 1
layers.Conv2D(32, (3,3), activation='relu', padding='same'),
layers.BatchNormalization(),
layers.MaxPooling2D(2,2),
layers.Dropout(0.25),
# ... bloques 2 y 3 (64 y 128 filtros) ...
layers.Flatten(),
layers.Dense(256, activation='relu'),
layers.Dropout(0.5),
layers.Dense(1, activation='sigmoid') # salida binaria
])
Para entrenar usé el optimizador Adam con EarlyStopping (para no sobreentrenar) y ReduceLROnPlateau (baja la tasa de aprendizaje cuando el modelo se estanca). El entrenamiento se detuvo solo en la época 35.
04 Resultados
El modelo alcanzó un desempeño sólido en el conjunto de prueba:
| Métrica | Valor | Ideal | Lectura |
|---|---|---|---|
| Exactitud | 92,86% | → 100% | Alto rendimiento global |
| Recall (COVID) | 94,29% | → 100% | Detecta el 94% de los casos COVID reales |
| Precisión (COVID) | 91,43% | → 100% | Baja tasa de falsos positivos |
| F1-Score | 0,928 | → 1 | Balance sólido precisión/recall |
05 Técnicas de optimización
Combiné tres familias de técnicas con efectos complementarios sobre la generalización:
- Batch Normalization: normaliza las activaciones por lote, permite tasas de aprendizaje más altas y estabiliza el entrenamiento.
- Dropout: apaga neuronas al azar durante el entrenamiento (0,25 en convolucionales, 0,5 en la capa densa) para evitar que la red memorice.
- Data Augmentation: genera variaciones realistas de cada imagen — clave cuando hay pocas imágenes etiquetadas, como en contextos médicos.
El resultado: convergencia estable con una diferencia entrenamiento/validación menor al 3%, señal de que el modelo no está sobreajustando.
06 Ajuste de hiperparámetros
Propuse un ajuste sistemático con Keras Tuner sobre los parámetros más influyentes: bajar el learning rate con scheduler, reducir el batch size, cambiar Adam por AdamW y afinar el dropout. La comparación siguiente presenta el modelo base frente a un escenario ajustado proyectado; no corresponde a una segunda validación clínica independiente.
Proyección académica: +5,7 puntos porcentuales en accuracy y recall, y una reducción estimada del 33% en el error (MSE). Estos valores no reemplazan una evaluación independiente ni una validación clínica.
Conclusión y líneas futuras
El trabajo muestra que un sistema de apoyo al diagnóstico exige equilibrar rendimiento, rigor metodológico y responsabilidad. Una CNN bien regularizada, con métricas elegidas según el costo real de cada error, entrega resultados robustos. Como siguiente paso propuse explorar Transfer Learning con arquitecturas preentrenadas (ResNet50, EfficientNet, MobileNetV2), que suelen rendir muy bien con datasets limitados.
¿Un problema de imágenes o predicción?
Clasificación, visión por computador, modelos predictivos — puedo ayudarte a llevarlo de la idea al prototipo. Conversemos.
Conversemos →