Skip to content

Commit 57f0d7c

Browse files
authored
Revise README for updates on NeuralNetwork features
Updated README to reflect new features and optimizations in the NeuralNetwork library, including vectorization, batch training, and enhanced architecture.
1 parent 0df262f commit 57f0d7c

1 file changed

Lines changed: 108 additions & 65 deletions

File tree

README.md

Lines changed: 108 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,50 @@
1-
# NeuralNetwork - Librería de Deep Learning desde Cero
1+
# NeuralNetwork - Librería de Deep Learning Vectorizada
22

3-
Este proyecto es una librería de Deep Learning ligera y modular desarrollada íntegramente en Python y NumPy. A diferencia de frameworks de alto nivel como TensorFlow o PyTorch, **NeuralNetwork** implementa la matemática de las redes neuronales desde la base, permitiendo una comprensión profunda de los algoritmos de retropropagación (Backpropagation), optimización y funciones de activación.
3+
Este proyecto es una librería de Deep Learning ligera, modular y **completamente vectorizada** desarrollada en Python y NumPy. A diferencia de implementaciones educativas básicas, **NeuralNetwork** utiliza operaciones matriciales para un rendimiento superior, implementando desde cero algoritmos de retropropagación (Backpropagation), optimizadores con momentum y diversas funciones de activación.
44

5-
Está diseñada para ser escalable y educativa, permitiendo la creación de arquitecturas personalizadas para resolver problemas de clasificación binaria y regresión, como el clásico problema XOR.
5+
Está diseñada para ser escalable, permitiendo crear arquitecturas profundas para resolver problemas de clasificación binaria, multiclase y regresión.
66

77
## Características Principales
8-
* **Arquitectura Modular:**
9-
* **Diseño Orientado a Objetos:** Separación lógica entre Neuronas, Capas (`Layer`) y el Orquestador (`NeuralNetwork`).
10-
* **Activaciones Flexibles:** Implementación de funciones `Sigmoid`, `ReLU` y `LeakyReLU` intercambiables por capa.
11-
* **Optimización Matemática Avanzada:**
12-
* **Inicialización de He:** Inicialización inteligente de pesos para prevenir el desvanecimiento de gradientes en redes profundas.
13-
* **Funciones de Pérdida (Loss Functions):** Soporte para `MSE` (Error Cuadrático Medio) y `BinaryCrossEntropy` (Entropía Cruzada Binaria).
14-
* **Prevención de "Dying ReLU":** Implementación de `LeakyReLU` para mantener el flujo de gradientes en valores negativos.
15-
* **Entrenamiento Robusto:**
16-
* **Stochastic Gradient Descent (SGD):** Optimización de pesos mediante descenso de gradiente.
17-
* **Data Shuffling:** Barajado automático de datos en cada época para evitar mínimos locales y ciclos repetitivos.
18-
* **Persistencia de Modelos:**
19-
* Sistema nativo para guardar (`save_model`) y cargar (`load_model`) redes entrenadas utilizando `pickle`.
20-
* **Visualización:**
21-
* Integración con `matplotlib` para generar curvas de aprendizaje y monitorear la convergencia del error en tiempo real.
8+
9+
* **Arquitectura Vectorizada:**
10+
* **Alto Rendimiento:** Eliminación de bucles a nivel de neurona. Las capas (`Layer`) procesan lotes de datos (batches) utilizando álgebra matricial eficiente.
11+
* **Diseño Modular:** Componentes desacoplados para Capas, Activaciones, Pérdidas y Optimizadores.
12+
13+
* **Sistema de Optimizadores:**
14+
* **SGD con Momentum:** Implementación de Descenso de Gradiente Estocástico con término de momento para acelerar la convergencia y evitar mínimos locales.
15+
* **Gestión de Hiperparámetros:** Control granular del *learning rate* y *momentum*.
16+
17+
* **Flexibilidad Arquitectónica:**
18+
* **Activaciones:** `Sigmoid`, `ReLU`, `LeakyReLU` (con prevención de neuronas muertas), `Softmax` (para multiclase) y `Linear` (para regresión).
19+
* **Capas Especiales:** Soporte para **Dropout** para regularización y prevención de overfitting.
20+
* **Funciones de Pérdida:** `MSE` (Error Cuadrático Medio), `BinaryCrossEntropy` y `CategoricalCrossEntropy`.
21+
22+
* **Entrenamiento Profesional:**
23+
* **Mini-Batch Training:** Procesamiento de datos en lotes para mayor estabilidad y velocidad.
24+
* **Inicialización de He:** Pesos inicializados inteligentemente para redes profundas.
25+
* **Persistencia:** Guardado y carga de modelos entrenados (`pickle`).
2226

