[TensorFlowJS只如初見]實戰四·使用TensorFlowJS擬合曲線(類似TensorFlow原生實現方法)
阿新 • • 發佈:2018-12-01
[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]]"