热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在浏览器中进行深度学习:TensorFlow.js(二)第一个模型,线性回归

2019独角兽企业重金招聘Python工程师标准笔者在上一篇文章中介绍了TensorFlow.js中的基本概念,以及机器学习的数学基础,线性代数的

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

笔者在上一篇文章中介绍了TensorFlow.js中的基本概念,以及机器学习的数学基础,线性代数的基本知识。在这一遍文章里,我们来看一看如何利用TensorFlow.js来构建数学模型,以及进行学习的基本过程。

学习的过程基本如下:

  1. 准备训练数据
  2. 构建一个模型
  3. 利用训练数据和模型,进行迭代的学习
  4. 模型训练完毕,用这个模型对新的数据进行预测(这里我们先略过对模型的验证部分)

好了,我们以最简单的线性回归为例子,看看这个过程。

准备数据

084551_LH6y_1450051.png

如上图所示,我在二维坐标系中生成了7个点,让它们在我假想的某条直线附近。我以这几个点作为我的训练数据。

训练数据的初始化代码如下,这里tx是所有点数据的x坐标,ty是所有点数据的坐标。

const train_x = tf.tensor1d(tx);
const train_y = tf.tensor1d(ty);

模型选择

所有的模型都是错的,有的模型更好。

所谓的模型,也就是一个函数f,对应于某个输入数据,计算出某些输出数据。模型可以复杂,可以简单。简单的模型不一定不好,复杂的模型也不一定好。

我们用线性模型举例,数学上就是假定 Y = wX + b

在这个模型中,有两个参数需要确定,w和b。

模型既然是个函数,那么它的代码也就很容易理解了:

const f = x => w.mul(x).add(b);

当然你也可以这样写:

const f = function(x){return w.mul(x).add(b);}
}

迭代学习

学习的过程我们称作训练,训练通常是一个迭代的过程,这个过程中,通常需要这几样东西:

  • 一个损失函数(loss function),损失函数定义了模型是不是足够好,通常loss越小越好。
  • 一个优化器 (optimizer),优化器通过某种算法来决定如何改变参数的值,使得损失函数最小化。
  • 迭代循环, 通过循环 -> 调用优化器,得到新的参数,计算损失, 最终当损失足够小时,可以认为训练结束了。

训练代码如下:

初始化参数,这里使用随机数来作为参数的初始值。(注意,初始参数并不总是随机选择的。)

const w = tf.variable(tf.scalar(Math.random()));
const b = tf.variable(tf.scalar(Math.random()));

初始化学习参数,

  • numIterations是迭代的次数,一般次数越多,模型的拟合就越好,但是就需要花费越多的计算
  • learningRate是学习率,这个值越大,学的速度就越快,但是也会更加容易错过极值点。

const numIterations = 200;
const learningRate = 1;

选择一个优化器,这里我选择了adam。TensorFlow.js提供了多种优化器,例如sgd,momentum等等,大家可以根据自己的需要来选择。

const optimizer = tf.train.adam(learningRate);

对于损失函数,我们采用的是均方差 

105300_NZgq_1450051.png

const loss = (pred, label) => pred.sub(label).square().mean();

或者可以写作:

function loss(predictions, labels) {const meanSquareError = predictions.sub(labels).square().mean();return meanSquareError;
}

然后就是训练的过程啦:

for (let iter = 0; iter {const loss_var = loss(f(train_x), train_y);loss_var.print();return loss_var;})
}

在训练过程中,我们调用tensor的print()方法打印出损失的值,看看训练过程是不是收敛。当选择的模型,参数,优化器不合适的时候,有可能训练过程并不收敛。

训练的结果我们就等到了w和b的值。也就是确定了直线的斜率和截距。
大家可以尝试我的演示代码

我们可以看到学习过程中是如何慢慢收敛到最后的结果的直线。

总结

本文描述了一个使用tensoflow.js来进行最简单的线性回归模型的学习的过程。希望大家可以通过这个简单的例子了解机器学习的基本思路。

参考

  • 在浏览器中进行深度学习:TensorFlow.js (一)基本概念

转载于:https://my.oschina.net/taogang/blog/1793835


推荐阅读
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • plt python 画直线_机器学习干货,一步一步通过Python实现梯度下降的学习
    GradientDescent-梯度下降梯度下降法(英语:Gradientdescent)是一个一阶最优化算法,通常也称为最速下降法。要使用梯度下降法找 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 本文介绍了在Python张量流中使用make_merged_spec()方法合并设备规格对象的方法和语法,以及参数和返回值的说明,并提供了一个示例代码。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • 我用Tkinter制作了一个图形用户界面,有两个主按钮:“开始”和“停止”。请您就如何使用“停止”按钮终止“开始”按钮为以下代码调用的已运行功能提供建议 ... [详细]
  • 在本教程中,我们将看到如何使用FLASK制作第一个用于机器学习模型的RESTAPI。我们将从创建机器学习模型开始。然后,我们将看到使用Flask创建AP ... [详细]
  • 【论文】ICLR 2020 九篇满分论文!!!
    点击上方,选择星标或置顶,每天给你送干货!阅读大概需要11分钟跟随小博主,每天进步一丢丢来自:深度学习技术前沿 ... [详细]
  • QuestionThereareatotalofncoursesyouhavetotake,labeledfrom0ton-1.Somecoursesmayhaveprerequi ... [详细]
author-avatar
伟哥
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有