丢弃法——使用Gluon

本节中,我们将上一节的实验代码用Gluon实现一遍。你会发现代码将精简很多。

定义模型并添加丢弃层

在多层感知机中Gluon实现的基础上,我们只需要在全连接层后添加Dropout层并指定丢弃概率。在训练模型时,Dropout层将以指定的丢弃概率随机丢弃上一层的输出元素;在测试模型时,Dropout层并不发挥作用。

In [1]:
import sys
sys.path.append('..')
import gluonbook as gb
from mxnet import autograd, gluon, init, nd
from mxnet.gluon import loss as gloss, nn

drop_prob1 = 0.2
drop_prob2 = 0.5

net = nn.Sequential()
net.add(nn.Flatten())
net.add(nn.Dense(256, activation="relu"))
# 在第一个全连接层后添加丢弃层。
net.add(nn.Dropout(drop_prob1))
net.add(nn.Dense(256, activation="relu"))
# 在第二个全连接层后添加丢弃层。
net.add(nn.Dropout(drop_prob2))
net.add(nn.Dense(10))
net.initialize(init.Normal(sigma=0.01))

训练和测试模型

这部分依然和多层感知机中的训练和测试没有多少区别。

In [2]:
num_epochs = 5
batch_size = 256
loss = gloss.SoftmaxCrossEntropyLoss()
trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': 0.5})
train_iter, test_iter = gb.load_data_fashion_mnist(batch_size)
gb.train_cpu(net, train_iter, test_iter, loss, num_epochs, batch_size,
             None, None, trainer)
epoch 1, loss 1.1328, train acc 0.557, test acc 0.750
epoch 2, loss 0.5849, train acc 0.785, test acc 0.833
epoch 3, loss 0.4921, train acc 0.819, test acc 0.839
epoch 4, loss 0.4475, train acc 0.836, test acc 0.855
epoch 5, loss 0.4187, train acc 0.847, test acc 0.865

小结

  • 使用Gluon,我们可以更方便地构造多层神经网络并使用丢弃法。

练习

  • 尝试不同丢弃概率超参数组合,观察并分析结果。

扫码直达讨论区