含义
把大数据量级特征转化到较小的数据量级下,通常是[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
}
参考资料:
归一化