Bırakma katmanlarını sinir ağında nereye yerleştirmeliyim?


65

Bir sinir ağında bırakma katmanlarının nereye yerleştirileceği hakkında genel bir kılavuz var mı?


1
Bırakma düzenli hale getirme özelliğini kullanmak, gizli bir katmandaki nöronların bir bölümünü rasgele devre dışı bırakır. Keras kütüphanesinde, herhangi bir gizli katmandan sonra bırakma ekleyebilir ve önceki katmandaki devre dışı bırakılmış nöronların yüzdesini belirleyen bir bırakma oranı belirleyebilirsiniz.
tazminat

karma tarıma izin verilir mi?
tazminat

4
@ redres kim çiftçilik ve nasıl?
Franck Dernoncourt

Bu cevabı çözdün mü?
Blaszard

Ne tür sinir ağları? CNN, RNN, diğer?
Wayne,

Yanıtlar:


34

Düşme katmanları öneren orijinal makalede, Hinton (2012) tarafından , çıktımdan önce tamamen bağlı (yoğun) katmanların her birinde bırakma (p = 0.5 ile) kullanılmıştır; evrişimli tabakalarda kullanılmamıştır. Bu en yaygın kullanılan konfigürasyon oldu.

Daha yeni araştırmalar , çok daha düşük seviyelerde olmasına rağmen, püskürtülen katmanlara da okulu bırakma uygulamasında bir değer göstermiştir: Her konvolüsyon tabakasının aktivasyon fonksiyonundan sonra bırakma kullanılmıştır: CONV-> RELU-> DROP.


Öyleyse, tüm katmanlardan sonra mı yoksa sadece doğrusal olmayan bir aktivasyona sahip olanlara mı yerleştirilmelidir? Örn., Bir reluaktivasyon içeren bir 2D konvolüsyonu ve ardından bir maksimum havuzlama tabakası verildiğinde, (2D) bırakma tabakası, evrişimden hemen sonra mı, yoksa maksimum havuzlama katmanından sonra mı, veya her ikisinden mi, yoksa fark etmiyor mu?
z0r eylül

1
Park ve arkadaşlarının çalışmalarında, ayrılmanın RELUher CONV katmanında uygulandığı açıklığa kavuşturulması için cevabı güncelledim . Maksimum havuzlama katmanlarının ardından bırakma eklemenin etkisini araştırdıklarına inanmıyorum.
044

Hinton gazetesinde, sayfa 10 (1938) 'de, Google Street View veri setine karşı test yapılırken evrimsel katmanlardaki düşüşü kullandıklarını, sınıflandırma hatasını azalttığını not etmek önemlidir.
Miki P

9

Her doğrusal projeksiyonun önünde. Bakınız Srivastava ve diğ. (2014) .


4
Diğer cevaplar bırakmanın nasıl uygulanacağını açıklamaktadır , ancak bu, bırakmanın nereye uygulanacağına dair OP sorusunu cevaplayan tek cevaptır .
stormont

3

Orijinal makale, çıktıdan önce tamamen birbirine bağlı (yoğun) tabakaların her birinde kullanılmış olan bırakma katmanları önermiştir; evrişimli tabakalarda kullanılmamıştır.

Konvolüsyonlu katmanın ardından bırakma katmanı kullanmamalıyız, filtreyi giriş görüntüsünün genişliği ve yüksekliği üzerine kaydırdıkça, her bir uzaysal konumda bu filtrenin yanıtlarını veren 2 boyutlu bir aktivasyon haritası üretiyoruz. Bırakma katmanı nötrleştirirken (sıfır yapar) rastgele nöronlar, eğitim sürecimizdeki bir görüntüde çok önemli bir özelliği kaybetme şansı yakalar.


2

Yanılmıyorsam, her hücrenin doğrusal olmayışından sonra ekleyebilirsiniz:

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))

İlk satır etkinleştirme işlevidir ve sonuncusu bırakma sonucuna ekliyor. Lütfen bu bloga bakın . Bu yardımcı olur umarım.

Veya bu kod parçasında olduğu gibi giriş gömme içine yerleştirebilirsiniz:

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

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

Teknik olarak, bırakma katmanını bir bloğun sonuna, örneğin evrişimden sonra veya RNN kodlamasından sonra ekleyebilirsiniz.


GeneralAttn nerede tanımlanır?
rafaelvalle
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.