ESEN← Volver al blog
Deep Learning

Cómo entrené mi primera CNN para detectar COVID-19 en radiografías

Por Guille Ferveg· 2026· 8 min de lectura

Nunca había entrenado una red neuronal para imágenes. Esta es mi bitácora entrenando mi primera CNN para distinguir radiografías de tórax normales de casos COVID-19: lo que me confundió, lo que me hizo clic y los errores que me enseñaron más que los aciertos.

Antes de empezar: esto es un ejercicio de aprendizaje con un dataset público de Kaggle. No es un dispositivo médico ni sirve para diagnosticar a nadie en la vida real. La idea era aprender deep learning, no reemplazar a un radiólogo.

01 ¿Qué es una CNN y por qué para imágenes?

Lo primero que tuve que entender: una red neuronal normal ve una imagen como una lista gigante de píxeles sueltos y pierde la noción de "qué está al lado de qué". Una CNN (red neuronal convolucional) resuelve eso con la idea de convolución: una pequeña ventana que se va deslizando por la imagen buscando patrones (bordes, texturas, formas).

La imagen que me destrabó la intuición: es como pasar una lupa por toda la radiografía, y esa lupa aprende sola qué mirar. Las primeras capas detectan cosas simples (líneas, contrastes); las siguientes combinan eso en cosas más complejas (formas de los pulmones, opacidades). Nadie le dice qué buscar: lo aprende de los ejemplos.

02 Preparar los datos fue el 70% del trabajo

Yo pensaba que lo difícil era "la red". Mentira: lo que más tiempo me tomó fue dejar las imágenes listas. El dataset traía radiografías en dos carpetas (COVID y normal), y antes de entrenar tuve que:

from tensorflow.keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(
    rescale=1./255,        # de 0–255 a 0–1
    rotation_range=15,     # girar hasta ±15°
    zoom_range=0.1,        # zoom 10%
    horizontal_flip=True,   # espejar
    validation_split=0.2
)
Lo que aprendí acá: si los datos están sucios o desordenados, no hay arquitectura que te salve. Un modelo es tan bueno como los datos que le das.

03 Armar la red por bloques (no fue tan místico)

Verlo como bloques que se repiten me quitó el miedo. Usé tres bloques convolucionales, cada uno con la misma receta: una capa que busca patrones (Conv2D), una que estabiliza (BatchNormalization), una que reduce el tamaño (MaxPooling) y una que apaga neuronas al azar para que no memorice (Dropout).

model = models.Sequential([
    # Bloque 1: patrones simples
    layers.Conv2D(32, (3,3), activation='relu', padding='same'),
    layers.BatchNormalization(),
    layers.MaxPooling2D(2,2),
    layers.Dropout(0.25),
    # Bloques 2 y 3: más filtros (64 y 128), patrones más complejos
    # ...
    layers.Flatten(),
    layers.Dense(256, activation='relu'),
    layers.Dropout(0.5),
    layers.Dense(1, activation='sigmoid')  # 1 salida: COVID o normal
])

La última capa tiene una sola neurona con sigmoid, que devuelve un número entre 0 y 1: la "probabilidad" de que la radiografía sea COVID. Si es mayor a 0,5, lo cuenta como COVID.

04 El fantasma del sobreajuste

El concepto que más me costó fue el sobreajuste (overfitting): cuando el modelo se aprende las imágenes de memoria en vez de aprender el patrón general. Anda perfecto con lo que ya vio y falla feo con imágenes nuevas. Es como un alumno que memoriza las respuestas del ensayo pero no entiende la materia.

Contra eso usé tres cosas, y ver que funcionaban fue muy satisfactorio:

Al final la diferencia entre lo que acertaba en entrenamiento y en validación quedó por debajo del 3%. Esa señal —que rinde parecido en datos que nunca vio— fue la que me dijo "ok, esto está aprendiendo de verdad".

05 Las métricas: por qué el "accuracy" no basta

Mi primer instinto fue mirar solo la exactitud (accuracy): qué porcentaje acertó. Llegué a 92,86% y me puse feliz. Pero en un problema médico eso puede engañar, y esta fue la lección más importante del proyecto.

Imagina que de cada 100 radiografías, 90 son normales. Un modelo tramposo que diga "normal" siempre tendría 90% de accuracy… y dejaría pasar TODOS los casos COVID. Por eso hay que mirar otras métricas:

El clic mental: no existe "la métrica buena" en abstracto. Depende de qué error te duele más. Acá priorizar el recall tiene sentido porque dejar pasar un COVID es peor que una falsa alarma.

06 Lo que más me costó (siendo honesto)

Para que esto sea una bitácora de verdad y no una foto perfecta, acá van las partes que se me hicieron cuesta arriba:

07 Lo que me llevo

Entrenar mi primera CNN me enseñó que el deep learning no es magia negra: es preparar bien los datos, armar la red por bloques con sentido, cuidar el sobreajuste y elegir las métricas según el problema. Cada paso tiene una lógica, y cuando la entiendes deja de dar miedo.

¿El siguiente paso? Probar Transfer Learning: en vez de entrenar desde cero, partir de una red ya entrenada con millones de imágenes (como ResNet o MobileNet) y adaptarla. Dicen que rinde mejor con pocos datos, y quiero comprobarlo yo mismo.

Deep LearningCNNTensorFlowKerasVisión por computadorAprendizaje

¿Te interesa el machine learning?

Escríbeme y conversamos — de redes neuronales, datos, o de por qué tu modelo no converge.

Conversemos →