Task3 regularization

    xiaoxiao2021-03-25  110

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

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

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

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

    output = sum(t ** 2) / 2

    可以比较下正则化和没有正则化的结果 首先是logistic regression lambda取0.01 可以看出准确率有了一定的提高 之后调整下参数lambda为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.67 一直没懂为什么,后来看到一个回答说主要是由于多层神经网络会使得梯度非常不稳定,导致损失函数变为NaN,最好的解决方法是用Xavier初始化方法,否则初始化的方差非常大,会导致不稳定。

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

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

    下面就看下学习速率的影响,之前的速率是1,现在改成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%。 之后可以尝试在加深网路深度,或者用上卷积神经网络。

    转载请注明原文地址: https://ju.6miu.com/read-21679.html

    最新回复(0)