# 基础知识
import * as tf from '@tensorflow/tfjs';
const t0 = tf.tensor(1); // 0纬数组
t0.print(); // 1
console.log(t0);
/*
{
dataId: {},
dtype: 'float32',
id: 0,
isDisposed: false,
isDisposedInternal: false,
kept: false,
rank: 0,
rankType: '0', // 纬度 0表示0纬数组
shape: [],
size: 1, // 有多少个数值
strides: [],
}
*/
const t1 = tf.tensor([1, 2]); // 一位数组
t1.print();
console.log(t1);
/*
{
rank: 1,
rankType: '1',
shape: [2], // 表示最外层数组的值的长度为2
size: 2,
}
*/
const t2 = tf.tensor([
// 二维数组
[1, 2],
[3, 4],
[5, 6],
]);
t2.print();
console.log(t2);
/*
{
rank: 2,
rankType: "2",
shape: [3, 2], // 表示最外层数组长度为3,第二层里面长度为2
size: 6,
strides: [2],
}
*/
const t3 = tf.tensor([[[1], [3], [2]]]); // 三位数组
t3.print();
console.log(t3);
/*
{
rank: 3,
rankType: "3",
shape: [1, 3, 1], // 表示最外层数组长度为3,第二层里面长度为2
size: 3,
strides: [3, 1],
}
*/
PS:多维数组每个数组的长度必须一致,比如不能 [ [1, 2], [3, 4, 5] ]
# 模型
# sequential 连续模型
const model = tf.sequential(); // 绝大多数问题都用这个
# 层
# 全连接层
/*给模型添加层*/
model.add(
tf.layers.dense({
units: 1, // 神经元个数
inputShape: [1], // 输入的形状-最小一纬(一纬数据,长度为一(只有一个特征))
})
);
tf.layers.dense 给模型添加“全连接层” 全连接层适用于输入*权重+偏差的计算 This layer implements the operation: output = activation(dot(input, kernel) + bias) tf.layers.dense
# 激活函数(activation)
# sigmoid
作用为将值压缩在 0-1 之间,输出 0-1 之间的概率只能选择 sigmoid
# relu
添加一些非线性的变化,从而有一些非线性的拟合能力
# softmax
把输出压缩为和为 1 的数值
# 损失函数
# 均方误差 (MSE)
均方误差 (MSE) 指的是每个样本的平均平方损失。主要解决线性问题的损失。要计算 MSE,请求出各个样本的所有平方损失之和,然后除以样本数量。 详见均方误差
# 对数损失(logLoss)
对数损失(logLoss)次方的逆运算(-log),适用于逻辑回归,预测概率模型的损失函数,有效解决获取解决 0-1 之间的概率问题,可取值为接近无穷大或者无穷小
# 交叉熵损失函数
是对数损失函数的多分类版本,都是用来测量分类模型的性能,输出的是 0-1 之间的概率,曲线和对数损失一致。其分类的类别为 2 的时候就是对数损失函数。
# 优化器
优化器是什么?神经网络就是通过优化器来逐步改进自己的。 初始化的时候神经网络先随便瞎蒙了一个权重,然后我们通过损失函数去测量一下损失有多大,然后就靠优化器来找到改进的方向和幅度,这两个词组成的概念就叫做梯度
优化器更多文档参照谷歌机器学习优化器文档
PS:文档中的降低损失就相当于优化器
# 随即梯度下降(SGD)
tf.train.sgd(0.1); // 学习率(超参数)
参考梯度下降法
参考随即梯度下降
# adam
在你不知道改选什么优化器的时候就选它,它可以自动调整学习速率
参考adam
# 异步训练模型
await model.fit(inputs, labels, {
batchSize: 10, // 每次样本需要学习的样本数据量(超参数)
epochs: 200, // 训练轮数(超参数) 假设样本有100个,那么batchSize设为10就是说迭代10次就是一个epochs
callbacks: tfvis.show.fitCallbacks(
// 可视化模拟训练过程
{ name: '训练过程' },
['loss'] // 制定度量单位(制作损失曲线)
),
});
参考fit
# 可视化训练过程
# 归一化
# 什么是归一化
把大量数级特征转化到较小的数量级下,通常是[0,1]或[-1,1]
例如:身高体重预测、房价预测
# 为何要进行归一化
绝大多数 tensorflow.js 模型都不是给特别大的数设计的
将不同数量级的特征转化到同一数量级,防止某个特征影响过大
# 多层神经网络
单层神经网络,如一层一个神经元的神经网络可以解决线性回归和逻辑回归问题,但是简单的神经网络也只能解决很简单的问题。 一旦问题变得复杂就需要增加神经网络的复杂度了--多层神经网络+激活函数解决。(多层神经网络+激活函数理论上可以拟合任何复杂的非线性问题)
# 欠拟合
简单来说就是数据很复杂,但是模型太简单了,拟合不了这个数据。比如线性模型去计算非线性的数据就是欠拟合
训练时间不够(epochs)时候也有可能出现欠拟合
# 过拟合
模型过分复杂,导致数据拟合过头,反而表现得不好,比如把一些杂质都计算进去了。
过拟合的应对法:早停法、权重衰减、丢弃法