深度学习模型常常使用丢弃法(dropout) 来应对过拟合问题,本节中提到的丢弃法特指倒置丢弃法(inverted dropout)。
(一)方法
由于丢弃法在训练中隐藏层神经元的丢弃是随机的,输出层的计算无法过度依赖隐藏单元中的任一个,从而可以用来应对过拟合。
(二)从零开始实现
下面的dropout函数将以drop_prob的概率丢弃NDArray输入X中的元素。
mxnet.ndarray.random.uniform(low=0, high=1, shape=_Null, dtype=_Null, ctx=None, out=None, **kwargs)
从均匀分布中抽取随机样本。样本均匀分布在半开放区间[低、高(包括低,但不包括高)。
定义函数dropout(X, drop_prob):
若丢弃概率为1,即保持概率为0,那么输出和X形状一样的0矩阵
若丢弃概率在0–1之间,利用random.uniform函数从均匀分布中生成和X形状一样的样本mask,我们来看一下这个过程:
定义模型参数:
定义一个包含两个隐藏层的多层感知机,其中两个隐藏层的输出个数都是256。需要3个W,和3个b参数。
定义模型:
下面定义的模型将全连接层和激活函数ReLU串起来,并对每个激活函数的输出使用丢弃法。
先回顾一下下面两个函数的用法:
定义的模型利用relu()将全连接层和激活函数连接起来,接着利用函数is_training()来判断是在训练还是测试,只在训练时使用丢弃法。第一层完成后第二层重复操作。
训练和测试模型:
首先回顾两个函数:
softmax回归从零开始中的函数:
利用这两个函数实现训练和测试。
(三)简洁实现
在Gluon中,我们只需要在全连接层后添加Dropout层并指定丢弃概率。在训练模型时,Dropout层将以指定的丢弃概率随机丢弃上一层的输出元素;在测试模型时,Dropout层并不发挥作用。
①首先仍然是对于net引入Sequential容器,然后添加第一个隐藏层和激活函数,第一个丢弃层,第二个隐藏层和激活函数,第二个丢弃层。最后对参数初始化。
②引入Trainer,然后利用函数train_ch3训练实现