当我们使用的模型复杂度远远低于你真实数据的复杂程度,这时我们叫做欠拟合(under fitting)。出现的情况及时Acc上升一定程度之后不再上升,Loss下降到一定程度之后不再下降。在train和test的时候都会表现的很差。解决方法就是增加模型的复杂度
使用的模型的复杂度远远大于真实数据的复杂程度。由下图我们可以看出过分的把噪声包含进来了,逼近与每一个点。
over-fitting出现的时候,会发现在train的时候表现的特别好而test的时候会表现的很差。用专业的词叫做Generalization Performace也就是泛化能力变差。
那么什么情况会出现这种over fitting?
1、数据集不是很多的时候。
2、样本噪音干扰过大
3、参数太多,模型复杂度过高
那么怎么检测over fitting和怎么解决over fitting?
1、保留验证数据集,对训练成果进行验证;如果发现它在train中loss和acc状态表现特别好,而在test表现很差这就是表示可能出现了over fitting 。
(x, y), (x_val, y_val) = datasets.mnist.load_data()
db = tf.data.Dataset.from_tensor_slices((x, y))
db = db.map(preprocess).shuffle(60000).batch(batchsz).repeat(10)
ds_val = tf.data.Dataset.from_tensor_slices((x_val, y_val))
ds_val = ds_val.map(preprocess).batch(batchsz, drop_remainder=True)
有的时候也会分成三个部分:train , val , test
(x, y), (x_test, y_vtest) = datasets.mnist.load_data()
print('datasets:', x.shape, y.shape, x.min(), x.max())
x_train,x_val = tf.split(x,num_or_size_splits=[50000,10000])
y_train,y_val = tf.split(y,num_or_size_splits=[50000,10000])
db_train = tf.data.Dataset.from_tensor_slices((x_train, y_train))
db_train = db.map(preprocess).shuffle(50000).batch(batchsz).repeat(10)
ds_val = tf.data.Dataset.from_tensor_slices((x_val, y_val))
ds_val = ds_val.map(preprocess).batch(batchsz, drop_remainder=True)
ds_test = tf.data.Dataset.from_tensor_slices((x_test, y_test))
ds_test = ds_val.map(preprocess).batch(batchsz, drop_remainder=True)
2、选取合适的停止训练标准,使对机器的训练在合适的程度。
在那个数据做fit,没多少epoch做评测
network.fit(train_db,
epochs=15,
validation_data=test_db,
validation_freq=1)
3、获取额外数据进行交叉验证(如果数据没那么多可以灵活的进行K-fold cross validation);
for epoch in range(500):
idx = tf.range(60000)
idx = tf.random.shuffle(idx)
x_train,y_train = tf.gather(x,idx[:50000]),tf.gather(y,idx[:50000])
x_val, y_val = tf.gather(x, idx[-10000:]), tf.gather(y, idx[-10000:])
db_train = tf.data.Dataset.from_tensor_slices((x_train, y_train))
db_train = db.map(preprocess).shuffle(50000).batch(batchsz).repeat(10)
ds_val = tf.data.Dataset.from_tensor_slices((x_val, y_val))
ds_val = ds_val.map(preprocess).batch(batchsz, drop_remainder=True)
4、regularzation正则化,即在进行目标函数或代价函数优化时,在目标函数或代价函数后面加上一个正则项,一般有L1正则与L2正则等。
正则项一般加入参数的范数,1/2_norm,
l2_model = keras.models.Sequential([
keras.layers.Dense(16,kernel_regularizer = keras.regularizers.l2(0.001),
activation = tf.nn.relu,input_shape=(NUM_WORDS,)),
keras.layers.Dense(16, kernel_regularizer=keras.regularizers.l2(0.001),
activation=tf.nn.relu, input_shape=(NUM_WORDS,)),
keras.layers.Dense(1,activation=tf.nn.sigmoid)
])
layer.Dropout(0.5)
因为drpout的train和test的是方式不是一样的所以,在前向传播的时候就要区分出是train还是test
for step,(x,y) in enumerate(db):
with tf.GradientTape() as tape:
x=tf.reshape(x,(-1,28*28))
out=network(x,training=True)
out=newwork(x,trainng=False)