Vscode中利用TensorFlowjs实现线性回归

 

前言

线性回归作为机器学习中非常基础的一个算法,也是非常重要的一个算法,所以,本文简单对线性回归做一个简介,并讲解如何利用TensorFlowjs在前端页面实现线性回归模型。

一、线性回归是什么?

对于线性回归的定义:利用数理统计中的回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。

上面的定义看起来很长,也很难懂,简单说就是像小学学的一元一次方程、二元一次方程等等,当然在机器学习里面,数据的特征会比较多,而且特征之间不一定是一次关系,可能是幂次方的关系,所以在机器学习里面就是多元多次的一个方程。

例如:

  • 身高、体重预测:利用身高预测体重,就是利用已有的数据找出身高和体重之间的关系,给你一个人新的体重,能够预测出这个人的身高。
  • 房价预测:利用面积、楼层、距离市中心距离、城市犯罪率、城市一氧化氮的浓度等等来预测房价,也就是利用已有数据找出这些影响房价的因素(特征)与房价之间的关系。当给你一组新的房屋数据的时候,能够预测出这个房屋的价格。

二、实验步骤

1.引入库

  • 准备并可视化数据
  • 利用TensorFlow.js搭建一个简单的神经网络
  • 训练模型并预测

三、代码演示

1、准备并可视化数据

准备线性回归训练数据

创建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执行,访问地址,可以看到执行结果。

Vscode中利用TensorFlowjs实现线性回归_第1张图片 数据可视化结果

2、定义模型结构

单层单个神经元组成的神经网络

我们的线性回归比较简单,所以这边只是用一个很简单的神经网络就可以解决。

导入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)})

3、模型训练并可视化训练过程

将训练数据转成Tensor

Tensor Flow用tensor数据结构来代表所有数据。操作间传递的数据都是tensor。每个tensor是一个类型化的多维数组。例如:可以把图像数据集表示成多维数组。使用tensor可以提高机器学习的效率。

// 将训练数据转成Tensor
const inputs = tf.tensor(xs);
const labels = tf.tensor(ys);

训练模型并可视化训练过程

这边用到的语法是async语法,如果不了解那就需要你先去了解一下,或者你也可以按照我的步骤继续往下做,后续再去学习这个语法。

这边需要在packge.json文件添加如下图代码,表示使用最新的谷歌浏览器,才能执行async语法。

Vscode中利用TensorFlowjs实现线性回归_第2张图片

将特征和标签添加到模型中进行训练,设置批次大小(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结束的损失一样。但总的可以看出损失值是在不断变小的。

Vscode中利用TensorFlowjs实现线性回归_第3张图片

4、模型预测

上面我们已经将模型训练好了,接下来我们试着用训练好的模型来进行预测,看看效果怎么样。

// 模型预测
const output = model.predict(tf.tensor([1.5]));  
// 输出结果也是一个tensor,将tensor转成数字
const predict = output.dataSync()
console.log(predict[0])

Vscode中利用TensorFlowjs实现线性回归_第4张图片

 可以看出结果非常接近2,我们输出数据与输出结果满足的关系就是y = 2x-1

总结

源码链接:VScode中利用TensorFLow.js实现线性回归源码-机器学习文档类资源-CSDN下载

以上就是今天要讲的内容,本文仅仅简单介绍了TensoFlow.js的使用,关于TensoFlow.js的其他用法,后续我们再继续介绍。

你可能感兴趣的:(人工智能,线性回归,vscode,人工智能,tensorflow)