TensorFlow-网络优化和超参数选择,Dropout抑制过拟合

PyCharm配置github 参考https://blog.csdn.net/sinat_37621394/article/details/80865528

推荐一篇文章:

https://www.analyticsvidhya.com/blog/2020/02/cnn-vs-rnn-vs-mlp-analyzing-3-types-of-neural-networks-in-deep-learning/

获取个人课件,链接: https://pan.baidu.com/s/1HIQJ34z5dJDJJbP6Nen_DA 提取码: pymc

网络容量:

       可以认为与网络中的可训练参数成正比

网络中的神经单元数越多,层数越多,神经网络的拟合能力越强。

但是训练速度、难度越大,越容易产生过拟合

选择超参数:

        超参数,就是搭建神经网络中,需要我们自己选择(不是通过梯度下降算法去优化的那些参数)

比如,中间的神经元个数,学习速率

那么如何提高网络拟合能力?

一种显然的想法是增大网络容量:

  1. 增加层
  2. 增加隐藏神经元个数
这两种方法哪种更好呢?
       单纯的增加神经元个数对于网络性能的提高并不明显, 增加层会大大提高网络的拟合能力
这也是为什么现在深度学习的层越来越深的原因
注意:
       单层的神经元个数,不能太小,太小的话,会造成信息瓶颈,使得模型欠拟合,比如:
                                                                      Model: "sequential"顺序模型
一层一层往下传递,如果中间的某一层神经元的个数太少,不能容纳整个层的信息,使得这一层会丢弃掉有用的信息
单层时
model.add(tf.keras.layers.Flatten(input_shape=(28,28)))  #扁平成28*28的向量
model.add(tf.keras.layers.Dense(128,activation='relu'))
#输出
model.add(tf.keras.layers.Dense(10,activation='softmax')) #变成长度为10个概率值,softmax把它激活成概率分布
model.summary()
运行

TensorFlow-网络优化和超参数选择,Dropout抑制过拟合_第1张图片

增加隐藏层
(2)
model.add(tf.keras.layers.Dense(128,activation='relu'))
model.add(tf.keras.layers.Dense(128,activation='relu'))
model.add(tf.keras.layers.Dense(128,activation='relu'))
model.summary()

运行:dense密度,总共有133504个训练参数

TensorFlow-网络优化和超参数选择,Dropout抑制过拟合_第2张图片

(3) 

......
model.add(tf.keras.layers.Dense(128,activation='relu'))
#输出
model.add(tf.keras.layers.Dense(10,activation='softmax')) #变成长度为10个概率值,softmax把它激活成概率分布
model.summary()

运行:dense密度,总共有134794个训练参数

TensorFlow-网络优化和超参数选择,Dropout抑制过拟合_第3张图片

看看现在的Model拟合English怎么样,是否能够提供模型的正确率

单因此层训练5个Epoch时:

TensorFlow-网络优化和超参数选择,Dropout抑制过拟合_第4张图片

单隐藏层训练10个Epoch时: 略微提高:

多隐藏层训练5个Epoch时:要更少了,因为此时的学习率认为0.01

 多隐藏层训练10个Epoch时,并且learning_rate=0.001:

  1. 注意学习率为0.001
  2. 当可训练参数多提高epochs

TensorFlow-网络优化和超参数选择,Dropout抑制过拟合_第5张图片

参数选择原则:

       理想的模型是刚好在欠拟合和过拟合的界线上,也就是正好拟合数据。
  • 首先开发一个过拟合的模型:
  1. 添加更多的层。
  2. 让每一层变得更大。
  3. 训练更多的轮次
  • 然后,抑制过拟合:
  1. dropout
  2. 正则化
  3. 图像增强
  • 再次,调节超参数:
  1. 学习速率,
  2. 隐藏层单元数
  3. 训练轮次
超参数的选择是一个经验与不断测试的结果。
       经典机器学习的方法,如特征工程、增加训练数据也要做 交叉验证

Dropout 

过拟合:在训练数据上得分很高,在测试数据上得分相对比较低

如图,第7个epochs,val_loss(验证数据)不但没有下降反而上升了,这就是过拟合的标识

TensorFlow-网络优化和超参数选择,Dropout抑制过拟合_第6张图片

从正确率来看:

TensorFlow-网络优化和超参数选择,Dropout抑制过拟合_第7张图片

 欠拟合:在训练数据上得分比较低,在测试数据上得分相对比较低

Dropout 层

(1)标准神经网络

TensorFlow-网络优化和超参数选择,Dropout抑制过拟合_第8张图片

(2)人为丢弃一部分层,只激活其中一部分层

TensorFlow-网络优化和超参数选择,Dropout抑制过拟合_第9张图片

这样的好处是:(随机森林或集成方法),关键点就是建立多棵树,得到一个结果,然后对这个多棵树的结果做个平均或说加权平均,Dropout的原理与这个集成方法很类似,随机丢掉不同的隐藏单元,这一层的模型与下一次训练出来的结果不同的“树”,在最后预测prediction时,我们会把所有的结果,不再丢弃,dropout层在训练的时候发挥作用,在测试的时候,会用到全部的神经元,得到最后一个结果,这样相对就可靠,正确率比较高。

Dropout可以解决过拟合:

1.取平均的作用: 先回到标准的模型即没有dropout,我们用相同的训练数据去训练5个不同的神经网络,一般会得到5个不同的结果,此时我们可以采用 “5个结果取均值”或者“多数取胜的投票策略”去决定最终结果。

2.减少神经元之间复杂的共适应关系: 因为dropout 程序导致两个神经元不一定每次都在一个dropout网络中出现。这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况 。

3.Dropout类似于性别在生物进化中的角色:物种为了生存往往会倾向于适应这种环境,环境突变则会导致物种难以做出及时反应,性别的出现可以繁衍出适应新环境的变种, 有效的阻止过拟合,即避免环境改变时物种可能面临的灭绝

参数选择原则

理想的模型是刚好在欠拟合和过拟合的界线上,也就是正好拟合数据。
(如果网络拟合能力不够,不够如何去调参,最后也无法拟合数据,得到不了高分)
  • 首先开发一个过拟合模型:
  1. 添加更多的层。
  2. 让每一层变得更大。
  3. 训练更多的轮次(训练次数多点,容易产生过拟合)
  • 然后,抑制过拟合(说明在容量上已经没有问题):
  • 最好的办法是增加训练数据,以下是没有数据训练的前提下
  1. dropout
  2. 正则化
  3. 图像增强
  • 再次,调节超参数:
  1. 学习速率,
  2. 隐藏层单元数
  3. 训练轮次
超参数的选择是一个经验与不断测试的结果。
经典机器学习的方法,如特征工程、增加训练数据也要做 交叉验证(调参时很有可能泄露给测试数据,因为每次都针对测试数据调参,所以我们会把数据划成三部分进行交叉验证)

构建网络的总原则

总的原则是:保证神经网络容量足够拟合数据
一、增大网络容量,直到过拟合
二、采取措施抑制过拟合
三、继续增大网络容量,直到进一步过拟合,得到一个很高的分
 

你可能感兴趣的:(人工智能)