FA_CNN卷积神经网络二十一---丢弃法PyTorch

发布时间:2026/11/3 10:40:48
FA_CNN卷积神经网络二十一---丢弃法PyTorch 1. 引言过拟合是深度学习中绕不开的问题模型在训练集上表现优异一到测试集就翻车。丢弃法Dropout是应对过拟合最经典、最常用的正则化手段之一。本文从原理出发先手写dropout_layer理解其内部机制再用 PyTorch 框架的nn.Dropout做简洁实现并在 Fashion-MNIST 上对比训练效果。2. 丢弃法原理丢弃法在训练时以概率ppp随机将隐藏层单元的输出置零被丢弃的神经元不参与本次前向与反向传播。这样每次迭代都在训练一个结构不同的子网络相当于对大量子网络做集成从而降低模型对特定神经元的依赖缓解过拟合。关键细节在于缩放若某单元以概率ppp被置零则其输出期望变为原来的(1−p)(1-p)(1−p)倍。为了让训练与测试时的期望一致需要对保留下来的输出除以1−p1-p1−pxi′{0,以概率 pxi1−p,以概率 1−p x_i \begin{cases} 0, \text{以概率 } p \\ \dfrac{x_i}{1-p}, \text{以概率 } 1-p \end{cases}xi′​⎩⎨⎧​0,1−pxi​​,​以概率p以概率1−p​这里除以1−p1-p1−p是为了xi′x_ixi′​与原来的xix_ixi​的期望相同。需要注意丢弃法只在训练时启用测试/推理阶段直接使用完整网络不做随机丢弃。丢弃概率ppp是超参数通常隐藏层取 0.2 ~ 0.5输入层可适当小一些。输出层一般不加 Dropout。3. 从零实现丢弃法3.1 实现 dropout_layer 函数该函数以dropout的概率丢弃张量输入X中的元素importtorchfromtorchimportnnfromd2limporttorchasd2ldefdropout_layer(X,dropout):assert0dropout1# dropout 必须在 [0, 1] 区间内否则报错ifdropout1:returntorch.zeros_like(X)# dropout 为 1则 X 全部置零ifdropout0:returnX# dropout 为 0则原样返回# 生成与 X 同形状的均匀分布随机数大于 dropout 的位置保留mask(torch.rand(X.shape)dropout).float()returnmask*X/(1.0-dropout)说明原笔记中此处写作torch.randn但randn是标准正态分布取值可能为负会导致掩码几乎全为 1达不到丢弃效果。正确做法是使用torch.rand[0,1)[0,1)[0,1)均匀分布。3.2 测试不同丢弃概率Xtorch.arange(16,dtypetorch.float32).reshape((2,8))print(X)print(dropout_layer(X,0.))print(dropout_layer(X,0.5))# 约 50% 的元素被置零print(dropout_layer(X,1.))输出示例tensor([[ 0., 1., 2., 3., 4., 5., 6., 7.], [ 8., 9., 10., 11., 12., 13., 14., 15.]]) tensor([[ 0., 1., 2., 3., 4., 5., 6., 7.], [ 8., 9., 10., 11., 12., 13., 14., 15.]]) tensor([[ 0., 0., 4., 6., 0., 0., 0., 14.], [16., 0., 0., 0., 0., 0., 0., 30.]]) tensor([[0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0., 0.]])可以看到dropout0时输出不变dropout0.5时约一半元素被置零保留的元素被放大为原来的 2 倍dropout1时全部置零。3.3 定义带 Dropout 的多层感知机构建一个含两个隐藏层、每层 256 个单元的多层感知机两个隐藏层的丢弃概率分别为 0.2 和 0.5num_inputs,num_outputs,num_hiddens1,num_hiddens2784,10,256,256dropout1,dropout20.2,0.5classNet(nn.Module):def__init__(self,num_inputs,num_outputs,num_hiddens1,num_hiddens2,is_trainingTrue):super(Net,self).__init__()self.num_inputsnum_inputs self.trainingis_training self.lin1nn.Linear(num_inputs,num_hiddens1)self.lin2nn.Linear(num_hiddens1,num_hiddens2)self.lin3nn.Linear(num_hiddens2,num_outputs)self.relunn.ReLU()defforward(self,X):H1self.relu(self.lin1(X.reshape((-1,self.num_inputs))))ifself.training:# 仅在训练时施加 dropoutH1dropout_layer(H1,dropout1)H2self.relu(self.lin2(H1))ifself.training:H2dropout_layer(H2,dropout2)outself.lin3(H2)# 输出层不施加 dropoutreturnout netNet(num_inputs,num_outputs,num_hiddens1,num_hiddens2)3.4 训练与测试num_epochs,lr,batch_size10,0.5,256lossnn.CrossEntropyLoss()train_iter,test_iterd2l.load_data_fashion_mnist(batch_size)trainertorch.optim.SGD(net.parameters(),lrlr)d2l.train_ch3(net,train_iter,test_iter,loss,num_epochs,trainer)4. 简洁实现使用框架PyTorch 已内置nn.Dropout无需手写掩码逻辑直接插入到网络层之间即可importtorchfromtorchimportnnfromd2limporttorchasd2l num_epochs,lr,batch_size10,0.5,256dropout1,dropout20.2,0.5lossnn.CrossEntropyLoss()train_iter,test_iterd2l.load_data_fashion_mnist(batch_size)netnn.Sequential(nn.Flatten(),nn.Linear(784,256),nn.ReLU(),nn.Dropout(dropout1),nn.Linear(256,256),nn.ReLU(),nn.Dropout(dropout2),nn.Linear(256,10))definit_weights(m):iftype(m)nn.Linear:nn.init.normal_(m.weight,std0.01)net.apply(init_weights)trainertorch.optim.SGD(net.parameters(),lrlr)d2l.train_ch3(net,train_iter,test_iter,loss,num_epochs,trainer)nn.Dropout会自动根据model.train()/model.eval()切换行为训练时按概率丢弃并缩放评估时直接透传无需手动判断。5. 两种实现对比对比项从零实现框架实现核心逻辑手写掩码 缩放nn.Dropout封装训练/测试切换手动判断self.training自动跟随train()/eval()代码量较多便于理解原理简洁适合工程使用适用场景学习原理、自定义变体实际项目开发6. 小结丢弃法通过在训练时随机置零隐藏单元抑制神经元间的共适应是缓解过拟合的有效正则化手段。为保证期望一致保留的输出需除以1−p1-p1−p进行缩放。丢弃法只在训练阶段生效测试阶段使用完整网络。实际开发中优先使用nn.Dropout理解原理时手写dropout_layer更有帮助。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询