備忘錄_20160105(定位) 修改 回首頁

程式 2019-10-01 01:06:21 1569863181 100
tensorflow javascript 初體驗,尋找 y=ax+b 的 a 與 b

tensorflow javascript 初體驗,尋找 y=ax+b 的 a 與 b
20191001_test01.htm
index.html (另一個測試)
index.html (y=a*x1^2+b*x2+c) (請開啟 主控台 觀看結果)
yolo 可以參考 https://medium.com/cubo-ai/tensorflow-js-%E5%88%9D%E6%8E%A2-yolo-3be7e63f7c96

<html>

  <head>

    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    
    <!-- Load TensorFlow.js -->
    <!-- <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs/dist/tf.min.js"> </script> -->
    <script src="tf.min.js"> </script> <!-- tf.min.js 與 tf.min.js.map 是需要的兩個檔案 -->
    
  </head>

  <body>
    
    <div>運用 tensorflow javascript 版本來解決參數尋找的問題。</div>
    <br>
    <div> y = ax + b = 3.8x + 7.2</div>
    <br>
    <div id="div0"></div>
    <hr>
    <div id="div1"></div>
    <div id="div2"></div>
    
    <script>
      
      function gebi(strId)
      {
        return document.getElementById(strId);
      }
      
      const correctAnswerA = 3.8; // 正確答案
      const correctAnswerB = 7.2; // 正確答案
      const dataCount = 100;      // 訓練資料筆數
      const iterations = 1000;    // 疊代次數
      
      window.onload=function()
      {
        const trainingData = generateTrainingData(dataCount, correctAnswerA, correctAnswerB);
        learnCoefficients(trainingData, iterations);
      }
      
      const trainingAnswerA = tf.variable(tf.scalar(Math.random()));
      const trainingAnswerB = tf.variable(tf.scalar(Math.random()));
      
      function generateTrainingData(numPoints, answerA, answerB) 
      {
        return tf.tidy(() => 
          {
            // 產生常態分佈的隨機資料
            const xs = tf.randomNormal([numPoints], -1, 1);
            // 套用正確模型產生答案
            const ansA = tf.scalar(answerA);
            const ansB = tf.scalar(answerB);
            const ys = ansA.mul(xs).add(ansB);
            // 回傳訓練資料與答案
            return {xs, ys};
          })
      }
      
      function predict(x) 
      {
        // 假定已知公式是 y=ax+b 才有辦法寫出這個 predict 函數
        return tf.tidy(() => { return trainingAnswerA.mul(x).add(trainingAnswerB) });
      }
      
      function loss(predictions, labels)
      {
        const meanSquareError = predictions.sub(labels).square().mean();
        return meanSquareError;
      }
      
      function train(xs, ys, numIterations) 
      {
        const learningRate = 0.15;
        const optimizer = tf.train.sgd(learningRate);
        
        for (let iter = 0; iter < numIterations; iter++) 
        {
          optimizer.minimize(() => 
            {
              const predsYs = predict(xs);
              return loss(predsYs, ys);
            });
        }
      }

      async function learnCoefficients(trainingData, iterations) 
      {
        gebi("div0").innerHTML='Correct Answer: '+(correctAnswerA)+' , '+(correctAnswerB);
        gebi("div1").innerHTML='Before Training: '+(await trainingAnswerA.data())+' , '+(await trainingAnswerB.data());
      
        // Train the model!
        await train(trainingData.xs, trainingData.ys, iterations);
      
        // 印出訓練結果
        gebi("div2").innerHTML='After TRaining: '+(await trainingAnswerA.data())+' , '+(await trainingAnswerB.data());
      }
      
    </script>
    
  </body>
</html>