目录
- Tensorflow.js是什么?
- Tensorflow.js具体功能有?
- 安装Tensorflow.js
- 什么是Tensor?
- 线性回归
- 定义模型结构
- 损失函数:均方误差(MSE)和优化器:随机梯度下降(SGD)
- 训练模型并可视化训练过程
- 进行预测
1. Tensorflow.js是什么?
- 一个用JavaScript实现的机器学习库
- 使我们可以直接在浏览器和Node.js中使用机器学习
2. Tensorflow.js具体功能有?
- 运行现有模型 (使用算法工程师已经训练好的模型)
- 重新训练现有模型
- 使用JavaScript从零开发机器学习模型
3. 安装使用Tensorflow.js
-
使用
<script>
标签,但是没有智能提示<script src="https://cdn.jsdelivr.net/npm/@tensorflow/[email protected]/dist/tf.min.js"></script>
-
使用
npm
安装,安装纯JavaScript版本,这是性能方面最慢的选项。npm install @tensorflow/tfjs
-
安装带有原生
C++
绑定的TensorFlow.js
npm install @tensorflow/tfjs-node
安装这个还需要先安装:
npm i node-gyp
,驱动C++需要这个包,但是安装这个包,还需要在电脑上安装vs2015/vs2017,python2.7等环境,很麻烦;
还可以如下安装,过程中还是可能会出现很多问题,坑!还需要翻个墙_(¦3」∠)_
npm i node-gyp windows-build-tools -g
-
(仅限Linux)如果您的系统具有支持CUDA的NVIDIA®GPU,请使用GPU包以获得更高的性能
npm install @tensorflow/tfjs-node-gpu
4. 什么是Tensor?
- Tensor 又名:张量
- 张量是向量和矩阵向更高维度的推广
- 相当于多维数组
代码演示:
import * as tf from '@tensorflow/tfjs';
// 0维数组
const t0 = tf.tensor(1);
t0.print();
console.log(t0);
// 1维数组
const t1 = tf.tensor([1,2]);
t1.print();
console.log(t1);
// 2维数组
const t2 = tf.tensor([[1],[3]]);
t2.print();
console.log(t2);
Tensor和机器学习的关系
- 神经网络的每一层要存储N维数据
- 需要N层的For循环运算
- Tensor作为高维数据结构完美解决以上问题
代码示例:
import * as tf from '@tensorflow/tfjs';
// 传统的for循环实现
const input = [1,2,3,4]; // 输入
const w = [[1,2,4,1],[3,1,1,2],[2,3,2,4],[1,3,3,4]]; // 神经元数组,里面是相应的权重
const output = [0,0,0,0];
for(let i=0; i < w.length; i++){
for(let j = 0; j<input.length; j++){
output[i] += input[j]*w[i][j];
}
}
console.log(output);
// 使用Tensor来实现
tf.tensor(w).dot(tf.tensor(input)).print();
5. 线性回归
什么是线性回归?
利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法
例如:身高体重预测
安装可视化的一个库:
npm i @tensorflow/tfjs-vis -S
简易代码演示:
import * as tfvis from '@tensorflow/tfjs-vis';
window.onload = () =>{
const xs = [1,2,3,4];
const ys = [2,4,6,8];
tfvis.render.scatterplot(
{ name:'线性回归训练集'},
{ values:xs.map((x,i) => ({x,y:ys[i]}))},
{xAxisDomain: [0,5], yAxisDomain: [0,9]}, // 设置x轴y轴的范围
);
}
效果图:
6. 定义模型结构
单层单个神经元组成的神经网络
线性回归
import * as tf from '@tensorflow/tfjs';
import * as tfvis from '@tensorflow/tfjs-vis';
window.onload = () =>{
const xs = [1,2,3,4];
const ys = [2,4,6,8];
tfvis.render.scatterplot(
{ name:'线性回归训练集'},
{ values:xs.map((x,i) => ({x,y:ys[i]}))},
{xAxisDomain: [0,5], yAxisDomain: [0,9]}, // 设置x轴y轴的范围
);
const model = tf.sequential(); // 初始化一个模型
model.add(tf.layers.dense({units:1,inputShape:[1]})); // 给模型添加层,全连接层;units:神经元的个数,inputShape:输入形状
}
7. 损失函数:均方误差(MSE)和优化器:随机梯度下降(SGD)
推荐阅读:https://developers.google.cn/machine-learning/crash-course/descending-into-ml/training-and-loss?hl=zh-cn&authuser=0
这个是谷歌发布的机器学习教程;
示例代码:
model.compile({loss: tf.losses.meanSquaredError, optimizer:tf.train.sgd(0.1)}); // 设置loss:损失函数,均方误差; 设置优化器:optimizer
8. 训练模型并可视化训练过程
- 将训练数据转为
Tensor
- 训练模型
- 使用
tfvis
可视化训练过程
代码演示:
import * as tf from '@tensorflow/tfjs';
import * as tfvis from '@tensorflow/tfjs-vis';
window.onload = async () =>{
const xs = [1,2,3,4];
const ys = [2,4,6,8];
tfvis.render.scatterplot(
{ name:'线性回归训练集'},
{ values:xs.map((x,i) => ({x,y:ys[i]}))},
{xAxisDomain: [0,5], yAxisDomain: [0,9]}, // 设置x轴y轴的范围
);
const model = tf.sequential(); // 初始化一个模型
model.add(tf.layers.dense({units:1,inputShape:[1]})); // 给模型添加层,全连接层;units:神经元的个数,inputShape:输入形状
model.compile({loss: tf.losses.meanSquaredError, optimizer:tf.train.sgd(0.1)}); // 设置loss:损失函数,均方误差; 设置优化器:optimizer
// 把数据转换为Tensor
const inputs = tf.tensor(xs);
const labels = tf.tensor(ys);
await model.fit(inputs,labels, {
batchSzie:1, // 每次模型要学习的样本设置为:1
epochs: 100, // 迭代整个训练的次数
callbacks: tfvis.show.fitCallbacks(
{name:'训练过程'},
['loss'], // 度量单位,这里看损失参数
)
});
}
9. 进行预测
- 将待预测数据转为Tensor
- 使用训练好的模型进行预测
- 将输出的Tensor转为普通数据并显示
综合以上,全部代码如下:
import * as tf from '@tensorflow/tfjs';
import * as tfvis from '@tensorflow/tfjs-vis';
window.onload = async () =>{
const xs = [1,2,3,4];
const ys = [2,4,6,8];
tfvis.render.scatterplot(
{ name:'线性回归训练集'},
{ values:xs.map((x,i) => ({x,y:ys[i]}))},
{xAxisDomain: [0,5], yAxisDomain: [0,9]}, // 设置x轴y轴的范围
);
const model = tf.sequential(); // 初始化一个模型
model.add(tf.layers.dense({units:1,inputShape:[1]})); // 给模型添加层,全连接层;units:神经元的个数,inputShape:输入形状
model.compile({loss: tf.losses.meanSquaredError, optimizer:tf.train.sgd(0.1)}); // 设置loss:损失函数,均方误差; 设置优化器:optimizer
// 把数据转换为Tensor
const inputs = tf.tensor(xs);
const labels = tf.tensor(ys);
await model.fit(inputs,labels, {
batchSzie:1, // 每次模型要学习的样本设置为:1
epochs: 100, // 迭代整个训练的次数
callbacks: tfvis.show.fitCallbacks(
{name:'训练过程'},
['loss'], // 度量单位,这里看损失参数
)
});
const output = model.predict(tf.tensor([5])); // 预测数字5
console.log(output.dataSync()[0]); // 输出:9.982701301574707
}