No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso de TensorFlow.js

Curso de TensorFlow.js

Alejandro Santamaria

Alejandro Santamaria

Preparando datos para un modelo de regresión lineal

16/21
Recursos

Aportes 12

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

codigo hasta el momento archivo index.html

<!DOCTYPE html>

<html lang="es">
<head>
    <meta charset="UTF-8">
            
    <title> Modelo Regresion </title>

    <!-- Importar TensorFlow.js -->
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/[email protected]/dist/tf.min.js"></script>
    <!-- Importar tfjs-vis  Visualizacion-->
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/[email protected]/dist/tfjs-vis.umd.min.js"></script>
 
</head>

<body>
    <!-- Importar el archivo principal -->
    <script src="script.js"></script>
</body>
</html>

y luego archvo script.js (debe estar en la misma careta de index.html


/*

{
  "IngresoPromedioZona": 79545.45857,
	"EdadPromedioZona": 5.682861322,
	"NumeroDeCuartosPromedio": 7.009188143,
	"NumeroRecamarasPromedio": 4.09,
	"PoblacionZona": 23086.8005,
	"Precio": 1059033.558,
	"Direccion": "No disponible"
}

*/

async function getData() {
    const datosCasasR = await fetch('https://static.platzi.com/media/public/uploads/datos-entrenamiento_15cd99ce-3561-494e-8f56-9492d4e86438.json');  
    const datosCasas = await datosCasasR.json();  
    const datosLimpios = datosCasas.map(casa => ({
      precio: casa.Precio,
      cuartos: casa.NumeroDeCuartosPromedio
    }))
    .filter(casa => (casa.precio != null && casa.cuartos != null));
    
    return datosLimpios;
  }
  
  function visualizarDatos(data){
    const valores = data.map(d => ({
      x: d.cuartos,
      y: d.precio,
    }));
  
    tfvis.render.scatterplot(
      {name: 'Cuartos vs Precio'},
      {values: valores}, 
      {
        xLabel: 'Cuartos',
        yLabel: 'Precio',
        height: 300
      }
    );
  }

function crearModelo(){
  const modelo = tf.sequential(); 
    
  // agregar capa oculta que va a recibir 1 dato
  modelo.add(tf.layers.dense({ inputShape: [1], units: 1, useBias: true }));
  
  // agregar una capa de salida que va a tener 1 sola unidad
  modelo.add(tf.layers.dense({ units: 1, useBias: true }));

  return modelo;
}

const optimizador = tf.train.adam()
const funcion_perdida = tf.losses.meanSquaredError;
const metricas = ['mse'];

async function entrenarModelo(model, inputs, labels) {
  // Prepare the model for training.  
  model.compile({
    optimizer: optimizador,
    loss: funcion_perdida,
    metrics: metricas,
  });
  
  const surface = { name: 'show.history live', tab: 'Training' };
  const tamanioBatch = 28;
  const epochs = 50;
  const history = [];
  
  return await model.fit(inputs, labels, {
    tamanioBatch,
    epochs,
    shuffle: true,
    callbacks: tfvis.show.fitCallbacks(
      { name: 'Training Performance' },
      ['loss', 'mse'], 
      { height: 200, callbacks: ['onEpochEnd'] }
    )
  });
}


function convertirDatosATensores(data){
  return tf.tidy(() => {
    tf.util.shuffle(data);

    const entradas = data.map(d => d.cuartos)
    const etiquetas = data.map(d => d.precio);

    const tensorEntradas = tf.tensor2d(entradas, [entradas.length, 1]);
    const tensorEtiquetas = tf.tensor2d(etiquetas, [etiquetas.length, 1]);

    
    const entradasMax = tensorEntradas.max();
    const entradasMin = tensorEntradas.min();  
    const etiquetasMax = tensorEtiquetas.max();
    const etiquetasMin = tensorEtiquetas.min();

    // (dato -min) / (max-min)
    const entradasNormalizadas = tensorEntradas.sub(entradasMin).div(entradasMax.sub(entradasMin));
    const etiquetasNormalizadas = tensorEtiquetas.sub(etiquetasMin).div(etiquetasMax.sub(etiquetasMin));
  
      return {
        entradas: entradasNormalizadas,
        etiquetas: etiquetasNormalizadas,
        // Return the min/max bounds so we can use them later.
        entradasMax,
        entradasMin,
        etiquetasMax,
        etiquetasMin,
      }

  });
}

var modelo;
async function run() {

    const data = await getData();

    visualizarDatos(data);

    modelo = crearModelo();

    const tensorData = convertirDatosATensores(data);
    const {entradas, etiquetas} = tensorData;

    await entrenarModelo(modelo, entradas, etiquetas);
    
}

run();



Estoy un poco perdido en este curso, no sé si tal vez seré yo pero lo siento como muy vacío y no logro captar gran parte de lo que el profesor intenta explicar, es como si sólo estuviera viendo vídeos de cómo escribe código pero muy poca explicación (repito, espero ser yo), y en clases anteriores vi los videos un poco faltos de explicación y todo muy por encima. 😦

  • tf.tensor2d(values, shape): donde values es una lista con los valores de entrada, y shape es una lista que especifica las dimensiones [fila, columna]. En este caso se creó el tensor2d con 5000 filas y 1 columna.
  • tidy(): tiene el objetivo de borrar en memoria aquellos tensores que no son útiles, de esta manera TensorFlow mantiene el control y decide cual entrada conservar (porque se usará en otra parte del código) y cual no.
  • history[ ]: mantiene las métricas a lo largo del entrenamiento para poder graficarlas (sería el registro de la función de pérdida a lo largo del entrenamiento).

Porque la variable surface y history no se usan ??

Excelente explicación, ahora tiene mucho sentido la parte teórica del inicio, las variables son claras y se entiende casi en su totalidad para qué sirve cada una. Gracias.

no logro sacar el modelo me sale un error de asincronismo en la funcionde entrenarMOdelo si porfa alguien que le funcione puede pegar el codigo para compararlo se lo agradezco ya he revisado pero todo esta bien.

La librería de TensorFlow usada en el curso, da un error al ejecutarla.

https://js.tensorflow.org/api/latest/ recomiendo un monton lo que creo que es la documentacion de tensorflow.js si no se saben que hace tal funcion de tf lo buscan alli, es oficial de la api y explica claro con ejemplos, eso si, esta en ingles

Les recomiendo usar la extensión de live server de vscode. Recuerden lanzxarla con el archivo HTML.

Hasta ahora es muy buena la forma como correr el modelo en el navegador.

Porque el optimizador tiene el resultado de la ejecucion de adam() y no su referencia? no entendi eso.

Pregunta: ¿por que me da este error?

-Access to fetch at ‘https://static.platzi.com/media/public/uploads/datos-entrenamiento_15cd99ce-3561-494e-8f56-9492d4e86438.json’ from origin ‘null’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. If an opaque response serves your needs, set the request’s mode to ‘no-cors’ to fetch the resource with CORS disabled.
static.platzi.com/media/public/uploads/datos-entrenamiento_15cd99ce-3561-494e-8f56-9492d4e86438.json:1

-Failed to load resource: net::ERR_FAILED
script.js:51

-Uncaught (in promise) TypeError: Failed to fetch

seguramente sea alguna ignorancia mía xd