应对过拟合的方法,除了权重衰减以外,丢弃法(dropout)也经常使用。丢弃法有一些不同的变体,本节中特指倒置丢弃法(inverted dropout)。
3.13.1 方法
简单来说,就是设置一个的丢弃概率(这是一个超参数),当数据在层与层之间传递时,神经元上的数据有概率被我们丢弃不适用,即对应的权重参数为 0,这样就可以使我们的模型变得稀疏,防止其过度依赖某些神经元以起到正则化的作用。同时,通过拉伸操作,保证输入数据的期望值不变。
丢弃法只在训练模型时使用。
3.13.2 实现
- 数据集
数据集选用FashionMNIST。
# 获取数据集
DATA_SETS_PATH = "~/My-Project/Python学习/PyTorch学习/知乎马卡斯扬-动手学深度学习PyTorch版/Data-Sets"
train_set = torchvision.datasets.FashionMNIST(root=DATA_SETS_PATH, train=True, download=True, transform=torchvision.transforms.ToTensor())
test_set = torchvision.datasets.FashionMNIST(root=DATA_SETS_PATH, train=False, download=True, transform=torchvision.transforms.ToTensor())
# 读取数据
batch_size = 256
train_set_iter = torch_data.DataLoader(train_set, batch_size=batch_size, shuffle=True, num_workers=10)
test_set_iter = torch_data.DataLoader(test_set, batch_size=batch_size, shuffle=True, num_workers=10)
- 定义模型
在PyTorch中,只需要在全连接层后添加Dropout
层并指定丢弃概率。在训练模型时,Dropout
层将以指定的丢弃概率随机丢弃上一层的输出元素;在测试模型时(即model.eval()
后),Dropout
层并不发挥作用。即丢弃法只用于训练模型。
# 定义模型
input_size = 784
hidden1_size = hidden2_size = 256
output_size = 10
# 设置丢弃概率
drop_prob1 = 0.2
drop_prob2 = 0.5
net = nn.Sequential(
# 统一输入特征 shape
d2l.FlattenLayer(),
nn.Linear(input_size, hidden1_size),
nn.ReLU(),
# 添加 Dropout 层并指定丢弃概率
nn.Dropout(drop_prob1),
nn.Linear(hidden1_size, hidden2_size),
nn.ReLU(),
nn.Dropout(drop_prob2),
nn.Linear(hidden2_size, output_size)
)
- 训练模型
# 训练模型
optimizer = torch.optim.SGD(net.parameters(), lr=0.5)
loss_func = nn.CrossEntropyLoss()
iterate_num = 5
d2l.train_ch3(net, train_set_iter, test_set_iter, loss_func, iterate_num, batch_size, optimizer=optimizer)
运行结果
epoch 1, loss 0.0035, train acc 0.668, test acc 0.758
epoch 2, loss 0.0021, train acc 0.807, test acc 0.826
epoch 3, loss 0.0018, train acc 0.832, test acc 0.843
epoch 4, loss 0.0016, train acc 0.846, test acc 0.811
epoch 5, loss 0.0016, train acc 0.854, test acc 0.799