1+ """
2+ ===================================================
3+ Test de QA Final: MLP Quantizado y MiniScaler
4+ Evalúa: Cuantificación INT8 Híbrida y Preprocesamiento in-place.
5+ """
6+
7+ import os
8+ from miniml .ml_runtime import MiniNeuralNetwork , MiniScaler
9+
10+ print ("1. [MLP - Sin Escalar] Entrenando red para XOR estándar..." )
11+ dataset_unscaled = [
12+ [0.0 , 0.0 , 0 ],
13+ [0.0 , 1.0 , 1 ],
14+ [1.0 , 0.0 , 1 ],
15+ [1.0 , 1.0 , 0 ]
16+ ]
17+ nn_unscaled = MiniNeuralNetwork (n_inputs = 2 , n_hidden = 4 , n_outputs = 1 , epochs = 2000 , learning_rate = 0.1 , seed = 42 )
18+ nn_unscaled .fit (dataset_unscaled )
19+
20+ print ("2. [MLP - Con Escalar] Entrenando red con datos de gran magnitud..." )
21+ # Simulamos lecturas de sensores que van de 0 a 100
22+ dataset_raw = [
23+ [0.0 , 0.0 , 0 ],
24+ [0.0 , 100.0 , 1 ],
25+ [100.0 , 0.0 , 1 ],
26+ [100.0 , 100.0 , 0 ]
27+ ]
28+
29+ # Separar para ajustar el escalador
30+ X_raw = [row [:- 1 ] for row in dataset_raw ]
31+ y_raw = [row [- 1 ] for row in dataset_raw ]
32+
33+ scaler = MiniScaler (method = 'minmax' , feature_range = (0 , 1 ))
34+ scaler .fit (X_raw )
35+
36+ # Aplicar transformación al dataset de entrenamiento
37+ dataset_scaled = []
38+ for x , y in zip (X_raw , y_raw ):
39+ dataset_scaled .append (scaler .transform (x ) + [y ])
40+
41+ nn_scaled = MiniNeuralNetwork (n_inputs = 2 , n_hidden = 4 , n_outputs = 1 , epochs = 2000 , learning_rate = 0.1 , seed = 42 )
42+ nn_scaled .fit (dataset_scaled )
43+
44+ print ("\n 3. Evaluando IA en PC (Python):" )
45+ # Prueba Unscaled
46+ test_unscaled = [[0.0 , 1.0 ], [1.0 , 1.0 ]]
47+ preds_uns = nn_unscaled .predict (test_unscaled )
48+ print (f" [Sin Escalar] Muestra [0.0, 1.0] -> Predicción: { preds_uns [0 ][0 ]:.4f} (Esperado: ~1.0)" )
49+ print (f" [Sin Escalar] Muestra [1.0, 1.0] -> Predicción: { preds_uns [1 ][0 ]:.4f} (Esperado: ~0.0)" )
50+
51+ # Prueba Scaled
52+ test_raw_inputs = [[0.0 , 100.0 ], [100.0 , 100.0 ]]
53+ test_raw_scaled = [scaler .transform (row ) for row in test_raw_inputs ]
54+ preds_scl = nn_scaled .predict (test_raw_scaled )
55+ print (f" [Con Escalar] Muestra [0.0, 100.0] -> Predicción: { preds_scl [0 ][0 ]:.4f} (Esperado: ~1.0)" )
56+ print (f" [Con Escalar] Muestra [100.0, 100.0] -> Predicción: { preds_scl [1 ][0 ]:.4f} (Esperado: ~0.0)" )
57+
58+ print ("\n 4. Cuantizando Modelos (INT8/Híbrido) y Exportando a C++..." )
59+ os .makedirs ("exports" , exist_ok = True )
60+ # La cuantización requiere haber corrido un fit() o calibrate() previo
61+ nn_unscaled .quantize ()
62+ nn_scaled .quantize ()
63+
64+ cpp_nn_unscaled = nn_unscaled .to_arduino_code (fn_name = "predict_nn_unscaled" )
65+ cpp_scaler = scaler .to_arduino_code (fn_name = "preprocess_minmax" )
66+ cpp_nn_scaled = nn_scaled .to_arduino_code (fn_name = "predict_nn_scaled" )
67+
68+ header_content = f"""#ifndef MINIML_MLP_TEST_H
69+ #define MINIML_MLP_TEST_H
70+
71+ #include <stdint.h>
72+ #include <math.h>
73+
74+ { cpp_nn_unscaled }
75+
76+ { cpp_scaler }
77+
78+ { cpp_nn_scaled }
79+
80+ #endif
81+ """
82+
83+ with open ("exports/miniml_mlp.h" , "w" ) as f :
84+ f .write (header_content )
85+ print (" [OK] Exportación exitosa. Listo para Wokwi." )
0 commit comments