Tensorflow学习九---过拟合欠拟合

Tensorflow学习九—过拟合欠拟合

欠拟合

当我们使用的模型复杂度远远低于你真实数据的复杂程度,这时我们叫做欠拟合(under fitting)。出现的情况及时Acc上升一定程度之后不再上升,Loss下降到一定程度之后不再下降。在train和test的时候都会表现的很差。解决方法就是增加模型的复杂度
Tensorflow学习九---过拟合欠拟合_第1张图片

过拟合

使用的模型的复杂度远远大于真实数据的复杂程度。由下图我们可以看出过分的把噪声包含进来了,逼近与每一个点。
Tensorflow学习九---过拟合欠拟合_第2张图片

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)

Tensorflow学习九---过拟合欠拟合_第3张图片

3、获取额外数据进行交叉验证(如果数据没那么多可以灵活的进行K-fold cross validation);
Tensorflow学习九---过拟合欠拟合_第4张图片

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)
   ])

5、drapoutTensorflow学习九---过拟合欠拟合_第5张图片

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) 

你可能感兴趣的:(TensorFlow,深度学习,机器学习,tensorflow)