gpt4 book ai didi

python - Pytorch:nn.Dropout 与 F.dropout

转载 作者:行者123 更新时间:2023-12-02 23:21:38 26 4
gpt4 key购买 nike

有两种方法可以执行dropout:

  • torch.nn.Dropout
  • torch.nn.function.Dropout

我问:

  • 它们之间有区别吗?
  • 我什么时候应该使用其中一种而不是另一种?

当我切换它们时,我没有看到任何性能差异。

最佳答案

其他答案中已经显示了技术差异。然而,主要区别在于nn.Dropout本身就是一个 torch 模块,它具有一些便利性:

用于说明一些差异的简短示例:

import torch
import torch.nn as nn

class Model1(nn.Module):
# Model 1 using functional dropout
def __init__(self, p=0.0):
super().__init__()
self.p = p

def forward(self, inputs):
return nn.functional.dropout(inputs, p=self.p, training=True)

class Model2(nn.Module):
# Model 2 using dropout module
def __init__(self, p=0.0):
super().__init__()
self.drop_layer = nn.Dropout(p=p)

def forward(self, inputs):
return self.drop_layer(inputs)
model1 = Model1(p=0.5) # functional dropout
model2 = Model2(p=0.5) # dropout module

# creating inputs
inputs = torch.rand(10)
# forwarding inputs in train mode
print('Normal (train) model:')
print('Model 1', model1(inputs))
print('Model 2', model2(inputs))
print()

# switching to eval mode
model1.eval()
model2.eval()

# forwarding inputs in evaluation mode
print('Evaluation mode:')
print('Model 1', model1(inputs))
print('Model 2', model2(inputs))
# show model summary
print('Print summary:')
print(model1)
print(model2)

输出:

Normal (train) model:
Model 1 tensor([ 1.5040, 0.0000, 0.0000, 0.8563, 0.0000, 0.0000, 1.5951,
0.0000, 0.0000, 0.0946])
Model 2 tensor([ 0.0000, 0.3713, 1.9303, 0.0000, 0.0000, 0.3574, 0.0000,
1.1273, 1.5818, 0.0946])

Evaluation mode:
Model 1 tensor([ 0.0000, 0.3713, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,
0.0000, 0.0000, 0.0000])
Model 2 tensor([ 0.7520, 0.1857, 0.9651, 0.4281, 0.7883, 0.1787, 0.7975,
0.5636, 0.7909, 0.0473])
Print summary:
Model1()
Model2(
(drop_layer): Dropout(p=0.5)
)

那么我应该使用哪个?

两者在应用 dropout 方面完全等效,尽管使用差异不大,但有一些理由支持 nn.Dropout超过nn.functional.dropout :

Dropout 设计为仅在训练期间应用,因此在对模型进行预测或评估时,您希望关闭 Dropout。

辍学模块nn.Dropout可以方便地处理这个问题,并在模型进入评估模式后立即关闭 dropout,而功能性 dropout 不关心评估/预测模式。

即使您可以将功能退出设置为 training=False要关闭它,它仍然不是像nn.Dropout那样方便的解决方案.

此外,掉落率也存储在模块中,因此您不必将其保存在额外的变量中。在较大的网络中,您可能希望创建具有不同丢弃率的不同丢弃层 - 此处 nn.Dropout可以增加可读性,并且在多次使用图层时也可以带来一些便利。

最后,分配给您的模型的所有模块都会在您的模型中注册。所以你的模型类会跟踪它们,这就是为什么你可以通过调用 eval() 来关闭 dropout 模块。 。当使用函数 dropout 时,您的模型不会意识到它,因此它不会出现在任何摘要中。

关于python - Pytorch:nn.Dropout 与 F.dropout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53419474/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com