通过使用pyTorch,有两种辍学方法
torch.nn.Dropouttorch.nn.functional.Dropout

我很难看到它们之间的区别:

  • 什么时候使用什么?
  • 有什么不同吗?

  • 切换它们时,我看不到任何性能差异。

    最佳答案

    技术差异已在其他答案中显示。但是主要区别在于nn.Dropout是一个手电筒模块,它具有一些便利:

    一个简短的例子来说明一些差异:

    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:

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

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

    即使您可以将功能dropout设置为training=False来将其关闭,它仍然不是像nn.Dropout这样方便的解决方案。

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

    最后,分配给您模型的所有模块都将在您的模型中注册。因此,您的模型类会跟踪它们,这就是为什么您可以通过调用eval()来关闭dropout模块的原因。使用功能性辍学时,您的模型不知道它,因此它不会出现在任何摘要中。

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

    10-12 23:05