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 鈥榥ull鈥 has been blocked by CORS policy: No 鈥楢ccess-Control-Allow-Origin鈥 header is present on the requested resource. If an opaque response serves your needs, set the request鈥檚 mode to 鈥榥o-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