含义
把大数据量级特征转化到较小的数据量级下,通常是[0,1]或[-1,1]
例如身高体重、房价预测,将数据压缩到[0,1]再训练
原因
- 绝大多数tensorflow.js模型都不是给特别大的数设计的
 - 将不同数量级特征转化到同一数量级下,防止某个特征影响多大
 
归一化的方式
最小最大归一化
举例
import * as tf from '@tensorflow/tfjs'import * as tfvis from '@tensorflow/tfjs-vis'// 归一化// 该方法实现对原始数据的等比例缩放,其中Xnorm为归一化后的数据,X为原始数据,Xmax、Xmin分别为原始数据集的最大值和最小值。// 举例身高体重window.onload = async () => {const heights = [150,160,170]const weights = [40,50,60]// 步骤一:可视化 散点图tfvis.render.scatterplot({name: '身高体重训练数据'}, {values: heights.map((x,i)=> ({x, y: weights[i]})) // [{x: 150, y: 40}, {x: 160, y: 50}]}, {xAxisDomain: [140, 180],yAxisDomain: [30,70]})// 步骤二:// 归一化: 最大最小归一化// 公式: (x - 最小值)/(最大值-最小值)const inputs = tf.tensor(heights).sub(150).div(20)const labels = tf.tensor(weights).sub(40).div(20)// 步骤三:训练 && 预测// 定义模型const model = tf.sequential()// 模型添加层model.add(tf.layers.dense({units: 1,inputShape: [1]}))// 定义解析model.compile({loss: tf.losses.meanSquaredError,optimizer: tf.train.sgd(0.1)})// 开始训练await model.fit(inputs, labels, {batchSize : 3,epochs: 100,callbacks: tfvis.show.fitCallbacks({name: '训练过程'}, ['loss'])})// 预测const output = model.predict(tf.tensor([180]).sub(150).div(20)) // 因为上面训练的数据都是归一化,所以也需要将输入数据归一化alert(`${output.mul(20).add(40).dataSync()[0]}`) // 结果也需要反归一化// 结果: 69.4}
参考资料:
归一化

