Deep Learning, capa por capa — con curva de aprendizaje verificada de verdad
Si el Machine Learning clásico es un experto que sigue pautas, el Deep Learning es un niño que aprende mirando miles de ejemplos hasta descubrir solo qué características importan.
Las primeras capas detectan bordes y curvas simples; las profundas combinan eso en objetos completos. Nadie lo programa explícitamente — emerge de ajustar pesos para minimizar error.
| ML clásico | Deep Learning | |
|---|---|---|
| Datos | Tabla (Excel/SQL) | Imágenes, audio, video, texto largo |
| Volumen | <1.000 ejemplos | >10.000 ejemplos |
| Explicabilidad | Necesitas explicar por qué | Caja negra aceptable |
No uses DL para una tabla de Excel de 100 filas — un Árbol de Decisión resuelve eso mejor, más barato y más rápido.
La capa de entrada no "ve" una imagen — ve una lista plana de números. Por eso normalizas los píxeles (0-255 → 0-1) antes de entrenar.
storage.googleapis.com — 403. Sustituí por el dataset de dígitos de scikit-learn (8×8, sin descarga) para verificar que la arquitectura realmente entrena y aprende. En tu máquina, sin ese firewall, el script del curso con MNIST real debería funcionar directo.
| Época | Loss | Accuracy |
|---|---|---|
| 1 (primera) | 2.1677 | 24.84% |
| 15 (última) | 0.1605 | 96.87% |
| Test (nunca visto) | — | 96.11% |
Con 10 dígitos posibles, ~10% sería puro azar — arrancar en 24,84% y subir a 96,87% en 15 épocas es exactamente la curva que vas a ver con MNIST real. Ejemplo real: dígito verdadero = 6, la red dijo = 6.
pip install tensorflow
# neural_network_digits.py
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf
from tensorflow.keras import layers, models
import numpy as np
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()
train_images, test_images = train_images / 255.0, test_images / 255.0
model = models.Sequential([
layers.Flatten(input_shape=(28, 28)),
layers.Dense(128, activation='relu'),
layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(train_images, train_labels, epochs=5)
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print(f"Precisión en datos nunca vistos: {test_acc*100:.2f}%")
Si tu red también bloquea la descarga, prueba desde otra red, o usa sklearn.datasets.load_digits() como hice yo.