You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: README.md
+46-76Lines changed: 46 additions & 76 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,7 +2,7 @@
2
2
3
3
Librería de Deep Learning ligera, modular y **completamente vectorizada** en Python y NumPy. Pensada para producción: API estilo Keras, gradientes verificados numéricamente, persistencia portable sin pickle, caches externos para arquitecturas avanzadas.
4
4
5
-
> **v0.4.0 — refactor arquitectónico.**Resuelve los 5 riesgos estructurales de v0.3: acoplamiento matemático oculto (Softmax↔CCE), estado mutable en capas (bloqueaba redes siamesas), serialización pickle-frágil, validación de shapes tardía, y fugas de abstracción en optimizadores. Ver `CHANGELOG` al final.
5
+
> **v1.0.0 — lanzamiento estable.**Paquete renombrado a `nnlib`, empaquetado moderno con `pyproject.toml`, CI con linting, LICENSE MIT. Ver [CHANGELOG.md](CHANGELOG.md) para historial completo.
6
6
7
7
## Principios de Diseño
8
8
@@ -47,21 +47,23 @@ Librería de Deep Learning ligera, modular y **completamente vectorizada** en Py
**Problema en v0.3:** la derivada de `CategoricalCrossEntropy` asumía que la capa anterior era `Softmax`. Si terminabas con `Linear` o `ReLU` y seguías usando CCE, no había error — simplemente los gradientes salían mal y la red no convergía.
92
-
93
-
**Solución en v0.4:**
94
-
95
93
***`from_logits=True`** (recomendado): capa final `Linear`, la loss aplica softmax/sigmoid internamente y usa el atajo estable `(pred - y) / N`.
96
94
***`from_logits=False`**: la capa anterior puede ser cualquier activación. Softmax propaga su Jacobiano real completo — matemáticamente correcto con cualquier loss.
97
95
@@ -114,7 +112,7 @@ ex = np.exp(logits - logits.max(axis=1, keepdims=True))
114
112
probs = ex / ex.sum(axis=1, keepdims=True)
115
113
```
116
114
117
-
## Persistencia Portable (recomendada)
115
+
## Persistencia Portable
118
116
119
117
```python
120
118
model.save('my_model/')
@@ -125,14 +123,14 @@ model.save('my_model/')
125
123
loaded = NeuralNetwork.load('my_model/')
126
124
```
127
125
128
-
`topology.json` es inspeccionable, no ejecutable, y sobrevive a refactorizaciones internas. NO uses `save_model()` (pickle) en producción.
126
+
`topology.json` es inspeccionable, no ejecutable, y sobrevive a refactorizaciones internas.
129
127
130
128
## Redes con capas compartidas (ej. siamesas)
131
129
132
-
Una misma instancia de capa puede procesar dos inputs distintos sin corromperse (en v0.3 era imposible). Ver `examples/siamese_network.py`.
130
+
Una misma instancia de capa puede procesar dos inputs distintos sin corromperse. Ver `examples/siamese_network.py`.
- Capas: `forward(x) -> (output, cache)` y `backward(d_output, cache) -> (d_input, grads_dict)`. Ya no se almacena cache en `self`. **Migración:** si tenías código usando `model.forward()` directamente, ahora obtienes sólo la salida; para depurar el pipeline completo usa `model._forward()` que retorna `(output, caches)`.
242
-
- Capas: `parameters() -> Dict[str, ndarray]` reemplaza a `get_params()`. Los optimizadores ya no acceden a `layer.weights`/`layer.biases`.
243
-
- Optimizadores: `apply_gradients(list_of_tuples)` reemplaza a `update(layers)`. Aceptan cualquier nombre de parámetro.
244
-
- Losses: `BinaryCrossEntropy` y `CategoricalCrossEntropy` aceptan `from_logits`.
245
-
- Softmax: backward ahora implementa el Jacobiano completo (no "return 1").
246
-
247
-
**Nuevo:**
248
-
-`NeuralNetwork.build(input_shape)` propaga shapes y valida fail-fast.
0 commit comments