Dropout正则化
Dropout
正则化是一种在训练深度神经网络时防止过拟合的技术。它的工作原理就像是每次训练时随机让一部分神经元“休息”,即暂时不参与计算,具体来说,每个神经元按照预设的概率p
被临时从网络丢弃(其输出值被置0
)。这样做的目的是避免模型对某些特征或特征组合过度依赖,从而提高模型的泛化性能。想想一个场景,如果一个团队过分依赖某几个核心成员,在这些关键人物不在场时,整个团队的表现可能大幅下滑。同样地,在神经网络结构中,通过Dropout
技术,模型不会对一组局部特征过分敏感,这会促使网络学习更加稳定,多样化的特征表示。在实际代码实现上,nn.Dropout(p)
是一个模块,当模型在训练模式下运行时,该模块会议给定的概率p随机丢弃输入信号的某些元素。值得注意的是,再适用PyTorch
时。无需手动开关Dropout
功能,因为框架会根据.train()
和.eval()
方法智能地控制Dropout
在训练阶段和评估阶段的行为。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| import torch import torch.nn as nn
class SimpleMLP(nn.Module): def __init__(self, input_size = 784, hidden_size = 256, output_size = 10, dropout_prob = 0.5): super(SimpleMLP, self).__init__() self.hidden_layer1 = nn.Linear(input_size, hidden_size) self.dropout1 = nn.Dropout(dropout_prob) self.hidden_layer2 = nn.Linear(hidden_size, hidden_size) self.dropout2 = nn.Dropout(dropout_prob) self.output_layer = nn.Linear(hidden_size, output_size) def forward(self, x): x = torch.relu(self.hidden_layer1(x)) x = self.dropout1(x) x = torch.relu(self.hidden_layer2(x)) x = self.dropout2(x) x = self.output_layer(x)
return x
model = SimpleMLP()
inputs = torch.randn(100, 784)
outputs = model(inputs)
model.train() with torch.set_grad_enabled(True): outputs_with_dropout = model(inputs) print(outputs_with_dropout)
model.eval() with torch.no_grad(): outputs_with_dropout = model(inputs) print(outputs_with_dropout)
|