2327
## Tecnologías Utilizadas
24-
El proyecto utiliza un stack enfocado en el cálculo numérico y la eficiencia matemática:
2528
* **Lenguaje:** Python 3.10+
26-
* **Cálculo Numérico:** NumPy (Álgebra lineal, operaciones matriciales).
27-
* **Empaquetado:** Setuptools (Estructura de librería instalable).
28-
* **Visualización:** Matplotlib (Gráficos de curvas de pérdida).
29-
* **Testing:** Unittest (Pruebas unitarias para neuronas, capas y pérdidas).
29+
* **Cálculo Numérico:** NumPy (Operaciones matriciales y álgebra lineal).
30+
* **Testing:** Unittest (Cobertura de capas, optimizadores y pérdidas).
3031

31-
## Pre-requisitos
32-
Asegúrate de tener instalado y configurado lo siguiente:
33-
* Python 3.8 o superior
34-
* Git
35-
* Virtualenv (recomendado)
36-
37-
## Instalación y Configuración
38-
Sigue estos pasos para levantar el proyecto en tu entorno local:
32+
## Instalación
3933

4034
1. **Clonar el repositorio:**
4135
```bash
4236
git clone [https://github.com/elJulioDev/Neural_Network.git](https://github.com/elJulioDev/Neural_Network.git)
4337
cd neural_network
4438
```
4539

46-
2. **Crear y activar un entorno virtual:**
40+
2. **Instalar dependencias:** Puedes instalarlo como un paquete local editable o instalar las dependencias directamente:
41+
```bash
42+
pip install -r requirements.txt
43+
# O alternativamente para desarrollo:
44+
pip install -e .
45+
```
46+
47+
3. **Crear y activar un entorno virtual:**
4748
```bash
4849
python -m venv venv
4950
# En Windows:
@@ -52,13 +53,6 @@ venv\Scripts\activate
5253
source venv/bin/activate
5354
```
5455

55-
3. **Instalar dependencias:** Puedes instalarlo como un paquete local editable o instalar las dependencias directamente:
56-
```bash
57-
pip install -r requirements.txt
58-
# O alternativamente para desarrollo:
59-
pip install -e .
60-
```
61-
6256
4. **Ejecutar Pruebas Unitarias:** Para asegurar que toda la matemática base funciona correctamente:
6357
```bash
6458
python -m unittest discover tests
@@ -76,21 +70,29 @@ import numpy as np
7670
from src.neural_network import NeuralNetwork
7771
from src.activations import LeakyReLU, Sigmoid
7872
from src.losses import BinaryCrossEntropy
73+
from src.optimizers import SGD
74+
75+
# 1. Datos (XOR)
76+
X = np.array([[0,0], [0,1], [1,0], [1,1]])
77+
y = np.array([[0], [1], [1], [0]])
7978

80-
# 1. Inicializar la red con función de pérdida
81-
nn = NeuralNetwork(loss_function=BinaryCrossEntropy())
79+
# 2. Configurar Optimizador (NUEVO: Momentum incluido)
80+
optimizer = SGD(learning_rate=0.1, momentum=0.9)
8281

83-
# 2. Definir Arquitectura
84-
# Capa de entrada (2 neuronas) -> Oculta (4 neuronas, LeakyReLU)
82+
# 3. Inicializar Red
83+
nn = NeuralNetwork(loss_function=BinaryCrossEntropy(), optimizer=optimizer)
84+
85+
# 4. Definir Arquitectura
86+
# Capa oculta: 2 entradas -> 4 neuronas (LeakyReLU)
8587
nn.add_layer(num_neurons=4, input_size=2, activation=LeakyReLU())
86-
# Capa de salida (1 neurona, Sigmoid)
88+
# Capa salida: 1 neurona (Sigmoid)
8789
nn.add_layer(num_neurons=1, activation=Sigmoid())
8890

89-
# 3. Entrenar
90-
nn.train(X, y, epochs=10000, learning_rate=0.1)
91+
# 5. Entrenar (NUEVO: Soporte para batch_size)
92+
nn.train(X, y, epochs=5000, batch_size=4)
9193

92-
# 4. Predecir
93-
predicciones = nn.predict(X)
94+
# 6. Predecir
95+
print(nn.predict(X))
9496
```
9597

9698
## Integración en Proyectos Reales (Ej. Django/Flask)
@@ -110,43 +112,84 @@ from neural_network import NeuralNetwork
110112
import numpy as np
111113
import os
112114

113-
# Cargar el modelo entrenado (Singleton recomendado para producción)
115+
# CARGA DEL MODELO (Singleton)
116+
# Asegúrate de que este 'xor_model.pkl' haya sido entrenado con la versión vectorizada
114117
MODEL_PATH = os.path.join(os.path.dirname(__file__), 'modelos', 'xor_model.pkl')
115-
ai_model = NeuralNetwork.load_model(MODEL_PATH)
118+
try:
119+
ai_model = NeuralNetwork.load_model(MODEL_PATH)
120+
except Exception as e:
121+
# Es buena práctica manejar si el modelo no carga (ej. versiones incompatibles)
122+
print(f"Error cargando el modelo: {e}")
123+
ai_model = None
116124

