An open API service indexing awesome lists of open source software.

https://github.com/techatlasdev/pyceptron

🧠 Una librería que estudia a profundidad perceptrones monocapa para el entrenamiento convencional de redes neuronales
https://github.com/techatlasdev/pyceptron

Last synced: 7 months ago
JSON representation

🧠 Una librería que estudia a profundidad perceptrones monocapa para el entrenamiento convencional de redes neuronales

Awesome Lists containing this project

README

          

# 🧠 Pyceptron

![PyPI Version](https://img.shields.io/pypi/v/pyceptron.svg)
![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)
![Python Version](https://img.shields.io/badge/python-3.8%2B-blue.svg)
![Development Status](https://img.shields.io/badge/status-pre--alpha-red)
![GitHub Stars](https://img.shields.io/github/stars/TechAtlasDev/pyceptron.svg?style=social)
![NumPy](https://img.shields.io/badge/numpy-1.21.0%2B-blue?logo=numpy&logoColor=white)
![Matplotlib](https://img.shields.io/badge/matplotlib-3.4.0%2B-blue?logo=matplotlib&logoColor=white)
![Poetry](https://img.shields.io/badge/poetry-1.2.0%2B-blue?logo=poetry&logoColor=white)
![TermPyX](https://img.shields.io/badge/TermPyX-v1.0-orange)

![Perceptron vs Dataset](image-6.png)

**Pyceptron** es una librería open-source desarrollada con el objetivo de desarrollar, analizar y demostrar muchos conceptos que un perceptrón nos ofrece, a base de una arquitectura minimalista y muy fácil de desarrollar.

## 🖥️ Instalación

Puedes instalar la librería usando el comando

```bash
pip install pyceptron
```

O puedes usar poetry con

```bash
poetry add pyceptron
```

## 🎯 Uso básico

La librería fue diseñada para que puedas implementar de manera fácil y rápida tus soluciones!

```python
# Importar las librerías
from pyceptron import PerceptronClassic
from pyceptron import Linear

from ... import dataset # Importa tu dataset

# Creando el perceptron
perceptron = PerceptronClassic(
f_activation=Linear(),
input_units=1
)

perceptron.train(
x=dataset.x, y=dataset.y, alpha=0.01, epochs=20
)

# -- Evaluando perceptron --
x_test = 100
y_pred = perceptron.predict(x_test)

print (f"Predicción de {x_test} -> Predicho: {y_pred}")
```

![Home](image-7.png)

## ⚒️ Funciones extra

**Pyceptron** va más allá de un simple `train()` y `predict()`. Incluye herramientas potentes para que entiendas a fondo el proceso de aprendizaje:

### Generadores de Datasets `(pyceptron.utils.generators)`

No necesitas preparar tus datos manualmente. **Pyceptron** te permite crear datasets personalizados con relaciones matemáticas predefinidas, perfectos para experimentar y validar el comportamiento de los perceptrones.

La clase base `DatasetGenerator` ofrece una implementación robusta para la creación de conjuntos de datos. Permite definir la **cantidad** de puntos, el **rango** de los valores de entrada (`x`), y opcionalmente **barajar** los datos. Es fundamental destacar que, al barajar (`shuffle=True`), la librería asegura que los **pares (X, Y) se mantengan intactos**, preservando la relación subyacente del dataset. Esto evita los problemas de divergencia catastrófica que ocurren cuando `X` y `Y` son aleatorizados independientemente.

Puedes definir tus propios generadores heredando de `DatasetGenerator` y simplemente proporcionando la función matemática deseada:

```Python
from pyceptron.utils.generators.base import DatasetGenerator

# --- Ejemplos de Generadores Incluidos ---

# Generador de datos para la conversión Celsius a Fahrenheit (relación lineal)
class Celsius2FahrenheitGenerator(DatasetGenerator):
def __init__(self, function=lambda x : x * 9/5 + 32):
super().__init__(function=function) # Llama al constructor de la base

# Generador de datos para una relación lineal diferente
class Equation1Generator(DatasetGenerator):
def __init__(self, function=lambda x : x * 251 - 220):
super().__init__(function=function)

# Generador de datos para una relación parabólica (no lineal)
class Parabola1Generator(DatasetGenerator):
def __init__(self, function=lambda x : x**2 + x*3 + 5):
super().__init__(function=function)
```

**Ejemplos de Uso:**

```Python
from pyceptron.utils.generators import Celsius2FahrenheitGenerator, Parabola1Generator

# Generar datos para la conversión Celsius a Fahrenheit
celsius_generator = Celsius2FahrenheitGenerator()
x_celsius, y_celsius = celsius_generator.generate(quantity=100, range_start=-50, range_end=50, shuffle=True)

# Generar datos para una relación parabólica
parabola_generator = Parabola1Generator()
x_parabola, y_parabola = parabola_generator.generate(quantity=100, range_start=-10, range_end=10)

# Puedes obtener el valor esperado para cualquier entrada, manteniendo la coherencia
expected_f = celsius_generator.expected(25) # Devuelve 77.0

# Los generadores también incluyen métodos para visualizar los datos:
celsius_generator.graph() # Grafica la relación X vs Y
celsius_generator.graph_x() # Grafica la distribución de X
celsius_generator.graph_y() # Grafica la distribución de Y
```

![Dataset Analysis X](image-4.png)
![Dataset Analysis Y](image-5.png)

Estos generadores son cruciales para probar cómo tus perceptrones se adaptan a diferentes tipos de problemas *(lineales vs. no lineales)* y para investigar el impacto del orden de los datos.

### Analizador de Rendimiento `(pyceptron.utils.analyzer)`
El `Analyzer` es tu laboratorio de depuración y visualización. Te permite una introspección profunda del proceso de entrenamiento del perceptrón.

- **Monitoreo del Error:** Visualiza el historial del error promedio y el Error Cuadrático Medio (MSE) a lo largo de las épocas, dándote una idea clara de la convergencia (o divergencia) del modelo.

![Error History](image.png)
![MSE](image-1.png)

- **Historial de Hiperparámetros:** Observa cómo evolucionan los pesos y el bias del perceptrón durante el entrenamiento. Esto es invaluable para entender el proceso de optimización.

![Weights History](image-2.png)
![Bias History](image-3.png)

- **Comparación de Datos:** Gráfica las predicciones del perceptrón frente a la "línea de frontera" real de tus datos, permitiendo un diagnóstico visual inmediato del rendimiento del modelo.

- **Resumen Detallado:** Obtén un desglose en consola de las métricas clave y los hiperparámetros finales del perceptrón.

```Python
from pyceptron import PerceptronClassic, Linear
from pyceptron.utils.generators import Celsius2FahrenheitGenerator
from pyceptron.utils.analyzer import Analyzer
from pyceptron.enums.middleware_training_monolayer import MiddlewareTrainingMonolayer

# ... (código de creación del dataset y perceptrón, como en el "Uso Básico") ...

# Instancia el analizador con tu perceptrón
analyzer = Analyzer(perceptron)

# Configura el perceptrón para que el analizador recolecte datos durante el entrenamiento
perceptron.in_training(
analyzer=analyzer,
options=[
MiddlewareTrainingMonolayer.HISTORY_WEIGHTS, # Recolectar historial de pesos
MiddlewareTrainingMonolayer.HISTORY_BIASES, # Recolectar historial de bias
]
)

# ... (entrenamiento del perceptrón) ...

# Usa las funciones del analizador para visualizar y depurar:
analyzer.mse()
analyzer.error()
analyzer.history_weights()
analyzer.history_bias()
analyzer.compare_graph(generator)
analyzer.debug()
```

Esta herramienta es vital para comprender la estabilidad, la convergencia y las posibles anomalías en el aprendizaje, como se demostró en nuestros [laboratorios de comparación entre perceptrones](https://github.com/TechAtlasDev/pyceptron/tree/main/tests/monocapa).

### Persistencia de Modelos

Guarda y carga tus perceptrones entrenados fácilmente para evitar reentrenamientos y para usar tus modelos en aplicaciones:

```Python
from pyceptron.utils import load_perceptron

route = "perceptrones/perceptron.json"

perceptron = load_perceptron(route)
print (perceptron.predict(0))
```

## 📐 Arquitectura del proyecto

Pyceptron está diseñado con la modularidad como pilar central, permitiendo una fácil comprensión y extensibilidad.

- `pyceptron/factivations`: Contiene implementaciones de diversas funciones de activación (lineales y no lineales).

- `pyceptron/objects/perceptrons`: Aquí residen las definiciones de los modelos de perceptrones.

- `models/`: Define las clases base abstractas para garantizar una interfaz coherente.
- `pieces/`: Componentes reutilizables como la lógica central y el exportador/importador de modelos. Dentro de `trainers/` encontrarás las implementaciones de los algoritmos de entrenamiento específicos (clásico, gradiente).
- `variants/`: Las implementaciones concretas de los perceptrones (`PerceptronClassic`, `PerceptronGradient`) que combinan la base del perceptrón con los distintos entrenadores usando herencia múltiple.
- `pyceptron/objects/layers`: Aunque actualmente enfocado en perceptrones monocapa, la presencia de `layer.py` y `sequential.py` anticipa futuras extensiones para redes neuronales multicapa.
- `pyceptron/utils`: Utilidades esenciales para el ecosistema:
- `analyzer/:` El motor detrás de las herramientas de análisis y visualización.
- `generators/`: Herramientas para crear datasets de prueba con diferentes relaciones matemáticas.
- `loaders/`: Funcionalidad para cargar modelos guardados.
- `pyceptron/enums`: Enumeraciones para gestionar opciones internas de manera clara, como las opciones de recolección de datos del middleware durante el entrenamiento.

Esta estructura promueve la **separación de responsabilidades**, haciendo que cada parte del código sea más manejable y el proyecto sea altamente escalable para futuras características.

## 🤝 Contribuciones
¡Las contribuciones son bienvenidas! Si deseas contribuir, por favor sigue estos pasos:

1. Haz un fork del repositorio.
2. Crea una rama (`git checkout -b feature/nueva-feature`).
3. Realiza tus cambios y haz un commit (`git commit -am 'Añadir nueva-feature'`).
4. Haz un push a la rama (`git push origin feature/nueva-feature`).
5. Abre un Pull Request.

## 💡 Anatomía del perceptrón monocapa
Pronto un artículo científico será publicado que buscará sustentar la arquitectura del proyecto y evidenciará diferentes tipos de análisis en el comportamiento del perceptrón monocapa.

## 📝 Licencia
Este proyecto está licenciado bajo la Licencia MIT. Consulta el archivo [LICENSE](LICENSE) para más detalles.

## 📬 Contacto
Para cualquier pregunta o sugerencia, por favor abre un issue en el repositorio o contacta a gjimenezdeza@gmail.com.

¡Gracias por usar Pyceptron! 🚀