开发者学堂课程【Tensorflow 2.0入门与实战:Dropout 与网络参数选择总原则】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/664/detail/11110
Dropout与网络参数选择总原则
内容介绍:
一、 过拟合
二、 使用 Dropout 抑制过拟合
三、构建网络的总原则
一、过拟合
使用上节课的 model,仍然使用 Sequential 模型,三个隐藏层,每层有128个隐藏的神经单元。
model = tf. keras.Sequential(
)
model.add(tf.keras.layers.Flatten(input_shape=(28,28)))# 28*28
mode
l
.add(tf.keras.layers.Dense(128,activation='relu'))
mode
l
.add(tf.keras.layers.Dense(128,activation='relu'))
mode
l
.add(tf.keras.layers.Dense(128,activation='relu'))
model.add(tf.keras.layers. Dense(10,activation='softmax'))
重新训练一下,编译部分没有任何区别。
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
loss=' categorical_crossentropy',
metrics=['acc']
)
history = model.fit(train_image,train_label_onehot,
epochs=10,
validation_data=(test_image, test_label_onehot)
这样可以提醒我们在训练节和验证节上的 loss 以及正确率,训练完之后
In [41]: history.history. keys ()
Out[41]: dict_keys([' loss', 'acc , 'val_loss', 'val_acc'])
可以发现,keys 变成了[' loss', 'acc , 'val_loss', 'val_acc']这几项,这个验证项就是因为我们添加了 test_image 和 test_label_onehot。使用 test 数据来验证也是非常客观的,因为 test 数据解释网络也是没有见过的数据。
用绘图看一下两者的变化
plt.plot(history.epoch,history.history.get('loss'),label=' loss')
plt.plot(history.epoch,history.history.get('val_loss'),label='val_loss')
plt.legend()
<matplotlib.legend. Legend at 0x23d1e50b320>
从中可以看出,第七个 epoch 之后,val_loss 不但没有下降,反而得到了一定程度的上升,但是 train 数据的 loss一直在下降。在验证数据上,不但没有下降,反而上升了,是产生了过拟合的原因。
也可以通过正确率来反映这一点:
plt.plot(history.epoch
,
history.history.get('acc')
,
label='acc')
plt.plot(history.epoch
,
history.history.get('val_acc')
,
label='val_acc')
plt.legend(
)
val_acc 基本上是一个上升的过程,train 数据的正确率,毫无疑问,在一直上升,最后达到95%左右,但是二者的正确率之间有一个巨大的鸿沟,train 数据上得分非常高,test 数据得分没有那么高,这就是一种典型的过拟合。
过拟合:在训练数据上得分很高,在测试数据上得分相对比较低。
欠拟合:在训练数据上得分比较低,在测试数据上得分也比较低。
比如训练得分升高到85%就不再上升,这就说明网络的拟合能力不够,也就是欠拟合。
二、使用 Dropout 抑制过拟合
网络的拟合能力不够,可以通过增加网络中神经元个数和增加网络层数来增加网络拟合能力,从而使其在训练数据上得到一定的提高。
对于过拟合,可以通过 Dropout 抑制过拟合,
Dropout 实际上就是人为的丢弃一些单元,标准的网络,上面是输出,Dropout 层原理上与集成方法非常类似,我们随机的丢弃掉一些隐藏单元,所以每一次的数据输出都会有所不同,在测试的时候,使用全部的神经元,这样得到一个最后相对比较可靠的结果。这就是它的基本原理。
丢弃掉一些层之后的样子:
为什么说 Dropout 可以解决过拟合?
(1)取平均的作用:
先回到标准的模型即没有 dropout,我们用相同的训练数据去训练5个不同的神经网络,一般会得到5个不同的结果,此时我们可以采用“5个结果取均值”或者“多数取胜的投票策略”去决定最终结果。
(2)减少神经元之间复杂的共适应关系:
因为 dropout 程序导致两个神经元不一定每次都在一个 dropout 网络中出现。这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况。
(3))Dropout 类似于性别在生物进化中的角色:
物种为了生存往往会倾向于适应这种环境,环境突变则会导致物种难以做出及时反应,性别的出现可以繁衍出适应新环境的变种,有效的阻止过拟合,即避免环境改变时物种可能面临的灭绝
参数选择原则:
理想的模型是刚好在欠拟合和过拟合的界线上,也就是正好拟合数据。
首先开发一个过拟合的模型:
(1)添加更多的层,增加深度
(2)让每一层变得更大,增加隐藏单元个数
(3)训练更多的轮次,增加训练轮次,使其容易产生过拟合。
然后,抑制过拟合:
(1) dropout
(2)正则化
(3)图像增强
抑制过拟合的最好办法是增加训练数据,上面这些方法是在没有训练数据的情况系下,来抑制过拟合。
再次,调节超参数:
学习速率,
隐藏层单元数
训练轮次
超参数的选择是一个经验与不断测试的结果。经典机器学习的方法,如特征工程、增加训练数据也要做交叉验证
三、构建网络的总原则
总的原则是:保证神经网络容量足够拟合数据
1、增大网络容量,直到过拟合
2、采取措施抑制过拟合
3、继续增大网络容量,直到过拟合