线性回归作为机器学习中非常基础的一个算法,也是非常重要的一个算法,所以,本文简单对线性回归做一个简介,并讲解如何利用TensorFlowjs在前端页面实现线性回归模型。
对于线性回归的定义:利用数理统计中的回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。
上面的定义看起来很长,也很难懂,简单说就是像小学学的一元一次方程、二元一次方程等等,当然在机器学习里面,数据的特征会比较多,而且特征之间不一定是一次关系,可能是幂次方的关系,所以在机器学习里面就是多元多次的一个方程。
例如:
准备线性回归训练数据
创建index.html文件
创建script.js文件,编造数据。
window.onload = () => {
// 随便编造输入数据和输出数据
const x = [1, 2, 3, 4];
const y = [1, 3, 5, 7];
}
使用tfvis可视化训练数据
先安装tensorflow.js可视化库。
npm install @tensorflow/tfjs-vis -S
在JS文件中引入该库。
import * as tfvis from '@tensorflow/tfjs-vis';
利用散点图将数据可视化出来。
有关tfvis的相关API详解可参考:https://js.tensorflow.org/api_vis/1.5.1/
// 利用散点图可视化数据
tfvis.render.scatterplot(
{'name':'线性回归训练数据'},
{values: xs.map((x,i) => ({x, y: ys[i]}))},
// 修改X轴和Y轴的范围
{xAxisDomain:[0,5], yAxisDomain:[0,8]}
);
利用parcel执行,访问地址,可以看到执行结果。
数据可视化结果单层单个神经元组成的神经网络
我们的线性回归比较简单,所以这边只是用一个很简单的神经网络就可以解决。
导入tensorflow.js的API
import * as tf from '@tensorflow/tfjs';
初始化模型
绝大多数的模型都是连续的模型,即上一层的输出是下一层的输入,所以这边用tf.sequential()。
// 初始化模型
const model = tf.sequential();
为初始化好的模型添加网络层
// 添加网络层
model.add(tf.layers.dense({units: 1, inputShape: [1]}))
tf.layers.dense()是利用全连接层,内部完成的工作为: output = activation(dot(input, kernel) + bias),
就是将输入和权重矩阵进行点乘操作,加上偏置,经过激活函数输出。
units设置为1,表示1个神经元。
inputShape:指定输入数据的形状,[1]表示输入数据是一维的,每次输入1个数据。
定义损失函数:均方误差(MSE)和设置优化器:随机梯度下降(SGD)
关于什么是损失函数,什么是均方误差,什么是优化器,什么是SGD,这边就不过多赘述了,相信大家都是有一定机器学习基础的。
// 定义损失函数:均方误差 优化器:SGD
model.compile({loss: tf.losses.meanSquaredError, optimizer: tf.train.sgd(0.1)})
将训练数据转成Tensor
Tensor Flow用tensor数据结构来代表所有数据。操作间传递的数据都是tensor。每个tensor是一个类型化的多维数组。例如:可以把图像数据集表示成多维数组。使用tensor可以提高机器学习的效率。
// 将训练数据转成Tensor
const inputs = tf.tensor(xs);
const labels = tf.tensor(ys);
训练模型并可视化训练过程
这边用到的语法是async语法,如果不了解那就需要你先去了解一下,或者你也可以按照我的步骤继续往下做,后续再去学习这个语法。
这边需要在packge.json文件添加如下图代码,表示使用最新的谷歌浏览器,才能执行async语法。
将特征和标签添加到模型中进行训练,设置批次大小(batch Size),迭代次数(epochs),并可视化训练结果。
// 训练模型并可视化训练过程
await model.fit(inputs, labels,{
batchSize: 4,
epochs: 100,
callbacks: tfvis.show.fitCallbacks(
{name: "训练过程可视化"},
['loss'],
)
});
这里的await是等待训练结果。 因为 async 函数返回一个 Promise 对象,所以 await 可以用于等待一个 async 函数的返回值。
在浏览器中可以看见损失函数是动态变化的。因为我们这边设置的batchSize大小和数据集的大小一样,都是4,所以每个batch结束的损失值和每个epoch结束的损失一样。但总的可以看出损失值是在不断变小的。
上面我们已经将模型训练好了,接下来我们试着用训练好的模型来进行预测,看看效果怎么样。
// 模型预测
const output = model.predict(tf.tensor([1.5]));
// 输出结果也是一个tensor,将tensor转成数字
const predict = output.dataSync()
console.log(predict[0])
可以看出结果非常接近2,我们输出数据与输出结果满足的关系就是。
源码链接:VScode中利用TensorFLow.js实现线性回归源码-机器学习文档类资源-CSDN下载
以上就是今天要讲的内容,本文仅仅简单介绍了TensoFlow.js的使用,关于TensoFlow.js的其他用法,后续我们再继续介绍。