查看原文
其他

JavaScript 深度学习 - 2.基础概念

孟德森 淘系前端团队 2021-01-29

为了更好的阅读体验,欢迎语雀搜索 【JavaScript 深度学习】 关注

NO.1

Tensor - 张量

从名字也可以看出,Tensor 是 TensorFlow 中最基础的数据结构,Tensor 和 一维或多维数组非常相似,在 TensorFlow.js 中,我们也可以直接将数组转换为Tensor。一个 Tensor 包含三个部分

  • values: 具体的值 数字或者数组

  • shape: 数值的维度,如果不配置,会基于 values 初始化

  • dtype: 数值的数据类型,如 'float32'|'int32'|'bool' 等类型

Scalar - 标量 ( 0D 张量)


仅包含一个数字的张量叫做标量(Scalar)

scalar = tf.tensor(3.14);
// scalar 推荐使用更有语义化的 tf.scalar 来定义
tf.scalar(3.14).print() //

Vector - 向量 ( 1D 张量)


一维数组的数值成为向量(Vector)

vector = tf.tensor(<a href="https://www.kaggle.com/c/titanic">1, 2, 3], [3])
// vector 推荐使用更有语义化的 tf.tensor1d 来定义
vector = tf.tensor1d([1, 2, 3]).print();

Tensor 的常用操作


类似的,TensorFlow.js 还提供了 tf.tensor2d、tf.tensor3d、tf.tensor4d、tf.tensor5d、tf.tensor6d 等语义化的方法,也推荐大家直接使用。

const a = tf.tensor([[1, 2], [3, 4]], [2, 2], 'int32');
// 获取 shape
console.log('shape:', a.shape); // shape: 2,2
// 获取 dtype
console.log('dtype', a.dtype); // dtype int32
// 修改 shape
a.reshape([4]).print() // Tensor [1, 2, 3, 4]

NO.2

现实数据的Tensor 转换 - 数据预处理

Tensor 2d的示例


我们以 Kaggle 经典入门数据 - [泰坦尼克号生存预测(https://www.kaggle.com/c/titanic) 为例来介绍一下常见数据表达方式,数据示例

VariableDefinitionKey
survival是否存活0 = No, 1 = Yes
pclass船票等级1 = 1st, 2 = 2nd, 3 = 3rd
sex性别male / female 
Age年龄
sibsp船上兄弟姐妹/配偶的个数
parch船上父母/孩子的个数
ticket船票号码
fare船票加个
cabin舱位号码
embarked启航港的编号C= Cherbourg, Q = Queenstown, S = Southampton

特征二元化

比如上面的性别,原始数据使用 male 或者 female 来表示,我们可以将其转换成 0 和 1 来表示。

整数编码

比如启航港的编号,我们可以使用1、2、3 分别表示 C、Q、S。

数据补齐

如上图数据,我们可以看到 Age 字段是存在缺失的,常见有以下几种方式来补齐数据

  • 平均值:这个很好理解,如果数值分布没有明显规律,可以使用平均值来补齐数据

  • 分类平均值:如果数据不同分类下的平均值有较大差异,可以使用同类的平均值来进行补齐,比如上述数据 通过 parch、slibsp 可以做一些分类,来进行补齐

  • 模型预测: 可以基于已有数据,通过模型求出更准确的补齐

特征离散化

将连续性的值,比如年龄进行离散,更有利于计算和特征的提取,比如我们可以将年龄通过 5 来进行划分,0-5 使用 1 来表达,依次类推表达其他数值。

其他 Tensor 的数据示例


  • Tensor 3D 常见于时间序列的数据,比如某个时间段的股票价格数据,需要展示 时间间隔、价格、样本

  • Tensor 4D 常见于图片数据,需要展示 图片宽度、高度、颜色通道(RGB)、样本

  • Tensor 5D 常见于视频数据,需要展示 视频宽度、高度、颜色通道、时间帧、样本

NO.3

神经网络模型

一个数据模型可以分为 Input(输入数据)、Layer(模型层)、loss(损失函数)、optimizer(优化器)、Output(预测输出值)组成。

Layer - 模型层


你可以通过 TensorFlow Playground(https://playground.tensorflow.org/) 可视化的搭建自己的神经网络以及训练过程 

  • 大多数的数据,我们可以使用全连接层来进行处理,对应 TensorFlow 中的 Dense Layer

  • 上一章我们使用的图片数据,可以使用卷积层来优化处理,对应 TensorFlow 中的 Convolution Layer

  • 有顺序的数据,比如文本类,可以使用循环层,对应 TensorFlow 中的 LSTM Layer

损失函数


损失函数用来计算预测值与真实值的差异,模型训练的目的也就是将 loss(损失)最小化的过程。不同的数据类型,需要选择恰当的损失函数,比如对应回归问题,我们可以选择使用均方误差(mean-squared error),对于二分类问题,可以使用二元交叉熵(binary crossentropy)来计算

优化器


优化器主要基于损失函数的计算对神经网络进行调整,常见的有梯度下降法

实例


const model = tf.sequential();
model.add(tf.layers.dense({units: 250, inputShape: [8]}));
model.add(tf.layers.dense({units: 175}));
model.add(tf.layers.dense({units: 150}));
model.add(tf.layers.dense({units: 10, activation: 'softmax'}));

model.compile({
optimizer: tf.train.adam(),
loss: 'sparseCategoricalCrossentropy',
metrics: ['accuracy']
});

✿   拓展阅读

官宣!前端热爱,技术无界,第十五届 D2 前端技术论坛,我们云端相聚!

2020年你不应该错过的CSS新特性

ECMAScript 双月报告:TC39 9月会议提案进度汇总


✿   文末福利

回复 “618” 有福利

欢迎关注东半球最大的前端团队


喜欢就点这里


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存