ESEN← Volver a proyectos
Machine Learning · Caso de estudio

Red neuronal convolucional para clasificar radiografías de tórax COVID-19

Por Guille Ferveg· 2026· Deep Learning · TensorFlow / Keras

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.

Nota importante: este es un ejercicio académico de aprendizaje de deep learning con un dataset público. No es un dispositivo médico ni una herramienta de diagnóstico clínico, y no debe usarse para decisiones de salud reales.
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:

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
])
▶ Total params: 1.482.177 · entrenables: 1.481.217

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:

92,86%Exactitud global
94,29%Recall COVID — detecta casos reales
91,43%Precisión — bajos falsos positivos
0,928F1-Score — balance precisión/recall
MétricaValorIdealLectura
Exactitud92,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-Score0,928→ 1Balance sólido precisión/recall
El criterio clave: en diagnóstico médico la exactitud sola engaña. Prioricé el Recall (94,29%) porque el error más costoso es un falso negativo: dejar pasar un caso COVID real. Por eso el análisis no se quedó en el "accuracy" y miró precisión, recall y F1 por separado.

05 Técnicas de optimización

Combiné tres familias de técnicas con efectos complementarios sobre la generalización:

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.

Modelo base vs. escenario ajustado proyectado
Impacto de la regularización y el tuning de hiperparámetros
Accuracy · base
87,14%
Accuracy · ajust. (proy.)
92,86%
Recall · base
88,57%
Recall · ajust. (proy.)
94,29%

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.

PythonTensorFlowKerasCNNDeep LearningVisión por computadorscikit-learnKeras Tuner

¿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 →