Estoy tratando de crear un modelo tensorflow.js ( con javascript ) para predecir el cuadrado de un número, así que tengo una función para crear xData (x) y yData (x²).
He intentado usar muchas capas ocultas con diferentes unidades y entrenar con mil épocas pero la pérdida es muy alta y las predicciones no son nada buenas.
aquí está mi código:
const tf=require("@tensorflow/tfjs-node"); let dataX=[ //0, 1, 2, 3, ..., 1000; ]; let dataY=[ //0, 1, 4, 9, ..., 1000000; ] for (let i = 0; i < 1000; i++) { dataX.splice(0,0, i); dataY.splice(0,0, i**2); } class AI{ compile(){ const model=tf.sequential(); //Input & hidenA layer model.add(tf.layers.dense({ inputShape: [1], units: 32, activation: 'sigmoid', useBias: true })); //HidenB layer model.add(tf.layers.dense({ units: 32, activation: 'sigmoid', useBias: true })) //Output layer model.add(tf.layers.dense({ units: 1, activation: 'sigmoid', useBias: true })) let sgdOpt=tf.train.sgd(0.00001) model.compile({ loss: 'meanSquaredError', optimizer: sgdOpt }) return model; } run(){ const model=this.compile(); const xs=tf.tensor(dataX) const ys=tf.tensor(dataY) try{ model.summary(); model.fit(xs, ys, { epochs: 1000, }).then(()=>{ const data=tf.tensor([10]); const prediction=model.predict(data); prediction.print(); }) }catch(e){ } } } const ai=new AI(); ai.run();Sé que esto va a sonar extraño, pero creo que te estás perdiendo algunas características críticas en las que la IA podría derivar un método abstracto.
Voy a usar https://playground.tensorflow.org/ para tratar de ilustrar lo que estoy pensando. Tienen un problema de clasificación (sé que el tuyo es regresión) que creo que realmente ilustra algunos puntos clave.
En primer lugar, está utilizando la activación sigmoidea en cada capa oculta. Sigmoid tiene su parte de problemas con el entrenamiento.
Después de 1000 épocas con una activación sigmoidea, notará que la red obtiene una solución bastante lineal para este problema circular:
Simplemente cambiando la activación a ReLU, puede ver una solución mucho mejor en 1/10 de las épocas.
Como puede ver en la imagen de arriba, la solución con ReLU fue muy puntiaguda. Debería haber creado idealmente un círculo. Tiene los mismos problemas en el gráfico de una línea frente a un número al cuadrado. De hecho, cubro este problema exacto en el Capítulo 8 de mi libro , y aunque puedo enseñarle a la IA a obtener una respuesta perfectamente aceptable para 7**2 === ~~49 , no funciona bien para números más grandes.
La razón, creo que es bastante simple. Si quiero que el modelo pueda determinar el cuadrado de un número, necesitaré derivar características que lo ayuden a ver esa diferencia.
Volvamos a nuestro ejemplo del patio de recreo. ¿Ves cómo tiene bordes afilados? ¿Qué pasa si le damos algunas características adicionales a la entrada de nuestro modelo, como cuadrados de cada valor? ¡Lo vemos al instante (en 40 épocas) tiene una respuesta sólida!
Entonces, al crear una entrada de características de cuadrados, el modelo puede derivar una clasificación no lineal suave. Sin embargo, cuando su modelo es tan simple que cuadrar su entrada sería la respuesta, está limitado en las formas en que puede agregar características. Es por eso que estoy de acuerdo con que mi pequeño ejemplo sea "más o menos" preciso. No es un problema del mundo real. Pero si realmente desea crear un modelo que eleve los números al cuadrado sin agregar eso como una característica, tendrá que derivar características como entrada para las que el modelo pueda determinar las respuestas.