在浏览器中进行深度学习:TensorFlow.js (二)第一个模型,线性回归
2018-04-11 11:27
721 查看
笔者在上一篇文章中介绍了TensorFlow.js中的基本概念,以及机器学习的数学基础,线性代数的基本知识。在这一遍文章里,我们来看一看如何利用TensorFlow.js来构建数学模型,以及进行学习的基本过程。
学习的过程基本如下:
准备训练数据
构建一个模型
利用训练数据和模型,进行迭代的学习
模型训练完毕,用这个模型对新的数据进行预测(这里我们先略过对模型的验证部分)
好了,我们以最简单的线性回归为例子,看看这个过程。
如上图所示,我在二维坐标系中生成了7个点,让它们在我假想的某条直线附近。我以这几个点作为我的训练数据。
训练数据的初始化代码如下,这里tx是所有点数据的x坐标,ty是所有点数据的坐标。
所谓的模型,也就是一个函数f,对应于某个输入数据,计算出某些输出数据。模型可以复杂,可以简单。简单的模型不一定不好,负责的模型也不一定好。
我们用线性模型举例,数学上就是假定 Y = wX + b
在这个模型中,有两个参数需要确定,w和b。
模型既然是个函数,那么它的代码也就很容易理解了:
当然你也可以这样写:
一个损失函数(loss function),损失函数定义了模型是不是足够好,通常loss越小越好。
一个优化器 (optimizer),优化器通过某种算法来决定如何改变参数的值,使得损失函数最小化。
迭代循环, 通过循环 -> 调用优化器,得到新的参数,计算损失, 最终当损失足够小时,可以认为训练结束了。
训练代码如下:
初始化参数,这里使用随机数来作为参数的初始值。(注意,初始参数并不总是随机选择的。)
初始化学习参数,
numIterations是迭代的次数,一般次数越多,模型的拟合就越好,但是就需要花费越多的计算
learningRate是学习率,这个值越大,学的速度就越快,但是也会更加容易错过极值点。
选择一个优化器,这里我选择了adam。TensorFlow.js提供了多种优化器,例如sgd,momentum等等,大家可以根据自己的需要来选择。
对于损失函数,我们采用的是均方差
或者可以写作:
然后就是训练的过程啦:
在训练过程中,我们调用tensor的print()方法打印出损失的值,看看训练过程是不是收敛。当选择的模型,参数,优化器不合适的时候,有可能训练过程并不收敛。
训练的结果我们就等到了w和b的值。也就是确定了直线的斜率和截距。
大家可以尝试我的演示代码
我们可以看到学习过程中是如何慢慢收敛到最后的结果的直线。
学习的过程基本如下:
准备训练数据
构建一个模型
利用训练数据和模型,进行迭代的学习
模型训练完毕,用这个模型对新的数据进行预测(这里我们先略过对模型的验证部分)
好了,我们以最简单的线性回归为例子,看看这个过程。
准备数据
如上图所示,我在二维坐标系中生成了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);
对于损失函数,我们采用的是均方差
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 < numIterations; iter++) { optimizer.minimize(() => { const loss_var = loss(f(train_x), train_y); loss_var.print(); return loss_var; }) }
在训练过程中,我们调用tensor的print()方法打印出损失的值,看看训练过程是不是收敛。当选择的模型,参数,优化器不合适的时候,有可能训练过程并不收敛。
训练的结果我们就等到了w和b的值。也就是确定了直线的斜率和截距。
大家可以尝试我的演示代码
我们可以看到学习过程中是如何慢慢收敛到最后的结果的直线。
总结
本文描述了一个使用tensoflow.js来进行最简单的线性回归模型的学习的过程。希望大家可以通过这个简单的例子了解机器学习的基本思路。参考
在浏览器中进行深度学习:TensorFlow.js (一)基本概念相关文章推荐
- 在浏览器中进行深度学习:TensorFlow.js (四)用基本模型对MNIST数据进行识别
- 在浏览器中进行深度学习:TensorFlow.js (三)更多的基本模型
- 在浏览器中进行深度学习:TensorFlow.js (六)构建一个卷积网络 Convolutional Network
- 在浏览器中进行深度学习:TensorFlow.js (七)递归神经网络 (RNN)
- 在浏览器中进行深度学习:TensorFlow.js (五)构建一个神经网络
- TensorFlow Saver方法 深度学习 输出模型
- Keras TensorFlow教程:如何从零开发一个复杂深度学习模型
- 使用亚马逊AWS云服务器进行深度学习——免环境配置/GPU支持/Keras/TensorFlow/OpenCV
- Keras TensorFlow教程:如何从零开发一个复杂深度学习模型
- R已经可以进行深度学习!!!tensorflow&keras
- 深度学习模型的量化方法(论文学习 & tensorflow lite量化方法)
- Keras TensorFlow教程:如何从零开发一个复杂深度学习模型
- 代码解析深度学习系统编程模型:TensorFlow vs. CNTK
- 代码解析深度学习系统编程模型:TensorFlow vs. CNTK
- Deeplearning4j 实战(8) : Keras为媒介导入Tensorflow/Theano等其他深度学习库的模型
- Deep Learning-TensorFlow TFLearn 快速搭建深度学习模型Alxnet
- 【深度学习笔记】(三)Tensorflow on Android
- 【深度学习】Ubuntu 常用软件安装:Tensorflow + TeamViewer + Caffe + ... + Matlab
- [note] deep learning tensorflow lecture 1 notes 深度学习笔记 (1)
- 吴恩达 深度学习 编程作业(2-3)- TensorFlow Tutorial