我应该在神经网络中的哪里放置辍学层?


64

关于在神经网络中的何处放置缺失层,是否有任何通用指南?


1
使用辍学正则化随机禁用隐藏层中神经元的某些部分。在Keras库,可以添加漏失任何隐藏层之后,并且可以指定一个丢包率,它决定禁用神经元的前一层中的百分比。
纠正

可以在这里进行业力耕种吗?
纠正

4
@redress谁耕种的,如何耕种?
弗兰克·德农库尔

您解决了这个答案吗?
布拉萨德'17

哪种类型的神经网络?CNN,RNN等?
韦恩

Answers:


34

Hinton(2012)提出弃用层的原始论文中,在输出之前,在每个完全连接的(致密)层上均使用了弃用(p = 0.5)。卷积层上没有使用它。这成为最常用的配置。

最近的研究表明,即使在较低的水平上(p = 0.1或0.2),在将压差应用于卷积层时也具有一定的价值。在每个卷积层的激活函数之后使用了Dropout:CONV-> RELU-> DROP。


那么应该将它们放置在所有层之后还是仅放置在具有非线性激活的层之后?例如,给定具有relu激活的2D卷积和最大池化层,则(2D)退出层是否应在卷积之后,或在最大池聚层之后或两者都立即进行,或者这没关系吗?
z0r18年

1
我已经更新了答案,以澄清在Park等人的工作中,辍学是RELU在每个CONV层之后应用的。我不认为他们研究了在最大池化层之后添加辍学的影响。
4Oh4

值得注意的是,在Hinton论文的第10页(1938年)中,他们写道,针对Google Street View数据集进行测试时,在卷积层上使用掉落可以减少分类错误。
Miki P


3

原始论文提出了输出之前在每个完全连接的(密集)层上使用的辍学层。卷积层上没有使用它。

当我们在输入图像的宽度和高度上滑动滤镜时,我们不得在卷积层之后使用滤除层,我们会生成一个二维激活图,该图会给出该滤镜在每个空间位置的响应。因此,当缺失层中和(使其为零)随机神经元时,就有可能在我们的训练过程中失去图像中非常重要的特征。


2

如果我没看错,您可以在每个单元格的非线性之后添加它:

layer_1 = (1/(1+np.exp(-(np.dot(X,synapse_0)))))
if(do_dropout):
    layer_1 *= np.random.binomial([np.ones((len(X),hidden_dim))],1-dropout_percent)[0] * (1.0/(1-dropout_percent))

第一行是激活函数,最后一行是将删除项添加到结果中。请参考这个博客。希望这可以帮助。

或者,您可以按照以下代码片段将其放置在输入嵌入中:

class BahdanauAttnDecoderRNN(nn.Module):
    def __init__(self, hidden_size, output_size, n_layers=1, dropout_p=0.1):
        super(AttnDecoderRNN, self).__init__()

        # Define parameters
        self.hidden_size = hidden_size
        self.output_size = output_size
        self.n_layers = n_layers
        self.dropout_p = dropout_p
        self.max_length = max_length

        # Define layers
        self.embedding = nn.Embedding(output_size, hidden_size)
        self.dropout = nn.Dropout(dropout_p)
        self.attn = GeneralAttn(hidden_size)
        self.gru = nn.GRU(hidden_size * 2, hidden_size, n_layers, dropout=dropout_p)
        self.out = nn.Linear(hidden_size, output_size)

    def forward(self, word_input, last_hidden, encoder_outputs):
        # Note that we will only be running forward for a single decoder time step, but will use all encoder outputs

        # Get the embedding of the current input word (last output word)
        word_embedded = self.embedding(word_input).view(1, 1, -1) # S=1 x B x N
        word_embedded = self.dropout(word_embedded)

        # Calculate attention weights and apply to encoder outputs
        attn_weights = self.attn(last_hidden[-1], encoder_outputs)
        context = attn_weights.bmm(encoder_outputs.transpose(0, 1)) # B x 1 x N

        # Combine embedded input word and attended context, run through RNN
        rnn_input = torch.cat((word_embedded, context), 2)
        output, hidden = self.gru(rnn_input, last_hidden)

        # Final output layer
        output = output.squeeze(0) # B x N
        output = F.log_softmax(self.out(torch.cat((output, context), 1)))

        # Return final output, hidden state, and attention weights (for visualization)
        return output, hidden, attn_weights

来源:https : //github.com/spro/practical-pytorch/blob/master/seq2seq-translation/seq2seq-translation.ipynb

从技术上讲,您可以在块的末尾添加辍学层,例如在卷积之后或在RNN编码之后。


GeneralAttn在哪里定义?
rafaelvalle 17/09/28
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.