tensorflow实战之四:MNIST手写数字识别的优化3-过拟合

这一节我们会提到过拟合,及Dropout策略。

      一.拟合:

       我们先来看一下三种拟合:

tensorflow实战之四:MNIST手写数字识别的优化3-过拟合_第1张图片

      大量案例都表明,在神经网络神经元个数或者层数增加时,训练过程容易出现过拟合的现象。所谓的过拟合,实际上就是指神经网络在训练集上的准确率非常高,但是在

测试集上的准确率很低。什么意思?,就相当于神经网络记住了这些数据,而不是从这些数据中总结出规律。比如我们输入了1000张猫的图片给神经网络进行训练,训练完之后我们将这一千张图片的任意一张输入神经网络,神经网络都能非常准确的认出来是猫。但是我们如果输入不属于这1000张图片的另一张猫的图片,神经网络就认不出来了,这就是过拟合的现象。过拟合现象一般都是因为学习的过于精确,就好比让机器学习人脸,取了100个人的脸训练,但是由于你学习的过精确,导致除了这个样本100人外 其他的人脸神经网络都认为不是人脸,实际我们只需要学习人脸的基本特征 而不是详细到人的皮肤细腻,眼睛大小等过于细致的特征,这样可以保证机器还是能识别别的图片中的人脸的。

至于过拟合问题的解决我们通常有一下几种办法:增加数据集 , 正则化,Dropout.这里我们采用的是Dropout来优化我们的神经网络,Dropout过程如下:


1. 首先随机(临时)删掉网络中一半的隐藏神经元,输入输出神经元保持不变(下图中虚线为部分临时被删除的神经元)


2. 然后把输入x通过修改后的网络前向传播,然后把得到的损失结果通过修改的网络反向传播。一小批训练样本执行完这个过程后就按照随机梯度下降法更新(没有被删除的神经元)对应的参数(w,b)。

3. 然后继续重复这一过程:

    恢复被删掉的神经元(此时 被删除的神经元 保持原样,而没有被删除的神经元已经有所更新)
    从隐藏神经元中随机选择一个一半大小的子集 临时删除掉(备份被删除神经元的参数)。
    对一小批训练样本,先前向传播然后反向传播损失并根据随机梯度下降法更新参数(w,b) (没有被删除的那一部分参数得到更新,删除的神经元参数保持被删除前的结果)

不断重复这一过程。


我们每次去掉一部分神经元可以理解为一种平均效应:就是训练出多个网络后取平均值,由于不同网络的拟合效应不同,取平均后正效应与负效应相互抵消,这样就有效的达到了减小过拟合的作用。

#创建一个简单的神经网络
W1 = tf.Variable(tf.truncated_normal([784,300],stddev=0.1))
b1 = tf.Variable(tf.zeros([300])+0.1)
L1 = tf.nn.tanh(tf.matmul(x,W1)+b1)
L1_drop = tf.nn.dropout(L1,keep_prob) 

W2 = tf.Variable(tf.truncated_normal([300,500],stddev=0.1))
b2 = tf.Variable(tf.zeros([500])+0.1)
L2 = tf.nn.tanh(tf.matmul(L1_drop,W2)+b2)
L2_drop = tf.nn.dropout(L2,keep_prob) 

W3 = tf.Variable(tf.truncated_normal([500,300],stddev=0.1))
b3 = tf.Variable(tf.zeros([1000])+0.1)
L3 = tf.nn.tanh(tf.matmul(L2_drop,W3)+b3)
L3_drop = tf.nn.dropout(L3,keep_prob) 

W4 = tf.Variable(tf.truncated_normal([300,10],stddev=0.1))
b4 = tf.Variable(tf.zeros([10])+0.1)
prediction = tf.nn.softmax(tf.matmul(L3_drop,W4)+b4)

我们还是从上一章的代码来说吧,L1是我们第一层神经元的输出,按道理来说我们应该将其输入到L2上即L2=tf.nn.tanh(tf.matmul(L1,W2)+b2),但是我们经过了一个tf.nn.dropout,

我们就可以简单理解这个函数的功能就是将L1向量的部分数值置为0,如果keep_prob=0.7,那么L1_dorp就是将L1百分之30的值置为0后返回的结果,这个L1_dorp再与W相乘的时候当W中部分值与L1_dorp中的0相乘时相当于W中的部分值失效,从而达到了去掉部分神经元的效果,这就是Dropout的原理。一般来说的话,对于越复杂的神经网络,Dropout效果越明显,这里我们的神经网络并不算复杂,因此可能用与不用Dorpout,最后的结果可能没多大区别偶,但是我们理解Dropout对于理解神经网络还是有很大的帮助的。

 


      

你可能感兴趣的:(TensorFlow深度学习)