欠拟合

含义

数据很复杂、模型太简单,拟合不了

模拟欠拟合

加载前面xor逻辑回归数据集,使用单一神经元模型

1、数据集-见多层神经网络一节

2、创建模型

  1. import * as tf from '@tensorflow/tfjs';
  2. import * as tfvis from '@tensorflow/tfjs-vis';
  3. import { getData } from '../xor/data';
  4. window.onload = async () => {
  5. const data = getData(200);
  6. tfvis.render.scatterplot(
  7. { name: '训练数据' },
  8. {
  9. values: [
  10. data.filter(p => p.label === 1),
  11. data.filter(p => p.label === 0),
  12. ]
  13. }
  14. )
  15. const model = tf.sequential()
  16. model.add(tf.layers.dense({
  17. units: 1,
  18. activation: 'sigmoid',
  19. inputShape: [2]
  20. }))
  21. model.compile({
  22. loss: tf.losses.logLoss,
  23. optimizer: tf.train.adam(0.1)
  24. })
  25. const inputs = tf.tensor(data.map(p => [p.x, p.y]));
  26. const labels = tf.tensor(data.map(p => p.label));
  27. await model.fit(inputs, labels, {
  28. validationSplit: 0.2,
  29. epochs: 200,
  30. callbacks: tfvis.show.fitCallbacks(
  31. { name: '训练效果'},
  32. ['loss', 'val_loss'],
  33. { callbacks: ['onEpochEnd'] }
  34. )
  35. })
  36. };

3、效果

WechatIMG457.jpeg

4、分析

可以看到,验证集训练损失一直没有下降,这是明显的欠拟合现象
可以通过添加神经元、添加层等增加模型复杂度的方式解决

过拟合

含义

数据集比较简单、模型太过复杂;数据集太少

模拟过拟合

1、加载带有噪音的二分类数据集(训练集和验证集)

2、使用多层神经网络

3、效果

WechatIMG459.jpeg

4、分析

训练集损失越来越小,但测试集损失越来越大,这是过拟合现象
过拟合应对法:早停法、权重衰减、丢弃法

权重衰减
设置l2正则化

  1. model.add(tf.layers.dense({
  2. units: 10,
  3. inputShape: [2],
  4. activation: "tanh",
  5. kernelRegularizer: tf.regularizers.l2({ l2 : 1 }) // 权重衰减法:设置l2正则化
  6. }));

丢弃法
添加丢弃层随机丢弃,使模型变得简单

  1. model.add(tf.layers.dense({
  2. units: 10,
  3. inputShape: [2],
  4. activation: "tanh",
  5. // kernelRegularizer: tf.regularizers.l2({ l2 : 1 }) // 权重衰减法:设置l2正则化
  6. }));
  7. model.add(tf.layers.dropout({rate: 0.9})) // 丢弃法,随机设置丢弃率,10个中随机选9个丢弃