欠拟合
含义
模拟欠拟合
1、数据集-见多层神经网络一节
2、创建模型
import * as tf from '@tensorflow/tfjs';
import * as tfvis from '@tensorflow/tfjs-vis';
import { getData } from '../xor/data';
window.onload = async () => {
const data = getData(200);
tfvis.render.scatterplot(
{ name: '训练数据' },
{
values: [
data.filter(p => p.label === 1),
data.filter(p => p.label === 0),
]
}
)
const model = tf.sequential()
model.add(tf.layers.dense({
units: 1,
activation: 'sigmoid',
inputShape: [2]
}))
model.compile({
loss: tf.losses.logLoss,
optimizer: tf.train.adam(0.1)
})
const inputs = tf.tensor(data.map(p => [p.x, p.y]));
const labels = tf.tensor(data.map(p => p.label));
await model.fit(inputs, labels, {
validationSplit: 0.2,
epochs: 200,
callbacks: tfvis.show.fitCallbacks(
{ name: '训练效果'},
['loss', 'val_loss'],
{ callbacks: ['onEpochEnd'] }
)
})
};
3、效果
4、分析
可以看到,验证集训练损失一直没有下降,这是明显的欠拟合现象
可以通过添加神经元、添加层等增加模型复杂度的方式解决
过拟合
含义
模拟过拟合
1、加载带有噪音的二分类数据集(训练集和验证集)
2、使用多层神经网络
3、效果
4、分析
训练集损失越来越小,但测试集损失越来越大,这是过拟合现象
过拟合应对法:早停法、权重衰减、丢弃法
权重衰减
设置l2正则化
model.add(tf.layers.dense({
units: 10,
inputShape: [2],
activation: "tanh",
kernelRegularizer: tf.regularizers.l2({ l2 : 1 }) // 权重衰减法:设置l2正则化
}));
丢弃法
添加丢弃层随机丢弃,使模型变得简单
model.add(tf.layers.dense({
units: 10,
inputShape: [2],
activation: "tanh",
// kernelRegularizer: tf.regularizers.l2({ l2 : 1 }) // 权重衰减法:设置l2正则化
}));
model.add(tf.layers.dropout({rate: 0.9})) // 丢弃法,随机设置丢弃率,10个中随机选9个丢弃