神经网络中的 eval()是什么意思?

神经网络中的 eval()是什么意思?

作者:Yellow_39f2
链接:https://www.jianshu.com/p/ef2a7a78aa83

在知乎(https://zhuanlan.zhihu.com/p/23178423)和博客园(https://www.cnblogs.com/king-lps/p/8570021.html)分别看到解释dropout和模块的两种模式(train训练模式,eval测试/评估模式)的文章,写的很明了,总结一下自己的更加通俗易懂的理解。

dropout是用来解决神经网络训练过程中的过拟合问题(over-fitting),因为当训练集的数量不多而网络参数相对多时,训练样本误差带来的影响很大,拟合的过程中强行逼近到了误差值。因此在每一层神经网络中引入dropout,具体的实现过程是在每次更新参数的过程中,随机的剔除掉部分(按照比例参数p)神经元,不对其参数进行更新。

在这里插入图片描述

神经网络模块存在两种模式,train模式(net.train())和eval模式(net.eval())。一般的神经网络中,这两种模式是一样的,只有当模型中存在dropout和batchnorm的时候才有区别。比如针对上图中的训练网络,四层有三层进行了dropout,这是为了训练出更加准确的网络参数,一旦我们用测试集进行结果测试的时候,一定要使用net.eval()把dropout关掉,因为这里我们的目的是测试训练好的网络,而不是在训练网络,没有必要再dropout。

另外作者还对dropout 为什么能解决模型过拟合的问题做出了解释:

取平均的作用:
先回到正常的模型(没有dropout),我们用相同的训练数据去训练5个不同的神经网络,一般会得到5个不同的结果,此时我们可以采用“5个结果取均值”或者“多数取胜的投票策略”去决定最终结果。(例如3个网络判断结果为数字9,那么很有可能真正的结果就是数字9,其它两个网络给出了错误结果)。这种“综合起来取平均”的策略通常可以有效防止过拟合问题。因为不同的网络可能产生不同的过拟合,取平均则有可能让一些“相反的”拟合互相抵消。dropout掉不同的隐藏神经元就类似在训练不同的网络(随机删掉一半隐藏神经元导致网络结构已经不同),整个dropout过程就相当于 对很多个不同的神经网络取平均。而不同的网络产生不同的过拟合,一些互为“反向”的拟合相互抵消就可以达到整体上减少过拟合。

减少神经元之间复杂的共适应关系:因为dropout程序导致两个神经元不一定每次都在一个dropout网络中出现。(这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况)。迫使网络去学习更加鲁棒的特征(这些特征在其它的神经元的随机子集中也存在)。换句话说假如我们的神经网络是在做出某种预测,它不应该对一些特定的线索片段太过敏感,即使丢失特定的线索,它也应该可以从众多其它线索中学习一些共同的模式(鲁棒性)。(这个角度看dropout就有点像L1,L2正则,减少权重使得网络对丢失特定神经元连接的鲁棒性提高)

  • 11
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 PyTorch ,可以通过 `torch.nn.Dropout` 模块来实现卷积神经网络的 Dropout 操作。下面是一个简单的示例代码: ```python import torch import torch.nn as nn class ConvNet(nn.Module): def __init__(self): super(ConvNet, self).__init__() self.conv1 = nn.Conv2d(1, 16, kernel_size=3, stride=1, padding=1) self.relu = nn.ReLU() self.dropout = nn.Dropout(p=0.5) self.fc = nn.Linear(16 * 28 * 28, 10) def forward(self, x): out = self.conv1(x) out = self.relu(out) out = self.dropout(out) out = out.view(out.size(0), -1) out = self.fc(out) return out # 创建模型实例 model = ConvNet() # 使用 Dropout 模块进行训练 criterion = nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9) # 在训练循环使用 Dropout for epoch in range(num_epochs): # ... model.train() for images, labels in train_loader: # ... outputs = model(images) loss = criterion(outputs, labels) # ... # ... model.eval() with torch.no_grad(): for images, labels in test_loader: # ... outputs = model(images) # ... ``` 在上面的示例,我们创建了一个简单的卷积神经网络 (`ConvNet`),其包含一个 Dropout 模块 (`nn.Dropout`)。在模型的 `forward` 方法,我们将 Dropout 应用于卷积层之后的激活函数之前。 在训练循环,我们使用 `model.train()` 将模型设置为训练模式,这会启用 Dropout 模块的随机失活。而在测试循环,我们使用 `model.eval()` 将模型设置为评估模式,这会禁用 Dropout 模块的随机失活。 请注意,`p` 参数是 Dropout 的丢弃概率,即每个神经元被丢弃的概率。在上面的示例,我们将丢弃概率设置为 0.5。你可以根据自己的需求调整这个值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值