1. 程式人生 > >[TensorFlowJS只如初見]實戰四·使用TensorFlowJS擬合曲線(類似TensorFlow原生實現方法)

[TensorFlowJS只如初見]實戰四·使用TensorFlowJS擬合曲線(類似TensorFlow原生實現方法)

[TensorFlowJS只如初見]實戰四·使用TensorFlowJS擬合曲線(類似TensorFlow原生實現方法)

  • 問題描述
    擬合y= x*x -2x +3 + 0.1(-1到1的隨機值) 曲線
    給定x範圍(0,3)

  • 問題分析
    直線擬合部落格中,我們使用最簡單的y=wx+b的模型成功擬合了一條直線,現在我們在進一步進行曲線的擬合。簡單的y=wx+b模型已經無法滿足我們的需求,需要利用更多的神經元來解決問題了。

  • 程式碼

<html>

<head>
  <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs"
>
</script> </head> <body> <button class="btn btn-primary" onclick="fnRun0();">開始0</button> <div id="p0Id">out0</div> <button class="btn btn-primary" onclick="fnRun1();">開始1</button> <div id="p1Id">out1</div> <button class="
btn btn-primary"
onclick="learnLinear();">
開始2</button> <div id="p2Id">out2</div> </body> <script> //document.getElementById("p0Id").innerHTML = 0; function get_ys(xs) { var ys = new Array(); for (var i = 0; i < xs.length; i++) { ys[i] = xs[i] * xs[i] -
2 * xs[i] + 3 + (0.1 * (2 * Math.random() - 1)); } return (ys); } var xs = new Array(); for (var i = 0; i < 100; i++) { xs[i] = 0.02 * i; } var ys = get_ys(xs); const xst = tf.tensor(xs, [xs.length, 1]); const yst = tf.tensor(ys, [ys.length, 1]); function get_weights(shape) { return (tf.variable(tf.randomNormal(shape))); } function get_bais(shape) { return (tf.variable(tf.fill(shape, 0.1))); } const w1 = get_weights([1, 10]); const w2 = get_weights([10, 1]); const b1 = get_bais([1, 10]); const b2 = get_bais([1, 1]); function predict(x) { return tf.tidy(() => { const l1 = tf.elu(tf.add(tf.matMul(x, w1), b1)); //不支援運算子過載 tf.add() 不能寫成 + const y = tf.add(tf.matMul(l1, w2), b2); return y; }); } function loss(predictions, labels) { // 將labels(實際的值)進行抽象 // 然後獲取平均數. return tf.tidy(() => { const meanSquareError = tf.mean(tf.square(tf.sub(predictions, labels))); return meanSquareError; }); } const learningRate = 1; const optimizer = tf.train.adagrad(learningRate); const numIterations = 1001; function training() { for (var iter = 0; iter < numIterations; iter++) { optimizer.minimize(() => { const loss_var = loss(predict(xst), yst); if(iter % 100 ==0) loss_var.print(); return loss_var; }) } } training(); const text_xs = tf.tensor([0,1,3], [3, 1]); predict(text_xs).print();
</script> </html>
  • 輸出結果
    進行1000輪訓練以後,我們輸入[0,1,3]進行預測,得到結果為
    [[2.9647527],
    [1.9793538],
    [3.9484348]]
    較好地擬合了曲線。

log

"Tensor
    4.915620803833008"
"Tensor
    0.018092654645442963"
"Tensor
    0.01064694207161665"
"Tensor
    0.008950537070631981"
"Tensor
    0.008051211014389992"
"Tensor
    0.007439687382429838"
"Tensor
    0.006973605137318373"
"Tensor
    0.006602670066058636"
"Tensor
    0.006299363449215889"
"Tensor
    0.0060538649559021"
"Tensor
    0.005853266455233097"
"Tensor
    [[2.9647527],
     [1.9793538],
     [3.9484348]]"