pytoch dropoutの使い方

2398 ワード

リンク:https://www.zhihu.com/question/67209417/answer/302434279  
踏んだばかりの穴が、もう少しで泣きそうになりましたTT.---百個のdropoutを加えたのに、どうして全然変わってないですか?
F.dropout(nn.functional.dropout)を使用する場合、そのtriningという状態パラメータを設定する必要があります。モデル全体と一致します。
たとえば:
 
  • Class DropoutFC(nn.Module):
  • def __init__(self):
  • super(DropoutFC, self).__init__()
  • self.fc = nn.Linear(100,20)
  •  
  • def forward(self, input):
  • out = self.fc(input)
  • out = F.dropout(out, p=0.5)
  • return out
  •  
  • Net = DropoutFC()
  • Net.train()
  •  
  • # train the Net
  • このコードのF.dropoutは実際には何の役にも立たないです。そのtrining状態は常にデフォルト値Falseです。F.dropoutは参照の外部関数に相当します。モデル全体のtrining状態が変化してもF.dropoutという関数のtrining状態が変化しないので、ここのout=F.dropout(out)はReout=Reoutです。 https://github.com/pytorch/pytorch/blob/master/torch/nn/functional.py#L535
     
    正確な使用方法は、モデル全体のtrining状態パラメータをdropout関数に導入する。
     
  • Class DropoutFC(nn.Module):
  • def __init__(self):
  • super(DropoutFC, self).__init__()
  • self.fc = nn.Linear(100,20)
  •  
  • def forward(self, input):
  • out = self.fc(input)
  • out = F.dropout(out, p=0.5, training=self.training)
  • return out
  •  
  • Net = DropoutFC()
  • Net.train()
  •  
  • # train the Net
  •  
    またはnn.Dropout()(nn.Dropout()を直接使用して、実際にはF.dropoutに対するパッケージであり、self.triningも入ってきました。)Ref: https://github.com/pytorch/pytorch/blob/master/torch/nn/modules/dropout.py#L46
     
  • Class DropoutFC(nn.Module):
  • def __init__(self):
  • super(DropoutFC, self).__init__()
  • self.fc = nn.Linear(100,20)
  • self.dropout = nn.Dropout(p=0.5)
  •  
  • def forward(self, input):
  • out = self.fc(input)
  • out = self.dropout(out)
  • return out
  • Net = DropoutFC()
  • Net.train()
  •