一、什么是过拟合 (Overfitting)
Overfitting 也被称为过度学习,过度拟合。 它是机器学习中常见的问题。
最有效的方式是通过识别精度判断模型是否存在过拟合:比较模型对验证集和训练集的识别精度,如果验证集识别精度大幅低于训练集,则可以判断模型存在过拟合。
举个Classification(分类)的例子。
图中黑色曲线是正常模型,绿色曲线就是overfitting模型。尽管绿色曲线很精确的区分了所有的训练数据,但是并没有描述数据的整体特征,对新测试数据的适应性较差。
过拟合是什么时候发生的?
要获得这个信息,就需要在模型训练过程中动态的监测每次迭代(Epoch)后训练集和验证集的识别精度,一旦出现训练集识别率继续上升而验证集识别率不再提高,就说明过拟合发生了。
举个Regression (回归)的例子:
第三条曲线存在overfitting问题,尽管它经过了所有的训练点,但是不能很好的反应数据的趋势,预测能力严重不足。 TensorFlow提供了强大的dropout方法来解决overfitting问题。
二、dropout原理简述
tf.nn.dropout是TensorFlow里面为了防止或减轻过拟合而使用的函数,它一般用在全连接层。
dropout就是在不同的训练过程中随机扔掉一部分神经元。也就是让某个神经元的激活值以一定的概率p,让其停止工作,这次训练过程中不更新权值,也不参加神经网络的计算,但是它的权重得保留下来(只是暂时不更新而已),因为下次样本输入时它可能又得工作了。示意图如下:
三、tf.nn.dropout函数说明
tf.nn.dropout(x, keep_prob, noise_shape=None, seed=None,name=None)
上面方法中常用的是前两个参数:
第一个参数x:指输入;
第二个参数keep_prob: 设置神经元被选中的概率,在初始化时keep_prob是一个占位符,keep_prob = tf.placeholder(tf.float32) 。tensorflow在run时设置keep_prob具体的值,例如keep_prob: 0.5。
当keep_prob=1的时候,相当于100%保留,也就是dropout没有起作用。
第五个参数name:指定该操作的名字。
使用举例:
1、dropout必须设置概率keep_prob,keep_prob也可以是一个占位符。
keep_prob = tf.placeholder(tf.float32)
2、train的时候才是dropout起作用的时候,验证和test的时候不应该让dropout起作用。
sess.run(train_step, feed_dict={xs: X_train, ys: y_train, keep_prob: 0.5})
如下所示,dropout一般只在全连接层而不是卷积层或者池化层使用。
四、具体演示代码
TensorFlow中 keep_prob 参数的官方解释:
With probability keep_prob, outputs the input element scaled up by 1 / keep_prob, otherwise outputs 0. The scaling is so that the expected sum is unchanged.
对于概率 keep_prob,输出的输入元素按比例增加1/keep_prob,否则输出0。
dropout函数的输出结果是: Tensor of the same shape of x
具体演示代码如下:
import tensorflow as tf
import numpy as np
dropout = tf.placeholder(tf.float32)
x = tf.Variable(tf.ones([10, 10]))
y = tf.nn.dropout(x, dropout)
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
z = sess.run(y, feed_dict = {dropout: 0.5})
print(x.eval())
print(x.eval().sum())
print(z)
print(z.sum())
查看输出结果:
dropout 输出结果:
- 输入和输出的tensor的shape果然是一样的;
- 不是0的元素都变成了原来的 1/keep_prob倍;