Task3 regularization

来源:互联网 发布:淘宝手机店铺收藏 编辑:程序博客网 时间:2024/06/03 17:01

这次的作业主要是完成正则化regularization

第一个问题是实现L2正则化

完成起来也非常简单,直接将上次作业中的损失函数增加一个权重的正则化方程,这个在tensorflow中有现成的函数

tf.nn.l2_loss(t, name=None)

output = sum(t ** 2) / 2

可以比较下正则化和没有正则化的结果
首先是logistic regression
lambda取0.01
非正则化正则化
可以看出准确率有了一定的提高
之后调整下参数lambda为0.001,测试集上准确率提高了
0.001

再比较下neural network的结果
非正则化正则化
同样地,准确率有了一定提高

第二个问题是让实现一个overfitting的极端例子

这个其实在上次作业中就出现过,样本比较少时,很容易就过拟合了。这里仅仅把样本减少了,并没有去掉正则化。
过拟合

第三个问题引入dropout

这里让在神经网络的隐藏层中引入dropout,但需要注意的是,仅仅在训练时用dropout,在评估时不用dropout。否则,评估结果也会是一个随机的。
TensorFlow中有nn.dropout()函数

tf.nn.dropout(x, keep_prob, noise_shape=None, seed=None, name=None)

keep_prob指输出的概率,它在输出时自动进行了缩放,即输出的为输入的1/keep_prob倍,以保证输出的总和不变。

首先看一下没有正则化的结果
没有正则化
由于过拟合比较严重,所以我把正则化参数调的比较大,为0.2,效果没有什么提高,感觉似乎没有收敛,明天再试一下
Initialized
Minibatch loss at step 0: 63348.453125
Minibatch accuracy: 9.4%
Validation accuracy: 34.7%
Minibatch loss at step 500: 1.811313
Minibatch accuracy: 70.3%
Validation accuracy: 75.9%
Minibatch loss at step 1000: 1.821344
Minibatch accuracy: 64.1%
Validation accuracy: 71.2%
Minibatch loss at step 1500: 1.680706
Minibatch accuracy: 75.0%
Validation accuracy: 75.2%
Minibatch loss at step 2000: 1.723629
Minibatch accuracy: 73.4%
Validation accuracy: 71.3%
Minibatch loss at step 2500: 1.758054
Minibatch accuracy: 78.9%
Validation accuracy: 74.8%
Minibatch loss at step 3000: 1.758886
Minibatch accuracy: 78.1%
Validation accuracy: 74.0%
Test accuracy: 80.7%
感觉可能没有收敛,所以调整为0.1,又把训练的步数加多为6001,没有再过拟合了
Initialized
Minibatch loss at step 0: 31753.601562
Minibatch accuracy: 6.2%
Validation accuracy: 35.1%
Minibatch loss at step 500: 1.410312
Minibatch accuracy: 76.6%
Validation accuracy: 78.7%
Minibatch loss at step 1000: 1.283932
Minibatch accuracy: 82.8%
Validation accuracy: 78.8%
Minibatch loss at step 1500: 1.363455
Minibatch accuracy: 83.6%
Validation accuracy: 78.8%
Minibatch loss at step 2000: 1.221968
Minibatch accuracy: 85.9%
Validation accuracy: 74.3%
Minibatch loss at step 2500: 1.388122
Minibatch accuracy: 81.2%
Validation accuracy: 77.1%
Minibatch loss at step 3000: 1.347870
Minibatch accuracy: 78.1%
Validation accuracy: 78.0%
Minibatch loss at step 3500: 1.227877
Minibatch accuracy: 86.7%
Validation accuracy: 79.1%
Minibatch loss at step 4000: 1.383550
Minibatch accuracy: 81.2%
Validation accuracy: 76.4%
Minibatch loss at step 4500: 1.172855
Minibatch accuracy: 90.6%
Validation accuracy: 75.8%
Minibatch loss at step 5000: 1.372749
Minibatch accuracy: 83.6%
Validation accuracy: 74.7%
Minibatch loss at step 5500: 1.372579
Minibatch accuracy: 79.7%
Validation accuracy: 74.1%
Minibatch loss at step 6000: 1.294438
Minibatch accuracy: 85.2%
Validation accuracy: 78.2%
Test accuracy: 84.5%

