user@devops:~$ cat README.md
Neural ODEs -- flujo continuo vs ResNet desde cero
# Descripción
Neural Ordinary Differential Equations (Chen et al. 2018) implementadas desde cero en PyTorch, sin torchdiffeq. Un bloque residual h_{t+1} = h_t + f(h_t, θ) es un paso de Euler de la EDO dh/dt = f(h(t), t, θ). Parte 1: dos espirales entrelazadas, 1.600 puntos (train 1.200 / test 400), seed 42. Parte 2: ResNet discreto = Euler de 8 pasos, MLP time-aware 2-32-32-2 con ultima capa a cero (init identidad), 1.256 params, acc test 0.7825. Parte 3: la misma f integrada con Euler-8 (acc 0.6325, early-stop) y RK4 (4 pasos NFE 16 acc 0.6600; 8 pasos NFE 32 acc 1.0000, CE 0.070). Parte 4: trayectorias -- el ResNet da saltos discretos, RK4 un flujo continuo que desenrolla las espirales hasta que un clasificador lineal las separa. Parte 5: serie irregular, 28 observaciones ruidosas de dz/dt = A z (A = [[-0.18, 2.15], [-2.15, -0.18]]); NODE autonoma interpola la orbita (MSE obs 0.0109, MSE densa 0.0256). Parte 6: adjunta discreta de un Euler-1 vs backprop-through-solver: coseno dL/dh0 = 1 y dL/dθ = 1, error relativo 0. Hallazgo: un ResNet de paso fijo ES el Euler de una Neural ODE; con 8 NFE el flujo no desenrolla las espirales, RK4 con 32 NFE si; la adjunta reproduce BPTS y ahorra memoria O(1) en T. CPU ~12 s. 7 visualizaciones.
# Características principales
$ Campo f desde cero: MLP 2-32-32-2 tanh, concat de t, ultima capa a cero (init identidad)
$ ResNet = Euler-8 de la misma EDO: 1.256 params, acc test 0.7825
$ RK4-8 (NFE 32) separa las espirales al 100% (CE 0.070); Euler-8 se queda en 0.63-0.78
$ Trayectorias: saltos discretos del ResNet vs flujo continuo que desenrolla el plano
$ Serie irregular: 28 obs. de una espiral A z; interpolacion densa MSE 0.026
$ Adjunta discreta vs BPTS: coseno 1.000000 en dh0 y dθ, error relativo 0
$ Checkpoint determinista (seed 42): re-run regenera metricas y figuras sin reentrenar
$ 7 visualizaciones: datos, curvas, trayectorias, campo, fronteras, NFE, serie
# Galería
# Tecnologías utilizadas