117125
def predecir_view(request):
118-
# Suponiendo que recibes datos [0, 1]
126+
if ai_model is None:
127+
return JsonResponse({'error': 'El modelo no está disponible'}, status=500)
128+
129+
# 1. Preparar datos
130+
# La nueva librería EXIGE una matriz 2D: (Batch_Size, Input_Size)
131+
# Aquí Batch_Size = 1
119132
datos_entrada = np.array([[0, 1]])
120133

121-
# Realizar inferencia
122-
prediccion = ai_model.predict(datos_entrada)
134+
# 2. Inferencia
135+
# Devuelve un np.array de forma (1, 1)
136+
prediccion_matriz = ai_model.predict(datos_entrada)
137+
138+
# 3. Extracción
139+
# Accedemos a la fila 0, columna 0 para obtener el escalar
140+
valor_predicho = float(prediccion_matriz[0][0])
123141

124142
return JsonResponse({
125143
'input': [0, 1],
126-
'prediccion': float(prediccion[0][0]),
127-
'clase': 1 if prediccion > 0.5 else 0
144+
'prediccion': valor_predicho,
145+
'clase': 1 if valor_predicho > 0.5 else 0
128146
})
129147
```
130148

149+
## Guía Técnica y Solución de Problemas
150+
Esta sección es crucial para integrar la librería en producción (Django, Flask, FastAPI) y evitar errores comunes.
151+
152+
1. **Formato de Entrada (Input Shapes)**
153+
Debido a la vectorización, la librería es estricta con las dimensiones. No se aceptan vectores 1D.
154+
155+
- **Incorrecto:** `np.array([0, 1])` -> Forma `(2,)` -> Causará error de dimensiones.
156+
- **Correcto:** `np.array([[0, 1]])` -> Forma `(1, 2)` -> Matriz de 1 fila y 2 columnas (Batch de tamaño 1).
157+
158+
2. **Formato de Salida (Output)**
159+
El método `.predict()` siempre devuelve una matriz `(Batch_Size, Neuronas_Salida)`.
160+
161+
```python
162+
pred = model.predict(np.array([[0, 1]]))
163+
# Resultado: array([[ 0.98 ]])
164+
165+
# Para obtener el valor escalar (float):
166+
valor = float(pred[0][0])
167+
```
168+
169+
3. **Compatibilidad de Modelos (.pkl)**
170+
Si actualizaste la librería desde una versión anterior (v0.1.0 o previa), **tus modelos antiguos (.pkl) no funcionarán.**
171+
172+
- Causa: La clase `Neuron` fue eliminada y la estructura interna de `Layer` cambió drásticamente.
173+
- Solución: Debes re-entrenar tus modelos con la nueva versión y guardarlos nuevamente.
174+
131175
## Estructura del Proyecto
132176
```text
133177
neural_network/
134-
├── src/ # Código fuente de la librería
178+
├── src/ # Código fuente (Core)
135179
│ ├── __init__.py
136-
│ ├── activations.py # Funciones (Sigmoid, ReLU, LeakyReLU)
137-
│ ├── layer.py # Lógica de capas y conexión de neuronas
138-
│ ├── losses.py # Funciones de costo (MSE, CrossEntropy)
139-
│ ├── neural_network.py # Orquestador principal y bucle de entrenamiento
140-
│ └── neuron.py # Lógica base de la neurona (pesos/bias)
180+
│ ├── activations.py # Sigmoid, ReLU, Softmax, Linear
181+
│ ├── layer.py # Lógica de capas vectorizadas y Dropout
182+
│ ├── losses.py # MSE, CrossEntropy (Binaria/Categórica)
183+
│ ├── neural_network.py # Orquestador y bucle de entrenamiento
184+
│ └── optimizers.py # Algoritmos de optimización (SGD)
141185
├── tests/ # Pruebas Unitarias
142186
│ ├── __init__.py
143-
│ ├── test_layer.py
187+
│ ├── test_layer.py # Test de operaciones matriciales
144188
│ ├── test_losses.py
145-
│ └── test_neuron.py
146-
├── main.py # Script de demostración (Problema XOR)
147-
├── setup.py # Configuración de instalación del paquete
189+
│ └── test_optimizers.py # Test de actualizaciones de pesos
190+
├── main.py # Script de demostración
148191
├── requirements.txt # Dependencias
149-
└── .gitignore # Archivos ignorados
192+
└── README.md # Documentación
150193
```
151194

152195
## Licencia

0 commit comments

Comments
 (0)