Dropout? Dropwhat?


Dropout

一般出现在全连接层后,防止模型过拟合。

神经网络的输入单元是否归零服从伯努利分布,并以概率p随机地将神经网络的某个单元的输出(对下一层而言是输入)置为0。

在训练中,每个隐层的神经元先乘以概率P,然后再进行激活。

在测试中,所有的神经元先进行激活,然后每个隐层神经元的输出乘P。

class NeuralNet(nn.Module):
	def __init__(self, input_size, hidden_size, num_classes):
        super(NeuralNet, self).__init__()
        self.fc1 = nn.Linear(input_size, hidden_size) 
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(hidden_size, num_classes) 
        self.dropout = nn.Dropout(p=0.5) # dropout训练
	
    def forward(self, x):
        out = self.fc1(x)
        out = self.dropout(out)
        out = self.relu(out)
        out = self.fc2(out)
        return out
    
model = NeuralNet(input_size, hidden_size, num_classes)

启用Batch Normalization 和 Dropout

需要在训练时添加model.train()。model.train()是保证BN层能够用到每一批数据的均值和方差。对于Dropout,model.train()是随机取一部分网络连接来训练更新参数。

不启用 Batch Normalization 和 Dropout

如果模型中有BN层(Batch Normalization)和Dropout,在测试时添加model.eval()。model.eval()是保证BN层能够用全部训练数据的均值和方差,即测试过程中要保证BN层的均值和方差不变。对于Dropout, model.eval()是利用到了所有网络连接,即不进行随机舍弃神经元。

训练完train样本后,生成的模型model要用来测试样本。在model(test)之前,需要加上model.eval(),否则的话,有输入数据,即使不训练,它也会改变权值。这是model中含有BN层和Dropout所带来的的性质。


Author: cipher
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source cipher !