poliflow 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- poliflow-0.1.0/PKG-INFO +44 -0
- poliflow-0.1.0/README.md +26 -0
- poliflow-0.1.0/poliflow.egg-info/PKG-INFO +44 -0
- poliflow-0.1.0/poliflow.egg-info/SOURCES.txt +19 -0
- poliflow-0.1.0/poliflow.egg-info/dependency_links.txt +1 -0
- poliflow-0.1.0/poliflow.egg-info/requires.txt +1 -0
- poliflow-0.1.0/poliflow.egg-info/top_level.txt +1 -0
- poliflow-0.1.0/pyproject.toml +22 -0
- poliflow-0.1.0/setup.cfg +4 -0
- poliflow-0.1.0/setup.py +37 -0
- poliflow-0.1.0/tests/__init__.py +0 -0
- poliflow-0.1.0/tests/test1.py +92 -0
- poliflow-0.1.0/tests/test2.py +114 -0
- poliflow-0.1.0/tests/test3.py +126 -0
- poliflow-0.1.0/tests/test_XOR.py +50 -0
- poliflow-0.1.0/tests/test_mseloss.py +14 -0
- poliflow-0.1.0/tests/test_sgd.py +26 -0
- poliflow-0.1.0/tests/test_tensor.py +15 -0
- poliflow-0.1.0/tests/test_tensor_add.py +14 -0
- poliflow-0.1.0/tests/test_tensor_mul.py +14 -0
- poliflow-0.1.0/tests/test_tensor_sum.py +17 -0
poliflow-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: poliflow
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Framework de deep learning
|
|
5
|
+
Home-page: https://github.com/Th3copolo0X/Poliflow2
|
|
6
|
+
Download-URL: https://github.com/Th3copolo0X/Poliflow2/archive/refs/tags/v0.1.tar.gz
|
|
7
|
+
Author: Eduardo Hernandez,Gerardo Hernandez
|
|
8
|
+
Author-email: Eduardo <correo@example.com>
|
|
9
|
+
Classifier: Programming Language :: Python :: 3
|
|
10
|
+
Classifier: Operating System :: OS Independent
|
|
11
|
+
Requires-Python: >=3.10
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
Requires-Dist: numpy
|
|
14
|
+
Dynamic: author
|
|
15
|
+
Dynamic: download-url
|
|
16
|
+
Dynamic: home-page
|
|
17
|
+
Dynamic: requires-python
|
|
18
|
+
|
|
19
|
+
# PoliFlow
|
|
20
|
+
|
|
21
|
+
PoliFlow es un framework de Machine Learning y Deep Learning desarrollado en Python, diseñado con fines educativos y experimentales.
|
|
22
|
+
El proyecto busca ofrecer una implementación simple y modular de redes neuronales, optimizadores y herramientas para entrenamiento de modelos.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
# Características
|
|
27
|
+
|
|
28
|
+
- Construcción de modelos secuenciales
|
|
29
|
+
- Capas densas (Dense)
|
|
30
|
+
- Funciones de activación
|
|
31
|
+
- Entrenamiento de modelos
|
|
32
|
+
- Predicción de datos
|
|
33
|
+
- Sistema modular
|
|
34
|
+
- Implementación propia sin depender de TensorFlow o PyTorch
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
# Instalación
|
|
39
|
+
|
|
40
|
+
Clona el repositorio:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
git clone https://github.com/Th3copolo0X/Poliflow2
|
|
44
|
+
cd poliflow
|
poliflow-0.1.0/README.md
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# PoliFlow
|
|
2
|
+
|
|
3
|
+
PoliFlow es un framework de Machine Learning y Deep Learning desarrollado en Python, diseñado con fines educativos y experimentales.
|
|
4
|
+
El proyecto busca ofrecer una implementación simple y modular de redes neuronales, optimizadores y herramientas para entrenamiento de modelos.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Características
|
|
9
|
+
|
|
10
|
+
- Construcción de modelos secuenciales
|
|
11
|
+
- Capas densas (Dense)
|
|
12
|
+
- Funciones de activación
|
|
13
|
+
- Entrenamiento de modelos
|
|
14
|
+
- Predicción de datos
|
|
15
|
+
- Sistema modular
|
|
16
|
+
- Implementación propia sin depender de TensorFlow o PyTorch
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# Instalación
|
|
21
|
+
|
|
22
|
+
Clona el repositorio:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
git clone https://github.com/Th3copolo0X/Poliflow2
|
|
26
|
+
cd poliflow
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: poliflow
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Framework de deep learning
|
|
5
|
+
Home-page: https://github.com/Th3copolo0X/Poliflow2
|
|
6
|
+
Download-URL: https://github.com/Th3copolo0X/Poliflow2/archive/refs/tags/v0.1.tar.gz
|
|
7
|
+
Author: Eduardo Hernandez,Gerardo Hernandez
|
|
8
|
+
Author-email: Eduardo <correo@example.com>
|
|
9
|
+
Classifier: Programming Language :: Python :: 3
|
|
10
|
+
Classifier: Operating System :: OS Independent
|
|
11
|
+
Requires-Python: >=3.10
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
Requires-Dist: numpy
|
|
14
|
+
Dynamic: author
|
|
15
|
+
Dynamic: download-url
|
|
16
|
+
Dynamic: home-page
|
|
17
|
+
Dynamic: requires-python
|
|
18
|
+
|
|
19
|
+
# PoliFlow
|
|
20
|
+
|
|
21
|
+
PoliFlow es un framework de Machine Learning y Deep Learning desarrollado en Python, diseñado con fines educativos y experimentales.
|
|
22
|
+
El proyecto busca ofrecer una implementación simple y modular de redes neuronales, optimizadores y herramientas para entrenamiento de modelos.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
# Características
|
|
27
|
+
|
|
28
|
+
- Construcción de modelos secuenciales
|
|
29
|
+
- Capas densas (Dense)
|
|
30
|
+
- Funciones de activación
|
|
31
|
+
- Entrenamiento de modelos
|
|
32
|
+
- Predicción de datos
|
|
33
|
+
- Sistema modular
|
|
34
|
+
- Implementación propia sin depender de TensorFlow o PyTorch
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
# Instalación
|
|
39
|
+
|
|
40
|
+
Clona el repositorio:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
git clone https://github.com/Th3copolo0X/Poliflow2
|
|
44
|
+
cd poliflow
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
README.md
|
|
2
|
+
pyproject.toml
|
|
3
|
+
setup.py
|
|
4
|
+
poliflow.egg-info/PKG-INFO
|
|
5
|
+
poliflow.egg-info/SOURCES.txt
|
|
6
|
+
poliflow.egg-info/dependency_links.txt
|
|
7
|
+
poliflow.egg-info/requires.txt
|
|
8
|
+
poliflow.egg-info/top_level.txt
|
|
9
|
+
tests/__init__.py
|
|
10
|
+
tests/test1.py
|
|
11
|
+
tests/test2.py
|
|
12
|
+
tests/test3.py
|
|
13
|
+
tests/test_XOR.py
|
|
14
|
+
tests/test_mseloss.py
|
|
15
|
+
tests/test_sgd.py
|
|
16
|
+
tests/test_tensor.py
|
|
17
|
+
tests/test_tensor_add.py
|
|
18
|
+
tests/test_tensor_mul.py
|
|
19
|
+
tests/test_tensor_sum.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
numpy
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
tests
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61.0"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "poliflow"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
authors = [
|
|
9
|
+
{ name="Eduardo", email="correo@example.com" }
|
|
10
|
+
]
|
|
11
|
+
description = "Framework de deep learning"
|
|
12
|
+
readme = "README.md"
|
|
13
|
+
requires-python = ">=3.9"
|
|
14
|
+
|
|
15
|
+
dependencies = [
|
|
16
|
+
"numpy",
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
classifiers = [
|
|
20
|
+
"Programming Language :: Python :: 3",
|
|
21
|
+
"Operating System :: OS Independent",
|
|
22
|
+
]
|
poliflow-0.1.0/setup.cfg
ADDED
poliflow-0.1.0/setup.py
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
from setuptools import setup, find_packages
|
|
2
|
+
|
|
3
|
+
with open("README.md", "r", encoding="utf-8") as readme:
|
|
4
|
+
long_description = readme.read()
|
|
5
|
+
|
|
6
|
+
setup(
|
|
7
|
+
name="poliflow",
|
|
8
|
+
version="0.1.2",
|
|
9
|
+
packages=find_packages(),
|
|
10
|
+
description="Framework de Machine Learning desarrollado en Python",
|
|
11
|
+
long_description=long_description,
|
|
12
|
+
long_description_content_type="text/markdown",
|
|
13
|
+
author="Eduardo Hernandez,Gerardo Hernandez",
|
|
14
|
+
url="https://github.com/Th3copolo0X/Poliflow2",
|
|
15
|
+
download_url="https://github.com/Th3copolo0X/Poliflow2/archive/refs/tags/v0.1.tar.gz",
|
|
16
|
+
keywords=[
|
|
17
|
+
"machine learning",
|
|
18
|
+
"deep learning",
|
|
19
|
+
"framework",
|
|
20
|
+
"neural networks",
|
|
21
|
+
"python"
|
|
22
|
+
],
|
|
23
|
+
classifiers=[
|
|
24
|
+
"Development Status :: 3 - Alpha",
|
|
25
|
+
"Intended Audience :: Developers",
|
|
26
|
+
"Programming Language :: Python :: 3",
|
|
27
|
+
"Programming Language :: Python :: 3.10",
|
|
28
|
+
"License :: OSI Approved :: MIT License",
|
|
29
|
+
"Operating System :: OS Independent",
|
|
30
|
+
],
|
|
31
|
+
license="MIT",
|
|
32
|
+
include_package_data=True,
|
|
33
|
+
install_requires=[
|
|
34
|
+
"numpy",
|
|
35
|
+
],
|
|
36
|
+
python_requires=">=3.10",
|
|
37
|
+
)
|
|
File without changes
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import pandas as pd
|
|
2
|
+
import numpy as np
|
|
3
|
+
import sys
|
|
4
|
+
import os
|
|
5
|
+
|
|
6
|
+
# Para que encuentre poliflow
|
|
7
|
+
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
|
|
8
|
+
|
|
9
|
+
# Importar tu framework
|
|
10
|
+
from poliflow.core.Tensor import Tensor
|
|
11
|
+
from poliflow.nn.Linear import Linear
|
|
12
|
+
from poliflow.nn.Sequential import Sequential
|
|
13
|
+
from poliflow.losses.MSE import MSELoss
|
|
14
|
+
from poliflow.optim.SGD import SGD
|
|
15
|
+
from poliflow.nn.Activation import ReLU
|
|
16
|
+
|
|
17
|
+
# =========================
|
|
18
|
+
# 1. Cargar datos
|
|
19
|
+
# =========================
|
|
20
|
+
ruta_csv = os.path.join(
|
|
21
|
+
os.path.dirname(__file__),
|
|
22
|
+
"house_dataset 2.csv"
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
df = pd.read_csv(ruta_csv)
|
|
26
|
+
|
|
27
|
+
# Features y target
|
|
28
|
+
X = df.drop(columns=["House_Price"]).values
|
|
29
|
+
y = df["House_Price"].values.reshape(-1, 1)
|
|
30
|
+
|
|
31
|
+
# Normalización
|
|
32
|
+
X = (X - X.mean(axis=0)) / X.std(axis=0)
|
|
33
|
+
y = (y - y.mean()) / y.std()
|
|
34
|
+
|
|
35
|
+
# =========================
|
|
36
|
+
# 2. Convertir a Tensor
|
|
37
|
+
# =========================
|
|
38
|
+
X_tensor = Tensor(X)
|
|
39
|
+
y_tensor = Tensor(y)
|
|
40
|
+
|
|
41
|
+
# =========================
|
|
42
|
+
# 3. Definir modelo
|
|
43
|
+
# =========================
|
|
44
|
+
input_size = X.shape[1]
|
|
45
|
+
|
|
46
|
+
model = Sequential(
|
|
47
|
+
Linear(input_size, 16),
|
|
48
|
+
ReLU(),
|
|
49
|
+
Linear(16, 8),
|
|
50
|
+
ReLU(),
|
|
51
|
+
Linear(8, 1)
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
# =========================
|
|
55
|
+
# 4. Loss y optimizador
|
|
56
|
+
# =========================
|
|
57
|
+
criterion = MSELoss()
|
|
58
|
+
optimizer = SGD(model.parameters(), lr=0.01)
|
|
59
|
+
|
|
60
|
+
# =========================
|
|
61
|
+
# 5. Entrenamiento
|
|
62
|
+
# =========================
|
|
63
|
+
epochs = 10000
|
|
64
|
+
|
|
65
|
+
for epoch in range(epochs):
|
|
66
|
+
pred = model(X_tensor)
|
|
67
|
+
loss = criterion(pred, y_tensor)
|
|
68
|
+
|
|
69
|
+
loss.backward()
|
|
70
|
+
optimizer.step()
|
|
71
|
+
optimizer.zero_grad()
|
|
72
|
+
|
|
73
|
+
if epoch % 1000 == 0:
|
|
74
|
+
try:
|
|
75
|
+
print(f"Epoch {epoch}, Loss: {loss.data}")
|
|
76
|
+
except:
|
|
77
|
+
print(f"Epoch {epoch}, Loss: {loss}")
|
|
78
|
+
|
|
79
|
+
# =========================
|
|
80
|
+
# 6. Predicción
|
|
81
|
+
# =========================
|
|
82
|
+
pred_final = model(X_tensor)
|
|
83
|
+
|
|
84
|
+
try:
|
|
85
|
+
print("Predicciones:", pred_final.data[:5])
|
|
86
|
+
except:
|
|
87
|
+
print("Predicciones:", pred_final[:5])
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
for i in range(5):
|
|
91
|
+
print("Pred:", pred_final.data[i][0],
|
|
92
|
+
"| Real:", y_tensor.data[i][0])
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import pandas as pd
|
|
2
|
+
import numpy as np
|
|
3
|
+
import sys
|
|
4
|
+
import os
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
# Para que encuentre poliflow
|
|
8
|
+
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
|
|
9
|
+
|
|
10
|
+
# Importar tu framework
|
|
11
|
+
from poliflow.grafica.grafo import dibujar_red_desde_modelo
|
|
12
|
+
from poliflow.core.Tensor import Tensor
|
|
13
|
+
from poliflow.nn.Linear import Linear
|
|
14
|
+
from poliflow.nn.Sequential import Sequential
|
|
15
|
+
from poliflow.losses.MSE import MSELoss
|
|
16
|
+
from poliflow.optim.SGD import SGD
|
|
17
|
+
from poliflow.nn.Activation import ReLU
|
|
18
|
+
from poliflow.data.split import train_test_split
|
|
19
|
+
|
|
20
|
+
# =========================
|
|
21
|
+
# 1. Cargar datos
|
|
22
|
+
# =========================
|
|
23
|
+
ruta_csv = os.path.join(
|
|
24
|
+
os.path.dirname(__file__),
|
|
25
|
+
"house_dataset 2.csv"
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
df = pd.read_csv(ruta_csv)
|
|
29
|
+
|
|
30
|
+
# Features y target
|
|
31
|
+
X = df.drop(columns=["House_Price"]).values
|
|
32
|
+
y = df["House_Price"].values.reshape(-1, 1)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
X_train, X_test, y_train, y_test = train_test_split(X, y)
|
|
37
|
+
|
|
38
|
+
# Calcular con TRAIN
|
|
39
|
+
X_mean = X_train.mean(axis=0)
|
|
40
|
+
X_std = X_train.std(axis=0)
|
|
41
|
+
|
|
42
|
+
y_mean = y_train.mean()
|
|
43
|
+
y_std = y_train.std()
|
|
44
|
+
|
|
45
|
+
# Normalizar TRAIN
|
|
46
|
+
X_train = (X_train - X_mean) / X_std
|
|
47
|
+
y_train = (y_train - y_mean) / y_std
|
|
48
|
+
|
|
49
|
+
# Normalizar TEST con los mismos valores
|
|
50
|
+
X_test = (X_test - X_mean) / X_std
|
|
51
|
+
y_test = (y_test - y_mean) / y_std
|
|
52
|
+
|
|
53
|
+
# =========================
|
|
54
|
+
# 2. Convertir a Tensor
|
|
55
|
+
# =========================
|
|
56
|
+
X_tensor = Tensor(X_train)
|
|
57
|
+
y_tensor = Tensor(y_train)
|
|
58
|
+
|
|
59
|
+
X_test_tensor = Tensor(X_test)
|
|
60
|
+
y_test_tensor = Tensor(y_test)
|
|
61
|
+
|
|
62
|
+
# =========================
|
|
63
|
+
# 3. Definir modelo
|
|
64
|
+
# =========================
|
|
65
|
+
input_size = X.shape[1]
|
|
66
|
+
|
|
67
|
+
model = Sequential(
|
|
68
|
+
Linear(input_size, 16),
|
|
69
|
+
ReLU(),
|
|
70
|
+
Linear(16, 8),
|
|
71
|
+
ReLU(),
|
|
72
|
+
Linear(8, 1)
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
# =========================
|
|
76
|
+
# 4. Loss y optimizador
|
|
77
|
+
# =========================
|
|
78
|
+
criterion = MSELoss()
|
|
79
|
+
optimizer = SGD(model.parameters(), lr=0.01)
|
|
80
|
+
|
|
81
|
+
# =========================
|
|
82
|
+
# 5. Entrenamiento
|
|
83
|
+
# =========================
|
|
84
|
+
epochs = 10000
|
|
85
|
+
|
|
86
|
+
for epoch in range(epochs):
|
|
87
|
+
pred = model(X_tensor)
|
|
88
|
+
loss = criterion(pred, y_tensor)
|
|
89
|
+
|
|
90
|
+
loss.backward()
|
|
91
|
+
optimizer.step()
|
|
92
|
+
optimizer.zero_grad()
|
|
93
|
+
|
|
94
|
+
if epoch % 1000 == 0:
|
|
95
|
+
try:
|
|
96
|
+
print(f"Epoch {epoch}, Loss: {loss.data}")
|
|
97
|
+
except:
|
|
98
|
+
print(f"Epoch {epoch}, Loss: {loss}")
|
|
99
|
+
|
|
100
|
+
# =========================
|
|
101
|
+
# 6. Predicción
|
|
102
|
+
# =========================
|
|
103
|
+
pred_final = model(X_tensor)
|
|
104
|
+
|
|
105
|
+
try:
|
|
106
|
+
print("Predicciones:", pred_final.data[:5])
|
|
107
|
+
except:
|
|
108
|
+
print("Predicciones:", pred_final[:5])
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
for i in range(5):
|
|
112
|
+
print("Pred:", pred_final.data[i][0],
|
|
113
|
+
"| Real:", y_tensor.data[i][0])
|
|
114
|
+
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import pandas as pd
|
|
2
|
+
import numpy as np
|
|
3
|
+
import sys
|
|
4
|
+
import os
|
|
5
|
+
|
|
6
|
+
# Para que encuentre poliflow
|
|
7
|
+
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
|
|
8
|
+
|
|
9
|
+
# Importar tu framework
|
|
10
|
+
from poliflow.core.Tensor import Tensor
|
|
11
|
+
from poliflow.nn.Linear import Linear
|
|
12
|
+
from poliflow.nn.Sequential import Sequential
|
|
13
|
+
from poliflow.losses.MSE import MSELoss
|
|
14
|
+
from poliflow.optim.SGD import SGD
|
|
15
|
+
from poliflow.nn.Activation import ReLU
|
|
16
|
+
from poliflow.data.split import train_test_split
|
|
17
|
+
|
|
18
|
+
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
|
|
19
|
+
|
|
20
|
+
# =========================
|
|
21
|
+
# 1. Cargar datos
|
|
22
|
+
# =========================
|
|
23
|
+
ruta_csv = os.path.join(
|
|
24
|
+
os.path.dirname(__file__),
|
|
25
|
+
"house_dataset 2.csv"
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
df = pd.read_csv(ruta_csv)
|
|
29
|
+
|
|
30
|
+
# Features y target
|
|
31
|
+
X = df.drop(columns=["House_Price"]).values
|
|
32
|
+
y = df["House_Price"].values.reshape(-1, 1)
|
|
33
|
+
|
|
34
|
+
# 🔥 LOG TRANSFORM (CLAVE)
|
|
35
|
+
y = np.log1p(y)
|
|
36
|
+
|
|
37
|
+
# =========================
|
|
38
|
+
# 2. Split
|
|
39
|
+
# =========================
|
|
40
|
+
X_train, X_test, y_train, y_test = train_test_split(X, y)
|
|
41
|
+
|
|
42
|
+
# =========================
|
|
43
|
+
# 3. Normalización (solo TRAIN)
|
|
44
|
+
# =========================
|
|
45
|
+
X_mean = X_train.mean(axis=0)
|
|
46
|
+
X_std = X_train.std(axis=0) + 1e-8
|
|
47
|
+
|
|
48
|
+
y_mean = y_train.mean()
|
|
49
|
+
y_std = y_train.std() + 1e-8
|
|
50
|
+
|
|
51
|
+
# Normalizar TRAIN
|
|
52
|
+
X_train = (X_train - X_mean) / X_std
|
|
53
|
+
y_train = (y_train - y_mean) / y_std
|
|
54
|
+
|
|
55
|
+
# Normalizar TEST
|
|
56
|
+
X_test = (X_test - X_mean) / X_std
|
|
57
|
+
y_test = (y_test - y_mean) / y_std
|
|
58
|
+
|
|
59
|
+
# =========================
|
|
60
|
+
# 4. Tensor
|
|
61
|
+
# =========================
|
|
62
|
+
X_tensor = Tensor(X_train)
|
|
63
|
+
y_tensor = Tensor(y_train)
|
|
64
|
+
|
|
65
|
+
X_test_tensor = Tensor(X_test)
|
|
66
|
+
|
|
67
|
+
# =========================
|
|
68
|
+
# 5. Modelo
|
|
69
|
+
# =========================
|
|
70
|
+
input_size = X.shape[1]
|
|
71
|
+
|
|
72
|
+
model = Sequential(
|
|
73
|
+
Linear(input_size, 16),
|
|
74
|
+
ReLU(),
|
|
75
|
+
Linear(16, 8),
|
|
76
|
+
ReLU(),
|
|
77
|
+
Linear(8, 1)
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
# =========================
|
|
81
|
+
# 6. Loss y optimizador
|
|
82
|
+
# =========================
|
|
83
|
+
criterion = MSELoss()
|
|
84
|
+
optimizer = SGD(model.parameters(), lr=0.01)
|
|
85
|
+
|
|
86
|
+
# =========================
|
|
87
|
+
# 7. Entrenamiento
|
|
88
|
+
# =========================
|
|
89
|
+
epochs = 10000 # 🔥 bajamos epochs (10000 era excesivo)
|
|
90
|
+
|
|
91
|
+
for epoch in range(epochs):
|
|
92
|
+
pred = model(X_tensor)
|
|
93
|
+
loss = criterion(pred, y_tensor)
|
|
94
|
+
|
|
95
|
+
loss.backward()
|
|
96
|
+
optimizer.step()
|
|
97
|
+
optimizer.zero_grad()
|
|
98
|
+
|
|
99
|
+
if epoch % 500 == 0:
|
|
100
|
+
print(f"Epoch {epoch}, Loss: {loss.data}")
|
|
101
|
+
|
|
102
|
+
# =========================
|
|
103
|
+
# 8. Predicción en TEST
|
|
104
|
+
# =========================
|
|
105
|
+
pred_test = model(X_test_tensor).data
|
|
106
|
+
|
|
107
|
+
# 🔄 Desnormalizar
|
|
108
|
+
y_pred_log = pred_test * y_std + y_mean
|
|
109
|
+
y_true_log = y_test * y_std + y_mean
|
|
110
|
+
|
|
111
|
+
# 🔄 Invertir log
|
|
112
|
+
y_pred = np.expm1(y_pred_log)
|
|
113
|
+
y_true = np.expm1(y_true_log)
|
|
114
|
+
|
|
115
|
+
# =========================
|
|
116
|
+
# 9. Métricas
|
|
117
|
+
# =========================
|
|
118
|
+
mse = mean_squared_error(y_true, y_pred)
|
|
119
|
+
rmse = np.sqrt(mse)
|
|
120
|
+
mae = mean_absolute_error(y_true, y_pred)
|
|
121
|
+
r2 = r2_score(y_true, y_pred)
|
|
122
|
+
|
|
123
|
+
print("\n=== RESULTADOS ===")
|
|
124
|
+
print(f"RMSE: {rmse:.2f}")
|
|
125
|
+
print(f"MAE: {mae:.2f}")
|
|
126
|
+
print(f"R²: {r2:.4f}")
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
from poliflow.core.Tensor import Tensor
|
|
3
|
+
from poliflow.nn.Linear import Linear
|
|
4
|
+
from poliflow.nn.Activation import Sigmoid
|
|
5
|
+
from poliflow.nn.Sequential import Sequential
|
|
6
|
+
from poliflow.losses.MSE import MSELoss
|
|
7
|
+
from poliflow.optim.SGD import SGD
|
|
8
|
+
|
|
9
|
+
# Datos XOR
|
|
10
|
+
X = Tensor(np.array([
|
|
11
|
+
[0, 0],
|
|
12
|
+
[0, 1],
|
|
13
|
+
[1, 0],
|
|
14
|
+
[1, 1]
|
|
15
|
+
]), requires_grad=False)
|
|
16
|
+
|
|
17
|
+
y = Tensor(np.array([
|
|
18
|
+
[0],
|
|
19
|
+
[1],
|
|
20
|
+
[1],
|
|
21
|
+
[0]
|
|
22
|
+
]), requires_grad=False)
|
|
23
|
+
|
|
24
|
+
# Modelo (con capa oculta)
|
|
25
|
+
model = Sequential(
|
|
26
|
+
Linear(2, 4),
|
|
27
|
+
Sigmoid(),
|
|
28
|
+
Linear(4, 1),
|
|
29
|
+
Sigmoid()
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
loss_fn = MSELoss()
|
|
33
|
+
optimizer = SGD(model.parameters(), lr=0.5)
|
|
34
|
+
|
|
35
|
+
# Entrenamiento
|
|
36
|
+
for epoch in range(5000):
|
|
37
|
+
y_pred = model(X)
|
|
38
|
+
|
|
39
|
+
loss = loss_fn(y_pred, y)
|
|
40
|
+
|
|
41
|
+
loss.backward()
|
|
42
|
+
optimizer.step()
|
|
43
|
+
optimizer.zero_grad()
|
|
44
|
+
|
|
45
|
+
if epoch % 500 == 0:
|
|
46
|
+
print(f"Epoch {epoch}, Loss: {loss.data}")
|
|
47
|
+
|
|
48
|
+
# Resultados
|
|
49
|
+
print("\nPredicciones XOR:")
|
|
50
|
+
print(model(X).data)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from poliflow.core.Tensor import Tensor
|
|
2
|
+
from poliflow.losses import MSELoss, MAELoss
|
|
3
|
+
|
|
4
|
+
y_pred = Tensor([2.0, 3.0], requires_grad=True)
|
|
5
|
+
y_true = Tensor([1.0, 5.0])
|
|
6
|
+
|
|
7
|
+
# MSE
|
|
8
|
+
mse = MSELoss()
|
|
9
|
+
loss1 = mse(y_pred, y_true)
|
|
10
|
+
|
|
11
|
+
loss1.backward()
|
|
12
|
+
|
|
13
|
+
print("MSE loss:", loss1.data)
|
|
14
|
+
print("grad:", y_pred.grad)
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
from poliflow.core.Tensor import Tensor
|
|
2
|
+
from poliflow.losses import MSELoss
|
|
3
|
+
from poliflow.optim import SGD
|
|
4
|
+
|
|
5
|
+
# datos
|
|
6
|
+
x = Tensor(2.0)
|
|
7
|
+
y_true = Tensor(4.0)
|
|
8
|
+
|
|
9
|
+
# parametro (peso)
|
|
10
|
+
w = Tensor(1.0, requires_grad=True)
|
|
11
|
+
|
|
12
|
+
# loss y optimizador
|
|
13
|
+
loss_fn = MSELoss()
|
|
14
|
+
optimizer = SGD([w], lr=0.15)
|
|
15
|
+
|
|
16
|
+
for epoch in range(10):
|
|
17
|
+
|
|
18
|
+
y_pred = w * x
|
|
19
|
+
|
|
20
|
+
loss = loss_fn(y_pred, y_true)
|
|
21
|
+
|
|
22
|
+
optimizer.zero_grad()
|
|
23
|
+
loss.backward()
|
|
24
|
+
optimizer.step()
|
|
25
|
+
|
|
26
|
+
print(f"Epoch {epoch}: w={w.data}, loss={loss.data}")
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# tests/test_sum_mean.py
|
|
2
|
+
|
|
3
|
+
from poliflow.core.Tensor import Tensor
|
|
4
|
+
|
|
5
|
+
x = Tensor([1.0, 2.0, 3.0], requires_grad=True)
|
|
6
|
+
|
|
7
|
+
y = x.sum()
|
|
8
|
+
y.backward()
|
|
9
|
+
|
|
10
|
+
print("sum grad:", x.grad)
|
|
11
|
+
|
|
12
|
+
x = Tensor([1.0, 2.0, 3.0], requires_grad=True)
|
|
13
|
+
|
|
14
|
+
y = x.mean()
|
|
15
|
+
y.backward()
|
|
16
|
+
|
|
17
|
+
print("mean grad:", x.grad)
|