含义

把大数据量级特征转化到较小的数据量级下,通常是[0,1]或[-1,1]
例如身高体重、房价预测,将数据压缩到[0,1]再训练

原因

  • 绝大多数tensorflow.js模型都不是给特别大的数设计的
  • 将不同数量级特征转化到同一数量级下,防止某个特征影响多大

归一化的方式

最常用的是最小最大归一化和标准归一化


最小最大归一化

使结果落到[0,1]区间,转换函数如下:

1441504-20190911233251497-1250637113.png

举例

  1. import * as tf from '@tensorflow/tfjs'
  2. import * as tfvis from '@tensorflow/tfjs-vis'
  3. // 归一化
  4. // 该方法实现对原始数据的等比例缩放,其中Xnorm为归一化后的数据,X为原始数据,Xmax、Xmin分别为原始数据集的最大值和最小值。
  5. // 举例身高体重
  6. window.onload = async () => {
  7. const heights = [150,160,170]
  8. const weights = [40,50,60]
  9. // 步骤一:可视化 散点图
  10. tfvis.render.scatterplot(
  11. {
  12. name: '身高体重训练数据'
  13. }, {
  14. values: heights.map((x,i)=> ({x, y: weights[i]})) // [{x: 150, y: 40}, {x: 160, y: 50}]
  15. }, {
  16. xAxisDomain: [140, 180],
  17. yAxisDomain: [30,70]
  18. })
  19. // 步骤二:
  20. // 归一化: 最大最小归一化
  21. // 公式: (x - 最小值)/(最大值-最小值)
  22. const inputs = tf.tensor(heights).sub(150).div(20)
  23. const labels = tf.tensor(weights).sub(40).div(20)
  24. // 步骤三:训练 && 预测
  25. // 定义模型
  26. const model = tf.sequential()
  27. // 模型添加层
  28. model.add(tf.layers.dense({
  29. units: 1,
  30. inputShape: [1]
  31. }))
  32. // 定义解析
  33. model.compile({
  34. loss: tf.losses.meanSquaredError,
  35. optimizer: tf.train.sgd(0.1)
  36. })
  37. // 开始训练
  38. await model.fit(inputs, labels, {
  39. batchSize : 3,
  40. epochs: 100,
  41. callbacks: tfvis.show.fitCallbacks({
  42. name: '训练过程'
  43. }, ['loss'])
  44. })
  45. // 预测
  46. const output = model.predict(tf.tensor([180]).sub(150).div(20)) // 因为上面训练的数据都是归一化,所以也需要将输入数据归一化
  47. alert(`${output.mul(20).add(40).dataSync()[0]}`) // 结果也需要反归一化
  48. // 结果: 69.4
  49. }

参考资料:
归一化