# 基础知识

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 之间的概率问题,可取值为接近无穷大或者无穷小

对数损失函数文献

对数损失 API

# 交叉熵损失函数

是对数损失函数的多分类版本,都是用来测量分类模型的性能,输出的是 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

# 可视化训练过程

参考fitCallbacks

# 归一化

# 什么是归一化

把大量数级特征转化到较小的数量级下,通常是[0,1]或[-1,1]

例如:身高体重预测、房价预测

# 为何要进行归一化

  • 绝大多数 tensorflow.js 模型都不是给特别大的数设计的

  • 将不同数量级的特征转化到同一数量级,防止某个特征影响过大

# 多层神经网络

单层神经网络,如一层一个神经元的神经网络可以解决线性回归和逻辑回归问题,但是简单的神经网络也只能解决很简单的问题。 一旦问题变得复杂就需要增加神经网络的复杂度了--多层神经网络+激活函数解决。(多层神经网络+激活函数理论上可以拟合任何复杂的非线性问题)

# 欠拟合

简单来说就是数据很复杂,但是模型太简单了,拟合不了这个数据。比如线性模型去计算非线性的数据就是欠拟合

训练时间不够(epochs)时候也有可能出现欠拟合

# 过拟合

模型过分复杂,导致数据拟合过头,反而表现得不好,比如把一些杂质都计算进去了。

过拟合的应对法:早停法、权重衰减、丢弃法