正则化参数为0.01的结果
Initialized
Minibatch loss at step 0: 3503.147949
Minibatch accuracy: 10.2%
Validation accuracy: 34.1%
Minibatch loss at step 500: 21.165089
Minibatch accuracy: 100.0%
Validation accuracy: 80.5%
Minibatch loss at step 1000: 0.549533
Minibatch accuracy: 100.0%
Validation accuracy: 81.0%
Minibatch loss at step 1500: 0.394824
Minibatch accuracy: 100.0%
Validation accuracy: 81.3%
Minibatch loss at step 2000: 0.340456
Minibatch accuracy: 100.0%
Validation accuracy: 81.0%
Minibatch loss at step 2500: 0.425891
Minibatch accuracy: 99.2%
Validation accuracy: 80.8%
Minibatch loss at step 3000: 0.367393
Minibatch accuracy: 100.0%
Validation accuracy: 81.1%
Test accuracy: 87.3%

再看一下只采用dropout的结果,效果好一点,但仍然是过拟合
Initialized
Minibatch loss at step 0: 540.953491
Minibatch accuracy: 7.8%
Validation accuracy: 34.9%
Minibatch loss at step 500: 1.596583
Minibatch accuracy: 97.7%
Validation accuracy: 79.3%
Minibatch loss at step 1000: 0.000190
Minibatch accuracy: 100.0%
Validation accuracy: 79.9%
Minibatch loss at step 1500: 0.000000
Minibatch accuracy: 100.0%
Validation accuracy: 80.4%
Minibatch loss at step 2000: 0.000000
Minibatch accuracy: 100.0%
Validation accuracy: 80.4%
Minibatch loss at step 2500: 0.000000
Minibatch accuracy: 100.0%
Validation accuracy: 80.3%
Minibatch loss at step 3000: 0.000000
Minibatch accuracy: 100.0%
Validation accuracy: 80.5%
Test accuracy: 87.1%

第四个问题引入多层神经网络以及学习速率衰减

首先是加了一层神经网络,但是loss一下子就变成了nan
没有约束标准差
查了下说是很有可能logits为0,因此求导后就变得很大,需要加一个偏差,但是尝试了下没效果。应该是tf.nn.sigmoid_cross_entropy_with_logits()这个函数已经解决了这个问题。

还有人说是因为网络加深了,需要调节的参数更多了,所以需要把学习速率减小,我调整了之后,发现没有在出现NaN,但是准确率非常低,所以可能是我的损失函数还是有问题?

后来把它们的标准差改为了0.1,效果就非常好了
标准差为0.1

看了下变量初始化的值,没有约束时,求了下标准差是0.67
没有约束 stddev=0.1
一直没懂为什么,后来看到一个回答说主要是由于多层神经网络会使得梯度非常不稳定,导致损失函数变为NaN,最好的解决方法是用Xavier初始化方法,否则初始化的方差非常大,会导致不稳定。

Xavier初始化非常适合ReLu函数,它的思想就是让一个神经元的输入权重的(当反向传播时,就变为输出了)的方差等于:1 / 输入的个数,我也试了一下,结果如下:
Xavier

还有一个回答是说减小batch size,我也试了下,还是一样的
之前没有用drop out,现在加上看下效果,反而差了些,这个以后再慢慢研究吧
drop out

下面就看下学习速率的影响,之前的速率是1,现在改成0.5,准确率有了提高
0.5
比较尴尬的是没有drop out的话,准确率达到了94.8%.
现在加上decay,这里用到了函数tf.train.exponential_decay(earning_rate, global_step, decay_steps, decay_rate, staircase=False, name=None)
我把步数也增加到了5001,现在准确率达到了95.0%。
之后可以尝试在加深网路深度,或者用上卷积神经网络。

0 0
原创粉丝点击